Techioz Blog

Rubyのsjcl.jsで作成したAESの復号化

概要

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

私が達成しようとしているのは、Stanford Javascript Crypto Library (sjcl) の結果を Ruby で復号化することです。または、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 復号化ライブラリだけでは十分ではないでしょうか?

解決策

以下については、事前にネゴシエートする (またはハードコードする) ことはできません。

以下では、事前にネゴシエートする (またはハードコードする) ことができます。実際、認証されずに送信され、セキュリティが期待される場合は、これらの値をサーバー暗号化 API に組み込むべきではありません。クライアントに基づいて変更可能にしたい場合、adata は v、iter、または ks にとって悪い場所ではありません。

Ruby では、OpenSSL ライブラリを使用すると、OpenSSL が AES-128-CCM で OpenSSL::Cipher.ciphers をチェックすることをサポートしている限り、機能するようです。また、pbkdf2 を使用したキーの生成はサポートされていますが、sjcl との互換性を保つために Sha256 ダイジェストを使用する必要があり、これも openssl のバージョンに依存します。