CryptoJS加密Go解密 [英] CryptoJS encrypt Go decrypt
问题描述
ciphertext:=Zff9c + F3gZu / lsARvPhpMau50KUkMAie4j8MYfb12HMWhkLqZreTk8RPbtRB7RDG3QFw7Y0FXJsCq / EBEAz // XoeSZmqZXoyq2Cx8ZV + / Rw =
decodedText,_:= base64.StdEncoding.DecodeString(ciphertext)
decodeIv,_:= 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))
输出为 使用以下CryptoJS进行加密 可以用 输出为 为什么Go有不同的输出? 请检查你的错误。总是 https://play.golang.org/p/dRLIT51u4I 更具体地说,字节75中的值是 编辑:确定发现问题。无论什么原因,最后的base64填充字符 编辑:按照matt的评论。我更新了修复功能,以便删除所有PKCS7块填充,并使用 I have the following Go code The output is It's encrypted with the following CryptoJS And can be decrypted with The output is Why Go has different output? Check your errors please. ALWAYS https://play.golang.org/p/dRLIT51u4I More specifically, the value at byte 75 is EDIT: OK found the issue. For whatever reason, the base64 padding character EDIT: As per matt's comments. I updated the fix function to simply remove all the PKCS7 block padding and use 这篇关于CryptoJS加密Go解密的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋! {data:{value:300},SEQN:700,msg:IT WORKS !!$ c
函数加密(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。长度,
大小:encrypted.ciphertext.sigBytes,
}
}
解密函数解密(message,key,iv){
let ivEX = CryptoJS .enc.Hex.parse(decodeToHex(IV));
let keyEX = CryptoJS.enc.Hex.parse(parseToHex(key));
让bytes = CryptoJS.AES.decrypt(message,keyEX,{iv:ivEX});
let plaintext = bytes.toString(CryptoJS.enc.Base64);
return decodeToString(decodeToString(plaintext));
}
{data:{值:300},SEQN:700,msg:IT WORKS !! }
- 这是正确的输出
输入字节75处的非法base64数据
5
,它超出了base64可用字符的范围。在ascii中,它是ENQ(查询)字符。至于为什么这最终在您的最终base64字符串超出了我。
=
被解密为包含值 5
的5个连续字节。这是一个操场链接,显示它是固定的。 https://play.golang.org/p/tf3OZ9XG1M
RawStdEncoding
来进行最后的base64解码。这应该是一个合理的解决方案。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!!"
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!!" }
- this is the correct outputillegal base64 data at input byte 75
5
, which is out of the range of characters available to base64. In ascii, it is the ENQ (enquiry) character. As to why this ends up in your final base64 string is beyond me.=
at the end is being decrypted as 5 consecutive bytes containing the value 5
. Here is a playground link that shows it fixed. https://play.golang.org/p/tf3OZ9XG1MRawStdEncoding
for the last base64 decode. This should now be a reasonable fix.