簡體   English   中英

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

[英]How to decrypt a ciphertext in Go which is encrypted in vuejs using aes-js package

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);

我發送到 GO 的數據 - {"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))
}

預期輸出:“Hello World” 實際輸出:@ Sa 1 Ig{

有人可以幫助我並告訴我我在上面的代碼中遺漏了什么。 先感謝您!

這兩個代碼中都有一些缺陷阻止了執行。 但是,由於兩者都在您的系統上運行,因此這些似乎是復制/粘貼錯誤:

  • 關鍵是太短了。 AES 需要 16、24 或 32 字節的密鑰大小。
  • Go-code 中存在關於ivcipher命名沖突。

在這些修復之后,程序被執行,但解密失敗。 問題是由不同的 CFB 變體引起的:在 aes-js-code 中,使用 CFB8,在 Go-code 中,CFB128。 這里的數字表示在移位寄存器[1]中移位的位數。

Go支持 CFB128,至少沒有更深的修改[2] [3]

aes-js 默認使用 CFB8。 但是,也可以使用 cfb 構造函數的第三個參數顯式定義 CFB 變體。 使用[4]可以更改 CFB128:

var segmentSize = 16;
var aesCfb = new aesjs.ModeOfOperation.cfb(keyBytes, ivBytes, segmentSize);

請注意,該值必須以字節為單位指定,即 1 對應 CFB8,16 對應 CFB128。

CFB是一種流密碼,可以對任意長度的明文進行加密,無需填充,密文長度等於明文長度[5] 不幸的是,aes-js [6] 中似乎有一個錯誤,它要求明文的長度是段大小的整數倍,即在 CFB128 的情況下為 16 字節。 否則,將顯示以下錯誤消息:

invalid plaintext size (must be segmentSize bytes)

即,如果使用的明文還沒有這個長度,則該錯誤需要顯式填充,盡管流密碼實際上不需要填充。

在這些問題的背景下,您可能想要使用不同的模式或不同的庫。

除了:

  • IV 不是問題的原因:在當前示例中,使用CryptoJS.lib.WordArray.random(8)創建隨機 8 個字節的WordArray並使用toString() 這個十六進制字符串是 Utf8 編碼的,因此在兩個代碼中是相同的。 盡管如此,評論中關於IV的評論當然是正確的。
  • aes-js 錯誤可能與過時的 Python 庫PyCrypto 中的相同錯誤有關,該錯誤已在后續PyCryptodome [7] 中修復。
  • [8]中討論了 CFB 模式,第二個答案側重於不同的 CFB 變體[9]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM