1 回答

TA貢獻(xiàn)1921條經(jīng)驗(yàn) 獲得超9個(gè)贊
兩個(gè)代碼中都有幾個(gè)缺陷會(huì)阻止執(zhí)行。但是,由于兩者都在您的系統(tǒng)上運(yùn)行,因此這些似乎是復(fù)制/粘貼錯(cuò)誤:
鑰匙太短了。AES 要求密鑰大小為 16、24 或 32 字節(jié)。
Go 代碼中存在關(guān)于
iv
和的命名沖突cipher
。
在這些修復(fù)之后,程序被執(zhí)行,但解密失敗。問題是由不同的 CFB 變體引起的:在 aes-js-code 中使用 CFB8,在 Go-code 中使用 CFB128。這里的數(shù)字表示移位寄存器[1]中移位的位數(shù)。
Go僅支持 CFB128,至少無需進(jìn)行更深入的修改[2] [3]。
aes-js 默認(rèn)使用 CFB8。但是,也可以使用 cfb 構(gòu)造函數(shù)的第三個(gè)參數(shù)顯式定義 CFB 變體。使用[4]可以更改 CFB128 :
var segmentSize = 16; var aesCfb = new aesjs.ModeOfOperation.cfb(keyBytes, ivBytes, segmentSize);
請(qǐng)注意,該值必須以字節(jié)為單位指定,即 1 對(duì)應(yīng) CFB8,16 對(duì)應(yīng) CFB128。
CFB是一種流密碼,因此可以對(duì)任意長度的明文進(jìn)行加密而無需填充,并且密文的長度等于明文的長度[5]。不幸的是,aes-js [6]中似乎存在一個(gè)錯(cuò)誤,它要求明文的長度是段大小的整數(shù)倍,即在 CFB128 的情況下為 16 個(gè)字節(jié)。否則,將顯示以下錯(cuò)誤消息:
invalid plaintext size (must be segmentSize bytes)
即,如果使用的明文還沒有這個(gè)長度,則該錯(cuò)誤需要顯式填充,盡管流密碼實(shí)際上不需要填充。
在這些問題的背景下,您可能想要使用不同的模式或不同的庫。
除了:
IV 不是問題的原因:在當(dāng)前示例中,
CryptoJS.lib.WordArray.random(8)
使用WordArray
隨機(jī) 8 個(gè)字節(jié)創(chuàng)建并編碼為長度為 16 個(gè)字節(jié)的十六進(jìn)制字符串,使用toString()
. 這個(gè)十六進(jìn)制字符串是 Utf8 編碼的,因此在兩個(gè)代碼中是相同的。盡管如此,評(píng)論中關(guān)于IV的評(píng)論當(dāng)然是正確的。aes-js 錯(cuò)誤可能與過時(shí)的 Python 庫PyCrypto中的相同錯(cuò)誤有關(guān),后者已在后續(xù)PyCryptodome [7]中修復(fù)。
- 1 回答
- 0 關(guān)注
- 238 瀏覽
添加回答
舉報(bào)