4

AES CBC no padを使用してjavascriptで文字列を暗号化し、IVと暗号化されたデータをHTTP経由でHEXとして渡し、サーバー側でjavascriptで復号化する必要があります。

hurlant AS3 ライブラリを使用して暗号化されたデータを正しく復号化できるという点で、復号化機能は機能します。ただし、以下の暗号化は機能していません。復号化機能を使用して結果を復号化することも、 http ://crypto.hurlant.com/demo/ の hurant デモを使用して復号化することもできません。

この例では、実際のデータの代わりにメッセージとして「1234」を使用しています。

些細なケースしかないクイックスタートガイドを超えて、このライブラリまたはその機能のドキュメントを検索しても見つかりませんでした。そのため、すべては試行錯誤によるものです。以下の何百ものバリエーションを試しました。

IV を Hex として生成した例: "15ae89d17f632d21f0cda04734d38694"

生成された暗号化データの例: HEX: "44ddf295"

メッセージの例: 「15ae89d17f632d21f0cda04734d3869444ddf295」

私のencrypt()関数の何が問題なのか誰にもわかりますか?

// this function doesnt work - the resultant message (which is 
//       IV+Ecypted text all as HEX cannot be decrypted.
function encrypt() {
    var key = CryptoJS.enc.Hex.parse('48656c6c6f2c20576f726c6421888888');
    var IVLEN = 16; // Im guessing this is 16 bytes.
    var iv= CryptoJS.lib.WordArray.random(IVLEN);
    var encrypted;
    var message;

    encrypted = CryptoJS.AES.encrypt("1234", key, { iv: iv, padding: CryptoJS.pad.NoPadding,  mode: CryptoJS.mode.CBC });

    message = CryptoJS.enc.Hex.stringify(iv) + CryptoJS.enc.Hex.stringify(encrypted.ciphertext);

    var test = decrypt(message);  // throws a malformed UTF-8 exception

    alert (test); // should alert "1234"

    return message;

}

// this function works perfectly with data generated using HURLANT crypto libs.
function decrypt(data) {
    var key = CryptoJS.enc.Hex.parse('48656c6c6f2c20576f726c6421888888');
    var ivHexStr, iv;
    var encMessageHexStr;
    var IVLEN = 32;  // This is 16 bytes, as one byte is 2 Hex chars.
    var encrypted = {};
    var decrypted;
    var result;

    ivHexStr = data.substring(0,IVLEN);
    encMessageHexStr = data.substring(IVLEN);

    iv = CryptoJS.enc.Hex.parse(ivHexStr);
    encrypted.key        = key;
    encrypted.iv         = iv;
    encrypted.ciphertext = CryptoJS.enc.Hex.parse(encMessageHexStr);

    decrypted = CryptoJS.AES.decrypt(encrypted, key, { iv: iv, padding: CryptoJS.pad.NoPadding, mode: CryptoJS.mode.CBC });

    result = CryptoJS.enc.Utf8.stringify(decrypted);

    return(result);
}; //decrypt()
4

1 に答える 1

1

CBC モードではパディングが必要です。CFB も OFB もパディングを必要としません。

CryptoJS は次のモードをサポートしています。

  • CBC (デフォルト)
  • CFB
  • クリック率
  • OFB
  • ECB

また、CryptoJS は次のパディング スキームをサポートしています。

  • pkcs7 (デフォルト)
  • ISO97971
  • AnsiX923
  • ISO10126
  • ゼロパディング
  • パディングなし
于 2013-03-21T12:46:10.353 に答える