第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何在 Go 中解密使用 aes-js 包在 vuejs 中加密的密文

如何在 Go 中解密使用 aes-js 包在 vuejs 中加密的密文

Go
慕勒3428872 2022-04-26 14:35:44
Vuejs 中的代碼 -var message = "Hello World"var keyBytes = aesjs.utils.utf8.toBytes("akey123")var iv = CryptoJS.lib.WordArray.random(8).toString()var ivBytes =  aesjs.utils.utf8.toBytes(iv)var messageBytes = aesjs.utils.utf8.toBytes(message);var aesCfb = new aesjs.ModeOfOperation.cfb(keyBytes, ivBytes);var encryptedBytes = aesCfb.encrypt(messageBytes);var encryptedHex = aesjs.utils.hex.fromBytes(encryptedBytes);我發(fā)送給 GO 的數(shù)據(jù) -{"iv": iv, "cipher": encryptedHex}GO中的代碼func DecryptCipher(iv, cipher string) {    key := []byte("akey123")    iv := []byte(iv)    cipherText, _ := hex.DecodeString(cipher)    block, err := aes.NewCipher(key)    if err != nil {        log.Println(err)    }    cfb := cipher.NewCFBDecrypter(block, iv)    cfb.XORKeyStream(cipherText, cipherText)    fmt.Println("data", string(cipherText))}預(yù)期輸出:“Hello World”實(shí)際輸出:@?Sa 1???Ig{?有人可以幫助我并告訴我上面的代碼中缺少什么。先感謝您!
查看完整描述

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ù)。

  • [8]中討論了 CFB 模式,第二個(gè)答案?jìng)?cè)重于不同的 CFB 變體[9]。


查看完整回答
反對(duì) 回復(fù) 2022-04-26
  • 1 回答
  • 0 關(guān)注
  • 238 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)