为了账号安全,请及时绑定邮箱和手机立即绑定

CryptoJS.AES和Golang

CryptoJS.AES和Golang

Go
慕标5832272 2021-04-26 10:27:11
我已经设法通过rsa共享了一个随机的对称密钥。但是,我无法使它使用AES加密。问题似乎是cryptoJS使用的盐和初始化向量。首先,它的输出如下:U2FsdGVkX19wbzVqqOr6U5dnuG34WyH+n1A4PX9Z+xBhY3bALGS7DOa/aphgnubc 可悲的是,谷歌搜索重新出现的“ U2FsdGVkX”或“ cryptoJS.AES输出”是没有用的。另一方面,golang的aes仅需要一个32位密钥和每个32位长度的输入。这意味着我必须以某种方式将以上内容拆分为相应的块并弄清楚,如何从秘密密钥和上面的数据(可能包括salt + init向量)中创建32位密钥。遗憾的是,无论http://code.google.com/p/crypto-js还是Google搜索都无法为我提供解决方案。顺便说一句-我现在的加密是:var arr = new Array(32);symetricKey = "";var symHex = "";rng.nextBytes(arr);for(var i = 0; i < arr.length; i++){    symetricKey += String.fromCharCode(arr[i]);    //symHex= arr[i].toString(16), added a 0 if needed (so length always increases by 2)}//submit symetric via rsa. This is working, the server gets that keyvar enc = CryptoJS.AES.encrypt(unencrypted, symetricKey)//submit enc, stuck now - what to do with it on the server?编辑:在Base64响应之后:感谢您的base64输入。但是我仍然没有设法使它发挥作用。尤其是由于编码的字符串以“ SALTED”开头,因此我认为可能存在问题。我现在尝试编码的方式:通过以下方式在客户端上编码:var unencrypted = "{mail:test,password:test}"var enc = CryptoJS.AES.encrypt(unencrypted, symKey)在服务器上,变量enc和symKey与在客户端上相同:baseReader := base64.NewDecoder(base64.StdEncoding, strings.NewReader(enc))encData, err := ioutil.ReadAll(baseReader)//if err != nil { ....}, doesn't happen herecipher, err := aes.NewCipher(symKey)//if err != nil { ....}, doesn't happen herebyteData := make([]byte, len(encData))cipher.Decrypt(byteData, encData)fmt.Println("Dec: ", string(byteData))//Outputs unrepresentable characters任何想法?
查看完整描述

3 回答

?
撒科打诨

TA贡献1934条经验 获得超2个赞

CryptoJS.AES.encrypt的输出是一个CipherParams对象,其中包含密钥,IV,可选的盐和密文。您引用的字符串是与OpenSSL兼容的格式化字符串。


var encrypted = CryptoJS.AES.encrypt("Message", "Secret Passphrase");


alert(encrypted.key);        // 74eb593087a982e2a6f5dded54ecd96d1fd0f3d44a58728cdcd40c55227522223

alert(encrypted.iv);         // 7781157e2629b094f0e3dd48c4d786115

alert(encrypted.salt);       // 7a25f9132ec6a8b34

alert(encrypted.ciphertext); // 73e54154a15d1beeb509d9e12f1e462a0


alert(encrypted);            // U2FsdGVkX1+iX5Ey7GqLND5UFUoV0b7rUJ2eEvHkYqA= (OpenSSL-compatible format strategy)

CryptoJS的默认加密模式是CBC。在RSA加密的交换过程中,应将IV与对称密钥一起传递。使用服务器上的对称密钥,IV和密文字节数组,您可以在Go中对其进行解密,如下所示:


c, err := aes.NewCipher(key)

cfbdec := cipher.NewCBCDecrypter(c, iv)

plaintext := make([]byte, len(ciphertext))

cfbdec.CryptBlock(plaintext, ciphertext)


查看完整回答
反对 回复 2021-05-31
  • 3 回答
  • 0 关注
  • 415 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信