2012-06-21 17 views
7

私はサーバー側でECCを使ってデータを暗号化し、ブラウザで解読できる必要があるWebアプリケーションに取り組んでいます。 JSでこれが可能であることがわかった唯一のライブラリはSJCLです。しかし、SJCLのECCサポートは現時点では少し放棄されているように見えますが、私はforkを使用しています。これにはキーシリアル化のサポートとdemoがあります。RubyでJSとOpenSSLでSJCLを使った楕円曲線暗号

まず、私はJSでECC鍵のペアを生成します。それから私は、OpenSSLが理解できる形式にこの公開鍵を変換しようとしてい

{"point":[1110230655,241884220,775655552,-849225963,-883815628,-1984298210,-736346431,1387519594,-1810604283,-1235638489,1333314084,-1219216530,614640565,-1148742381,1038670260,1013716131,758346573,1162278003,1232401864,-1948620456,533899535,-1478577959,1853846180,-1553049184],"curve":384} 

keypair = sjcl.ecc.elGamal.generateKeys(384, 10); 
document.writeln(JSON.stringify(keypair.pub.serialize())); 

これは、のようなものを出力します。

ar = [1110230655,241884220,775655552,-849225963,-883815628,-1984298210,-736346431,1387519594,-1810604283,-1235638489,1333314084,-1219216530,614640565,-1148742381,1038670260,1013716131,758346573,1162278003,1232401864,-1948620456,533899535,-1478577959,1853846180,-1553049184] 

# ugly bit magic to somehow convert the above array into a proper byte array (in form of a string) 
kstr = [(ar.map { |i| (i>=0)?('0'*(8-i.to_s(16).length)+i.to_s(16)):("%08X" % (2**32-1+i+1)) }*'').upcase].pack("H*") 

# opening a public key generated with the openssl cli tool showed a structure like this: 
algokey = OpenSSL::ASN1::ObjectId 'id-ecPublicKey' 
algovalue = OpenSSL::ASN1::ObjectId 'secp384r1' 
algo = OpenSSL::ASN1::Sequence.new [algokey,algovalue] 
# for some reason OpenSSL seems to prepend 0x04 to all public keys 
key = OpenSSL::ASN1::BitString.new "\x04#{kstr}" 
root = OpenSSL::ASN1::Sequence.new [algo,key] 

pub = OpenSSL::PKey.read(root.to_der) 

これまでのコードは問題ありません。つまり、例外は発生しません。

しかし、両方のライブラリで共有秘密を生成すると、SJCLは96バイトの長さのタグを生成し、OpenSSLは48バイトを生成しました。

私の問題は、SJCLがプレーンなECDHを使用していないということです。これは、簡単なGoogle検索に基づいてECMQVのように見えるものを使用します。したがって、 'tag' SJCL出力はカーブ上の点(点のx座標とy座標、2 * 48バイト)でしたが、OpenSSL出力は共有秘密(ECDHで指定された点のx座標)でした。

私の問題は、OpenSSLでECMQVがサポートされているかどうかわかりません(正しい場合はいくつかの特許問題があります)。たとえあったとしても、ルビバインディングはそれをサポートしていないようです。

だから私の実際の質問は:

  • 私の調査結果は正しいの上に文書化されていますか?
  • もしそうなら、私はOpenSSLではなく、ECMQVをサポートする他のRubyライブラリを知っていますか?
+0

を書き込むことができますか?ブラウザーで(SSL/TLSを適用せずに)暗号を使用するほとんどのスキームは安全ではないことをご存知ですか? –

+0

まあ、devsに今は無意味であると尋ねるように思えます。 :)そして不安になることについて:私はそれを認識しています、私は貧しい人のSSLを実装しようとはしていません。それは、サーバーを侵害する侵入者からユーザーデータを保護することです。もちろん、侵入者はAJAXなどで秘密鍵のパスフレーズを送信するようにサーバー上のJSコードを変更できますが、それは別の話です。 – gsx1022

+0

これは別の話であるかどうかわかりませんが、セキュリティモデルの攻撃シナリオです。しかし、ユーザーデータをブラウザにローカルに保存すると、実際にはセキュリティが強化されます。ユーザーデータを保持するデータコンテナが盗まれます。 –

答えて

2

JavaScriptコードにElGamalが使用されているようです。私は実際にルビーの実装を見つけることができませんでしたが、代わりにCrypto++またはlibgcryptを使用し、いくつかのグルーコードを書いています。

シモンズ:代わりにそのkstr =ラインのSJCLの開発者に聞かないで、なぜ、あなたは、単にkstr = ar.pack 'N*'

+0

さて、私は数学を本当によくしていませんでした。それを指摘してくれてありがとう。私は暗号のラッパーを持って行かなければならないだろう。ファイン。 もう一度うわー。私はパックのためにルビーのドックを見なければならないように見えます。 – gsx1022

関連する問題