encryption - CryptoJS 加密 Go 解密

标签 encryption go aes cryptojs

我有以下 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 有不同的输出?

最佳答案

请检查您的错误。总是

输入字节 75 处存在非法 Base64 数据

https://play.golang.org/p/dRLIT51u4I

更具体地说,字节 75 处的值是 5,它超出了 Base64 可用的字符范围。在 ascii 中,它是 ENQ(查询)字符。至于为什么这最终会出现在你的最终 Base64 字符串中,我无法理解。

编辑:好的找到了问题。无论出于何种原因,末尾的 base64 填充字符 = 都会被解密为包含值 5 的 5 个连续字节。这是一个 Playground 链接,显示它已修复。 https://play.golang.org/p/tf3OZ9XG1M

编辑:根据马特的评论。我更新了修复函数,以简单地删除所有 PKCS7 block 填充并使用 RawStdEncoding 进行最后的 Base64 解码。现在这应该是一个合理的修复。

关于encryption - CryptoJS 加密 Go 解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43103343/

相关文章:

encryption - s3cmd 的替代方案,用于在本地文件夹和具有加密功能的 Amazon s3 之间进行同步

go - 与公钥和私钥以及 JWT 相关的混淆

c# - 如何在 C# 中解密由 mcrypt 在 PHP 中加密的加密 MCRYPT_RIJNDAEL_256 值?

python - PyCrypto 导入 AES 问题

java - 如果我使用和不使用 IvParameterSpec 初始化 AES 密码,有什么区别吗

encryption - 如果攻击者有原始数据和加密数据,他们能确定密码吗?

java - Windows上使用openssl C++的RSA加密/解密错误

ios - 如何确定我的应用程序是否包含加密?

android - Gomobile库使用隐藏的API方法

function - 调用函数而不考虑其参数类型