9

暗号化

暗号化は、Stanford Javascript Crypto Library (SJCL) を使用して行われます。以下は、2 つの部分に分かれた完全な暗号化の例です。1 つ目は、 PBKDF2を使用したパスワード ベースのキー派生についてです。2 番目の部分では、派生キーと初期化ベクトル(IV) を使用して実際の暗号化が行われます。C# の復号化ソリューションを提供しやすいように、salt と IV はハードコードされていることに注意してください。

// Key derivation…
var password = "password";
var salt = sjcl.codec.hex.toBits(
    "5f9bcef98873d06a" // Random generated with sjcl.random.randomWords(2, 0);
);                     // Hex encoded with sjcl.codec.hex.toBits(randomSalt);
var iterations = 1000;
var keySize = 128;
var encryptionKey = sjcl.misc.pbkdf2(password, salt, iterations, keySize);

// Encryption…
var blockCipher = new sjcl.cipher.aes(encryptionKey);
var plainText = sjcl.codec.utf8String.toBits("secret");
var iv = sjcl.codec.hex.toBits("8291ff107e798a29");
var adata = ""; // What is adata?
var tag = 64; // What is tag? I think it is authentication strength.
var cipherText = sjcl.mode.ccm.encrypt(blockCipher, plainText, iv, adata, tag);

変数の値encryptionKey:

  • SJCL ビット配列:[ -74545279, -553931361, -1590906567, 1562838103 ]
  • 16 進エンコード:fb8e8781defbad9fa12cb1395d270457
  • Base64エンコード:+46Hgd77rZ+hLLE5XScEVw==

変数の値iv:

  • SJCL ビット配列:[ -2104361200, 2121894441 ]
  • 16 進エンコード:8291ff107e798a29
  • Base64 エンコード:gpH/EH55iik=

変数の値cipherText:

  • SJCL ビット配列:[ 1789401157, -1485204800, -440319203, 17593459146752 ]
  • 16 進エンコード:6aa81845a77992c0e5c1431d4be2
  • Base64 エンコード:aqgYRad5ksDlwUMdS+I=

質問

質問は:

Bouncy Castleで暗号文を解読するにはどうすればよいですか?


以下の jbtule の助けを借りた後の実際の復号化の例

using Org.BouncyCastle.Crypto.Engines;
using Org.BouncyCastle.Crypto.Modes;
using Org.BouncyCastle.Crypto.Parameters;

namespace SjclHelpers {

    public static class Encryption {

        /// <summary>Decrypts the cipher text.</summary>
        /// <param name="cipherText">The cipher text.</pararesm>
        /// <param name="key">The encryption key.</param>
        /// <param name="initializationVector">The IV.</param>
        /// <returns>The decrypted text.</returns>
        public static byte[] Decrypt(this byte[] cipherText,
            byte[] key, byte[] initializationVector) {
            var keyParameter = new KeyParameter(key);
            const int macSize = 64;
            var nonce = initializationVector;
            var associatedText = new byte [] {};
            var ccmParameters = new CcmParameters(
                keyParameter,
                macSize,
                nonce,
                associatedText);
            var ccmMode = new CcmBlockCipher(new AesFastEngine());
            var forEncryption = false;
            ccmMode.Init(forEncryption, ccmParameters);
            var plainBytes =
                new byte[ccmMode.GetOutputSize(cipherText.Length)];
            var res = ccmMode.ProcessBytes(
                cipherText, 0, cipherText.Length, plainBytes, 0);
            ccmMode.DoFinal(plainBytes, res);
            return plainBytes;
        }}}

を取得しSystem.ArgumentExceptionます。バイト配列の1つが短すぎると不平を言っていると思います。

Boncy Castle は、NuGet サイト ( http://nuget.org/packages/BouncyCastle ) で入手できます。


AES/CCM 復号化ソリューションは、 CodePlexのSjclHelpersプロジェクトの一部となり、NuGet パッケージとしてリリースされます。

4

2 に答える 2

2

私が見ることができるものから:

  1. ノンスはIVでなければなりません。
  2. 通常はAeadParameters代わりに使用しますCcmParametersが、それでも問題ない場合があります。確かに、ParametersWithIVでラップしないでください。
  3. associateTextCCMは、必要に応じて暗号化されたデータに関連する暗号化されていないデータを認証できるため、オプションです。sjclと同じである必要があり、adataトランスポートの方法は何でもかまいませんので、おそらく引数が必要です。
  4. それは正しいですtagmacSize、同じです。
  5. DoFinalはccmMode.DoFinal(plainBytes, res);
  6. セキュリティのため、復号化後macSize / 8、cipherTextの最後の()バイトを比較しccmMode.GetMac()て認証を確認する必要があります。
  7. var plainBytes = new byte[ccmMode.GetOutputSize(cipherText.Length)]
于 2012-05-01T15:30:09.603 に答える
1

Bouncy Castle で sjcl JSON を復号化することはできません。SJCL の事前計算されたテーブルは、Bouncy Castle のものとは異なるためです。ライブラリを自作しました。まだ復号化ソリューションを探している場合は、試してみてください。 https://github.com/mebius1080p/SJCLDecryptor

于 2013-06-03T07:35:53.617 に答える