【问题标题】:Google CryptoJS AES result too long by 1 blockGoogle CryptoJS AES 结果太长了 1 个块
【发布时间】:2014-01-30 20:50:23
【问题描述】:

您好,我正在使用以下密码:“test”。 这会生成 AES 密钥:“9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08” IV 为 0。

作为测试,我尝试加密此密钥。由于我将始终使用 256 位的这个程序,我在 64 个十六进制字符(256 位)之后切割了加密密码。

但是,当我解密这个剪切密文时,我丢失了密钥的最后 16 个字符(128 位)。

这是一个 AES 块的大小,但我的密钥是 256 位,所以我觉得很奇怪。

我的问题是:为什么我的 AES 结果太长了?并且:我可以正确地做到这一点,所以它只有 64 个字符吗?

(CryptoJS 是用于 javascript 的谷歌加密库。)

function go(){
    var shakey = CryptoJS.SHA256(document.getElementById("t3").value); //Textbox key here.
    var hash =CryptoJS.enc.Hex.parse(CryptoJS.enc.Hex.stringify(shakey));
    var key = CryptoJS.enc.Hex.stringify(hash);
    var iv  = CryptoJS.enc.Hex.parse('00000000000000000000000000000000');

    var encHex = CryptoJS.enc.Hex.parse(document.getElementById("t1").value);

    var encrypted = CryptoJS.AES.encrypt(encHex, hash, { iv: iv }); //Textbox input here.

    var encObj = {ciphertext:CryptoJS.enc.Hex.parse(document.getElementById("t2").value)}; //Textbox decrypt here

    var decrypted = CryptoJS.AES.decrypt(encObj, hash, { iv: iv});

    var encResult = (encrypted.ciphertext+"").length > 63 ? (encrypted.ciphertext+"").substring(0,64) : (encrypted.ciphertext+"");

    document.getElementById("p1").innerHTML=encResult;
    document.getElementById("p2").innerHTML=decrypted;
}

【问题讨论】:

标签: javascript aes


【解决方案1】:

禁用填充using the NoPadding option。默认值为 PKCS#7 填充,它总是在加密前对明文应用填充。如果是一个完整的块,它将填充另一个完整的块,这使得结果比您预期的要长一个块。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-11
    • 2017-01-11
    • 2019-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多