1

私は次のようにC#でAESを使用して文字列を暗号化しています:

public static byte[] KeyFromString(string key, int keyBits)// keyBits is 128, 192, or 256.
{ 
    byte[] keyBinary = Encoding.UTF8.GetBytes(key);
    byte[] b = new byte[keyBits / 8];
    for (int i = 0, j = 0; i < b.Length && j < keyBinary.Length; i++, j++)
    {
        b[i] = keyBinary[j];
    }
    return b;
}

public static string encrypt(string key, string input)
{
    byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(input);
    byte[] keyBytes = KeyFromString(key, 256);
    byte[] encrypted = null;

    using (RijndaelManaged rijAlg = new RijndaelManaged())
    {
        rijAlg.Mode = CipherMode.CBC;
        rijAlg.Padding = PaddingMode.PKCS7;
        rijAlg.KeySize = 256;

        rijAlg.Key = keyBytes;
        rijAlg.IV = new byte[rijAlg.IV.Length]; //use empty IV

        using(var encryptor = rijAlg.CreateEncryptor())
        {
            encrypted = encryptor.TransformFinalBlock(inputBytes, 0, inputBytes.Length); 
        }
    }

    var res = Convert.ToBase64String(encrypted);
    return res;
}

そして、私はjavascriptで暗号化されたテキストを復号化したいので、crypto-jsで試しました:

var iv = [];
for (var i = 0 ; i < 16 ; i++) iv.push(0); //empty IV
var options = { keySize: 256 / 8, mode: CryptoJS.mode.CBC, iv: iv, padding: CryptoJS.pad.Pkcs7 };
var decrypted = CryptoJS.AES.decrypt(cipheredtext, key, options);
var decryptedText = decrypted.toString(CryptoJS.enc.Utf8);

私が得た復号化されたテキストは空です。エンコーディング、キーサイズなどを複数変更してみました

必要に応じて別のJavaScriptライブラリを使用できます

4

1 に答える 1

2

おそらくCryptoJSのドキュメントではこれについて十分に言及されていませんが、選択した暗号化アルゴリズム(あなたの場合はAES)が正確なキーとIVを使用するには、それらをCJSタイプのWordArrayとして渡す必要があります。

単語配列を取得する 1 つの方法は、選択したエンコーディングの parse メソッドを使用することです。

var iv = CryptoJS.enc.Hex.parse("HEX ENCODING OF THE KEY");
var key = CryptoJS.enc.Hex.parse("HEX ENCODING OF THE IV");

その後、あなたがすることはすべてうまくいくはずです。

誰かがこれが役に立つことを願っています 数日前にこれを理解するのにしばらく時間がかかりました.

于 2013-08-02T16:49:28.693 に答える