[英]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!!" }
{"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個連續字節。 這是一個游樂場鏈接,顯示已修復。 https://play.golang.org/p/tf3OZ9XG1M
編輯:根據馬特的評論。 我更新了修復功能,以簡單地刪除所有PKCS7塊填充, RawStdEncoding
最后的base64解碼使用RawStdEncoding
。 現在,這應該是一個合理的解決方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.