楕円lifted ElGamal暗号の加法準同型性とWasmによる実装例
初めに
前回、楕円曲線を使った公開鍵暗号楕円ElGamal暗号を紹介しました。
この方式は暗号化したい数値をそのまま使えず、楕円曲線の点に埋め込む必要がありました。lifted ElGamal暗号はその問題を改善する方法の一つです。
その方式とlifted ElGamal暗号が持つ加法性について紹介し、WebAssembly(Wasm)によるサンプルを試します。
楕円ElGamal暗号の復習
暗号文
楕円lifted ElGamal暗号
説明の前に一つ記号を導入します。
楕円lifted ElGamal暗号の鍵生成はElGamal暗号と同じです。
整数
暗号文
楕円lifted ElGamal暗号の妥当性
まずはここで疑問に思うでしょう。暗号の安全性のためにDLP困難な群を使っているのに、復号時にDLPを解くのはナンセンスでは?
それは当然の疑問なのですが、
楕円lifted ElGamal暗号は復号可能な平文の範囲が狭い、復号時に小さなDLPを解かなければならないという制約があるのですが、その代わりに興味深い性質を持っています。
加法準同型
暗号文
このようにして作った
更に
したがって、暗号文の空間は(※)を加算、
このような性質を加法準同型といいます。乱数
Wasmによる実装例
数式ばかりでは飽きるのでlifted ElGmal暗号を利用できるshe-wasmで試してみましょう(npmパッケージもあります)。
ブラウザだけで試すには、デモページ「暗号化したまま計算できる暗号技術」を開き、[F12]キーを押して開発ツールの[コンソール]を開きます。
秘密鍵と公開鍵の生成
まず
const sk = new she.SecretKey()
sk.setByCSPRNG()
で秘密鍵を初期化します。
そして、
const pk = sk.getPublicKey()
で対応する公開鍵を得ます。
中身はserializeToHexStr
で確認できます(値は毎回変わります)。
>sk.serializeToHexStr()
"d5d417372745699f99558aafcd05b6c7c1416c05c17f693c5e3f95a6a29be102014cd1f0bdf8793edec3b9b243c5cc8a26533cd37dfa5159711f991a1058521b"
>pk.serializeToHexStr()
"a63f0a93a1a7d060209133eff5a470c3ec4ee10351752cb4dbf2a38185ca291e621003da80e166783c641925e852fa4cd267ea4019a608b02e09dcdb00b7941887b74b9d90b88eccfbf1396f195e3719b12d61ce5aab19b358dee6a51b6a5f96"
暗号化と復号
公開鍵pk
で暗号化します。G1
という巡回群に対する楕円lifted ElGamal暗号なので
c1 = pk.encG1(12)
です(デモなので小さな値しか扱えません)。中身はsk
, pk
と同様にserializeToHexStr()
を使います。
c1.serializeToHexStr()
"95eef57f92641fd158036d98b91d2980b1e0ad226bf8fdfa8e9b6ce8c3a98b8fb4799bfef56782ca398e1bc3b3fdb8c4a06426eeb716b3b5b58ee524cbdfeb08"
秘密鍵`skで復号します。
sk.dec(c1)
12
元の値に戻りました。
暗号文の加算
もう1個暗号文を作ります。
c2 = pk.encG1(9)
暗号文c1
とc2
を足しましょう。
c = she.add(c1, c2)
復号します。
>sk.dec(c)
21
結果は12+9=21になり、加法準同型性を確認できました。詳しい使い方はshe-APIにあるので興味ある方はご覧ください。
まとめ
楕円lifted ElGamal暗号と、その加法準同型暗号性を紹介しました。暗号文同士の足し算ができると、それだけでもいろいろな応用が考えられています。また紹介しましょう。
おまけ(平文空間と暗号文空間の対応)
平文空間と暗号文空間の対応を少し詳しく説明します。
平文空間は0以上r未満の整数全体
任意の
なぜなら
次に、
次に暗号文空間
と式変形します。これは「
暗号文同士を足したら、元の平文の和の暗号文になる準同型性は
は
Discussion