如何在客户端(CryptoJS)和服务器(CryptoNode.js)之间建立Diffie-Hellman连接

如何在客户端(CryptoJS)和服务器(CryptoNode.js)之间建立Diffie-Hellman连接,node.js,encryption,cryptography,cryptojs,diffie-hellman,Node.js,Encryption,Cryptography,Cryptojs,Diffie Hellman,我正在尝试在服务器和客户端之间建立连接。我使用椭圆.js创建ECDH密钥,并尝试对消息进行加密解密。密钥在服务器和客户端上都是相等的。服务器之间一切正常,但服务器和客户端之间存在很多问题 我已经做了很多工作,让客户端破译来自服务器的消息。但我无法在客户端正确加密。服务器不明白。连客户都不明白 我的客户机使用Crypto JS(我曾尝试使用forge和sjcl,但对我来说,它们是非常容易理解的),服务器使用Crypto。 客户机上有我的功能: 密码数据(数据,秘密){ 让encrypted=Cr

我正在尝试在服务器和客户端之间建立连接。我使用椭圆.js创建ECDH密钥,并尝试对消息进行加密解密。密钥在服务器和客户端上都是相等的。服务器之间一切正常,但服务器和客户端之间存在很多问题

我已经做了很多工作,让客户端破译来自服务器的消息。但我无法在客户端正确加密。服务器不明白。连客户都不明白

我的客户机使用Crypto JS(我曾尝试使用forge和sjcl,但对我来说,它们是非常容易理解的),服务器使用Crypto。 客户机上有我的功能:

密码数据(数据,秘密){
让encrypted=CryptoJS.AES.encrypt(数据,秘密).toString();
返回加密;
}
解密数据(加密数据、机密){
让数据;
试一试{
//由于crypto(node)中的一些小功能,所以需要进行转换—它使用空的salt数组
让ct=CryptoJS.enc.Hex.parse(encryptedData);
让salt=CryptoJS.lib.WordArray.create(0);//空数组
data=CryptoJS.AES.decrypt({ciphertext:ct,salt:salt},secret);
data=data.toString(CryptoJS.enc.Utf8);
}捕获(e){
console.log('解密数据时出错:'+e)
}
返回数据;

}
经过多次尝试,我决定也使用Crypto JS重新制作服务器端。这个决定完全正确。一切正常

cipherData(数据,机密){
让encrypted=CryptoJS.AES.encrypt(数据,秘密).toString();
设b64=CryptoJS.enc.Base64.parse(加密);
加密=b64.toString(CryptoJS.enc.Hex);
返回加密;
}
解密数据(加密数据、机密){
让数据;
试一试{
设b64=CryptoJS.enc.Hex.parse(encryptedData);
让bytes=b64.toString(CryptoJS.enc.Base64);
data=CryptoJS.AES.decrypt(字节,秘密);
data=data.toString(CryptoJS.enc.Utf8);
}捕获(e){
console.log('解密数据时出错:'+e)
}
返回数据;

}
首先,您不应该实现自己的DH,因为我敢打赌您在这一部分做得不对:大多数由非密码学家实现的DH都容易受到中间人的攻击。其次,没有理由这样做:只需使用TLS。第三,CryptoJS不能与许多其他库进行互操作,除非您使用原始格式的API(不要使用基于密码的加密——您似乎在硬编码的all zero salt中使用了这种加密,这也不好)。我没有实现我自己的DH,我只是为算法的不同部分使用了两个库。椭圆用于密钥生成,cryptoJS用于加密。这是错的吗?你能告诉我为什么TLS更好吗?如果你在没有身份验证的情况下使用Diffie Hellman是错误的,因为攻击者可以交换密钥并执行中间人操作。即使您注意到了这一点,您仍然需要通过TLS将JavaScript安全地提供给客户端,否则攻击者只会在那里注入自己的恶意负载。因此,在一天结束时,您仍然需要回到TLS,以使其不容易被攻击。TLS已经为你做了一切,所以不需要额外增加一层,这只会让事情变得更糟:一条链条的强度取决于它最薄弱的环节。