我正在尝试使用Socket.io和node-forge(实现某些加密算法的npm软件包)与Node.js构建加密的网络聊天。
我的问题是,每当我发送加密的消息(由于某种原因而成为对象)时,它都会失去解密另一端消息所需的所有功能,我的加密/解密代码如下:>
function encrypt (bytesToEncrypt){
cipher = forge.cipher.createCipher('AES-CBC', key);
cipher.start({'iv': iv});
cipher.update(forge.util.createBuffer(bytesToEncrypt));
cipher.finish();
var encrypted = cipher.output;
console.log(encrypted.toHex());
return encrypted
}
function decrypt (bytesToDecrypt){
decipher = forge.cipher.createDecipher('AES-CBC', key);
decipher.start({'iv': iv});
decipher.update(bytesToDecrypt);
var result = decipher.finish(); // check 'result' for true/false
console.log('decryption result = ' + result);
// outputs decrypted hex
console.log(decipher.output.toString());
return decipher.output.toString();
}
每当我尝试这样发送消息时
socket.emit('chat message', encrypt("Hello world"));
并在另一端将其解密:
socket.on('chat message', function(msg){
decrypt(msg)
});
我收到以下错误:
Uncaught TypeError: e.getBytes is not a function
at n.o.ByteStringBuffer.putBuffer (forge.min.js:1)
at a.cipher.BlockCipher.n.update (forge.min.js:8923)
at decrypt ((index):68)
因为每当通过socket.io发送对象时,它就会失去其功能(在本例中为.getBytes())。 我想知道是否可以解决此问题,或者对我来说最好的办法是从其他选择重新开始。
我还发布了项目本身的要点链接(可能更易于理解)
https://gist.github.com/goncalo-ribeiro/b84fca008b3948cd3061a5c47b1c9b65
答案 0 :(得分:1)
正如@Thomas指出的,有必要使用收到的消息创建一个新的ByteStringBuffer。这样,每当收到新消息时,都应执行以下代码:
socket.on('chat message', function(msg){
var message = new forge.util.ByteStringBuffer(msg.data);
console.log(message)
decrypt(message)
});
这将创建一个新的ByteStringBuffer对象,该对象具有解密所需的方法。