我在使用CryptoJS解密在Go lang中加密的文本时遇到问题。
这是Go代码:https : //play.golang.org/p/xCbl48T_iN
package main import ( "crypto/aes" "crypto/cipher" "encoding/base64" "fmt" ) func main() { key := []byte("1234567890123456") plaintext := []byte("text can be a random lenght") block, err := aes.NewCipher(key) if err != nil { panic(err) } // The IV needs to be unique, but not secure. Therefore it's common to // include it at the beginning of the ciphertext. // BTW (only for test purpose) I don't include it ciphertext := make([]byte, len(plaintext)) iv := []byte{'\x0f','\x0f','\x0f','\x0f','\x0f','\x0f','\x0f','\x0f','\x0f','\x0f','\x0f','\x0f','\x0f','\x0f','\x0f','\x0f'} stream := cipher.NewCTR(block, iv) stream.XORKeyStream(ciphertext, plaintext) // CTR mode is the same for both encryption and decryption, so we can // also decrypt that ciphertext with NewCTR. base := base64.StdEncoding.EncodeToString(ciphertext) fmt.Printf("encodedHEX: %x\n", ciphertext) fmt.Printf("encodedBASE: %s\n", base) plaintext2 := make([]byte, len(plaintext)) stream = cipher.NewCTR(block, iv) stream.XORKeyStream(plaintext2, ciphertext) fmt.Printf("decoded: %s\n", plaintext2) }
这是JS代码:http: //jsfiddle.net/Ltkxm64n/
var key = CryptoJS.enc.Hex.parse('31323334353637383930313233343536'); var iv = CryptoJS.enc.Hex.parse('0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f'); var encrypted = CryptoJS.AES.encrypt("text can be a random lenght", key, { mode: CryptoJS.mode.CTR, iv: iv }); console.log(encrypted.ciphertext.toString()); console.log(encrypted.toString()); var decrypted = CryptoJS.AES.decrypt(encrypted, key, { mode: CryptoJS.mode.CTR, iv: iv }); console.log(decrypted.toString(CryptoJS.enc.Utf8)); // text can be a random lenght
两者都可以很好地进行加密和解密,但是当我将base64密文从GO复制到JS(反之亦然)时,它不起作用。我还注意到js输出的第一部分与Go输出相同,但是js输出中的字节数比Go中的字节数多。
我的目的是对GO中的某些文本进行加密,然后将Base64密文发送到可以对其解密的JS。
谢谢
好的,这是您要解决的问题:
将无填充js添加到您的源列表中: http://crypto-js.googlecode.com/svn/tags/3.1/build/components/pad-nopadding.js
http://crypto-js.googlecode.com/svn/tags/3.1/build/components/pad-nopadding.js
加密/解密时,请指定参数: padding: CryptoJS.pad.NoPadding
padding: CryptoJS.pad.NoPadding
CTR模式不需要在加密前填充纯文本。 从多个AES块生成的密钥流在XORing之前被修整以匹配纯文本长度。 看起来CryptoJS xor会使用纯文本为其生成密钥流,但不会对其进行修整,因为CryptoJS生成的不带密文的长度padding: CryptoJS.pad.NoPadding总是16字节的倍数(恰好是AES块大小)。
xor
var key = CryptoJS.enc.Hex.parse('31323334353637383930313233343536'); var iv = CryptoJS.enc.Hex.parse('0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f'); var encrypted = CryptoJS.AES.encrypt("text can be a random lenght", key, { mode: CryptoJS.mode.CTR, iv: iv, padding: CryptoJS.pad.NoPadding }); document.getElementById("id").innerHTML = encrypted.ciphertext.toString(); document.getElementById("id2").innerHTML = encrypted.toString(); var decrypted = CryptoJS.AES.decrypt(encrypted, key, { mode: CryptoJS.mode.CTR, iv: iv, padding: CryptoJS.pad.NoPadding }); document.getElementById("decrypt").innerHTML = decrypted.toString(CryptoJS.enc.Utf8); // text can be a random lenght <script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/aes.js"></script> <script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/components/mode-ctr.js"></script> <script src="http://crypto-js.googlecode.com/svn/tags/3.1/build/components/pad-nopadding.js"></script> <p> Ciphertext in HEX: </p> <p id="id"> </p> <p> Ciphertext in BASE64: </p> <p id="id2"> </p> <p> PlainText: </p> <p id="decrypt"></p>