我已经设法通过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 key
var 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 here
cipher, err := aes.NewCipher(symKey)
//if err != nil { ....}, doesn't happen here
byteData := make([]byte, len(encData))
cipher.Decrypt(byteData, encData)
fmt.Println("Dec: ", string(byteData))
//Outputs unrepresentable characters
任何想法?
撒科打诨
相关分类