CryptoJS 加密 Go 解密
CryptoJS encrypt Go decrypt
我有以下 Go 代码
ciphertext := "Zff9c+F3gZu/lsARvPhpMau50KUkMAie4j8MYfb12HMWhkLqZreTk8RPbtRB7RDG3QFw7Y0FXJsCq/EBEAz//XoeSZmqZXoyq2Cx8ZV+/Rw="
decodedText, _ := base64.StdEncoding.DecodeString(ciphertext)
decodedIv, _ := base64.StdEncoding.DecodeString("u9CV7oR2w+IIk8R0hppxaw==")
newCipher, _ := aes.NewCipher([]byte("~NB8CcOL#J!H?|Yr"))
cfbdec := cipher.NewCBCDecrypter(newCipher, decodedIv)
cfbdec.CryptBlocks(decodedText, decodedText)
data, _ := base64.StdEncoding.DecodeString(string(decodedText))
println(string(data))
输出为{"data":{"value":300}, "SEQN":700 , "msg":"IT WORKS!!"
它使用以下 CryptoJS
加密
function encrypt(message, key) {
let keyHex = CryptoJS.enc.Hex.parse(parseToHex(key))
let iv = CryptoJS.lib.WordArray.random(128 / 8);
let wordArray = CryptoJS.enc.Utf8.parse(message);
let base64 = CryptoJS.enc.Base64.stringify(wordArray);
let encrypted = CryptoJS.AES.encrypt(base64, keyHex, { iv: iv });
return {
cipher: encrypted.ciphertext.toString(CryptoJS.enc.Base64),
iv: CryptoJS.enc.Base64.stringify(iv),
length: base64.length,
size: encrypted.ciphertext.sigBytes,
}
}
并且可以用
解密
function decrypt(message, key, iv) {
let ivEX = CryptoJS.enc.Hex.parse(decodeToHex(iv));
let keyEX = CryptoJS.enc.Hex.parse(parseToHex(key));
let bytes = CryptoJS.AES.decrypt(message, keyEX , { iv: ivEX});
let plaintext = bytes.toString(CryptoJS.enc.Base64);
return decodeToString(decodeToString(plaintext));
}
输出是{"data":{"value":300}, "SEQN":700 , "msg":"IT WORKS!!" }
——这是正确的输出
为什么 Go 有不同的输出?
请检查您的错误。总是
illegal base64 data at input byte 75
https://play.golang.org/p/dRLIT51u4I
更具体地说,第 75 个字节的值是 5
,这超出了 base64 可用的字符范围。在 ascii 中,它是 ENQ(查询)字符。至于为什么这会出现在你最终的 base64 字符串中,我无法理解。
编辑:确定找到了问题。无论出于何种原因,末尾的 base64 填充字符 =
被解密为包含值 5
的 5 个连续字节。这是一个 playground link 显示它已修复。 https://play.golang.org/p/tf3OZ9XG1M
编辑:根据马特的评论。我更新了修复函数以简单地删除所有 PKCS7 块填充并使用 RawStdEncoding
作为最后一个 base64 解码。现在这应该是一个合理的修复。
我有以下 Go 代码
ciphertext := "Zff9c+F3gZu/lsARvPhpMau50KUkMAie4j8MYfb12HMWhkLqZreTk8RPbtRB7RDG3QFw7Y0FXJsCq/EBEAz//XoeSZmqZXoyq2Cx8ZV+/Rw="
decodedText, _ := base64.StdEncoding.DecodeString(ciphertext)
decodedIv, _ := base64.StdEncoding.DecodeString("u9CV7oR2w+IIk8R0hppxaw==")
newCipher, _ := aes.NewCipher([]byte("~NB8CcOL#J!H?|Yr"))
cfbdec := cipher.NewCBCDecrypter(newCipher, decodedIv)
cfbdec.CryptBlocks(decodedText, decodedText)
data, _ := base64.StdEncoding.DecodeString(string(decodedText))
println(string(data))
输出为{"data":{"value":300}, "SEQN":700 , "msg":"IT WORKS!!"
它使用以下 CryptoJS
加密function encrypt(message, key) {
let keyHex = CryptoJS.enc.Hex.parse(parseToHex(key))
let iv = CryptoJS.lib.WordArray.random(128 / 8);
let wordArray = CryptoJS.enc.Utf8.parse(message);
let base64 = CryptoJS.enc.Base64.stringify(wordArray);
let encrypted = CryptoJS.AES.encrypt(base64, keyHex, { iv: iv });
return {
cipher: encrypted.ciphertext.toString(CryptoJS.enc.Base64),
iv: CryptoJS.enc.Base64.stringify(iv),
length: base64.length,
size: encrypted.ciphertext.sigBytes,
}
}
并且可以用
解密function decrypt(message, key, iv) {
let ivEX = CryptoJS.enc.Hex.parse(decodeToHex(iv));
let keyEX = CryptoJS.enc.Hex.parse(parseToHex(key));
let bytes = CryptoJS.AES.decrypt(message, keyEX , { iv: ivEX});
let plaintext = bytes.toString(CryptoJS.enc.Base64);
return decodeToString(decodeToString(plaintext));
}
输出是{"data":{"value":300}, "SEQN":700 , "msg":"IT WORKS!!" }
——这是正确的输出
为什么 Go 有不同的输出?
请检查您的错误。总是
illegal base64 data at input byte 75
https://play.golang.org/p/dRLIT51u4I
更具体地说,第 75 个字节的值是 5
,这超出了 base64 可用的字符范围。在 ascii 中,它是 ENQ(查询)字符。至于为什么这会出现在你最终的 base64 字符串中,我无法理解。
编辑:确定找到了问题。无论出于何种原因,末尾的 base64 填充字符 =
被解密为包含值 5
的 5 个连续字节。这是一个 playground link 显示它已修复。 https://play.golang.org/p/tf3OZ9XG1M
编辑:根据马特的评论。我更新了修复函数以简单地删除所有 PKCS7 块填充并使用 RawStdEncoding
作为最后一个 base64 解码。现在这应该是一个合理的修复。