6

こんにちは。クライアント側に、暗号化されたデータと同じチャネルを介して転送されないキーがあると仮定しましょう。

私が達成しようとしているのは、RubyのStanford Javascript Crypto Library(sjcl)の結果を復号化することです。または、AESをサポートする暗号ライブラリを備えた他の言語での一般化。

これが私がjavascriptでやっていることです:

sjcl.encrypt('stack-password', 'overflow-secret')

そして、これは私が見返りに得るものです:

{
  "iv": "Tbn0mZxQcroWnq4g/Pm+Gg",
  "v": 1,
  "iter": 1000,
  "ks": 128,
  "ts": 64,
  "mode": "ccm",
  "adata": "",
  "cipher": "aes",
  "salt": "pMQh7m9Scds",
  "ct": "H6JRpgSdEzKUw2qEO1+HwIzAdxGTgh0"
}

だから私が実際に求めているのは、秘密のサーバー側を復号化するために必要なこれらのパラメーターのどれ(サーバーがすでに「stack-password」キーを持っていると仮定)、そしてどのライブラリを使用する必要があるかです。AES復号化ライブラリが十分ではない可能性がありますか?

4

3 に答える 3

9

以下は、事前に交渉することはできません(またはハードコーディングすることはできません)。

以下で、事前に交渉する(またはハードコーディングする)ことができます。実際、認証されていない状態で送信され、セキュリティが期待される場合は、これらの値をサーバー暗号化APIにプラグインしないでください。、、またはクライアントに基づいて変更可能にしたい場合は、悪い場所ではありませんadataviterks

  • iterPbkdf2の反復。これは、パスワードのブルートフォースを遅くするのに十分な高さである必要があります。将来、ハードウェアの速度に合わせて変更する必要があります。
  • ks:keysizeは、 Pbkdf2で生成するキーのサイズを知るために、将来のセキュリティの量に応じて変更する必要があります
  • ts:tagsizeは、暗号文の一部である認証タグのサイズを確認します
  • cipher:AESのみをサポートする場合は、想定することができます。
  • mode:想定以上にAES-CCMのみをサポートする場合。
  • v:将来、想定できるよりも1つのバージョンのsjclのみをサポートする場合。

ルビーでは、OpenSSLライブラリAES-128-CCM puts OpenSSL::Cipher.ciphersを使用すると、OpenSSLがチェックをサポートしている限り機能するようです。また、 pbkdf2を使用したキーの生成をサポートしていますが、sjclと互換性を持たせるには、Sha256ダイジェストを使用する必要があります。sjclは、opensslのバージョンによって異なります。

于 2012-11-26T17:37:13.427 に答える
3

Googleからここに来る人のために、私はsjclライブラリを使用して、AppceleratorのTitaniumで暗号化し、Ruby/Railsで復号化することができました。

暗号化(javascript):

var data = SJCL.encrypt('your key here', 
                        'plain text', 
                        { mode: 'gcm', 
                          iv: SJCL.random.randomWords(3, 0) });

重要な点は、より小さなIVを使用することです。

復号化(ルビー):

def self.decrypt(h)
  h = HashWithIndifferentAccess.new(JSON.parse(h))

  key = OpenSSL::PKCS5.pbkdf2_hmac('your key here', Base64.decode64(h[:salt]), 1000, h[:ks]/8, 'SHA256')

  puts "Key: #{key.unpack('H*')}"

  puts "Salt: #{Base64.decode64(h[:salt]).unpack('H*')}"

  c = OpenSSL::Cipher.new("#{h[:cipher]}-#{h[:ks]}-#{h[:mode]}")

  c.decrypt

  c.key = key

  c.iv = Base64.decode64(h[:iv])

  puts "IV: #{Base64.decode64(h[:iv]).unpack('H*')}"

  c.auth_data = ""

  c.update(Base64.decode64(h[:ct]))
end
于 2014-12-03T23:55:54.527 に答える
1

あるいは、SJCLの純粋なRubyへの翻訳を書きました(少なくともCCMの部分については)。これにはOpenSSLの更新は必要ありませんが、少し遅くなります。

https://github.com/mdp/sjcl_rbで見つけることができます

お役に立てれば

于 2014-03-17T01:27:49.407 に答える