我有一个问题解密文本,这是在Go语言加密,与CryptoJS.
下面是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来解密。
谢谢
3条答案
按热度按时间but5z9lq1#
好吧,你可以这样做来解决这个问题:
1.将无填充js添加到源代码列表中:
http://crypto-js.googlecode.com/svn/tags/3.1/build/components/pad-nopadding.js
1.加密/解密时指定参数:
padding: CryptoJS.pad.NoPadding
CTR模式不需要在加密前填充纯文本。
从多个AES块生成的密钥流在异或运算之前被修整以匹配纯文本长度。
看起来CryptoJS用纯文本生成密钥流到
xor
,但不修剪它,因为没有padding: CryptoJS.pad.NoPadding
的CryptoJS生成的密文长度总是16字节的倍数(正好是AES块大小)。ygya80vv2#
你必须在编码前给明文加上填充
例如:
v6ylcynt3#
希望这对你有帮助。干杯:)