<p>谢谢你,马腾,我已经按照你的要求重写了2个程序提示。现在他们可以有我想要的交流。我知道可能有一些安全问题,但我稍后会改进</p>
<pre class="lang-python prettyprint-override"><code>from Crypto.Cipher import DES
from Crypto.Util import Padding
import socket
host ='127.0.0.1'
port =8007
greeting=bytes("hello!",encoding="utf-8")
message=bytes("abc这个",encoding="utf-8")
key = b"secret_k"
def ba(byte_data):
return list(map(hex,bytearray(byte_data)))
def post_message(msg):
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.connect((host,port))
serversocket.send(msg)
serversocket.close()
#1 test normal connection server should print hello!
post_message(greeting)
print ('plain text', ba(greeting))
#2 test encrypt
padded_msg = Padding.pad(message,8) #need to do the padding manually
des = DES.new(key, DES.MODE_CBC) #using CBC instead of ECB
ciphered = des.encrypt(des.iv+padded_msg)
post_message(ciphered)
print("ciphered : ",ba(ciphered))
</code></pre>
<p>在服务器上</p>
<pre class="lang-js prettyprint-override"><code>var net = require('net');
const crypto = require('crypto');
const key = 'secret_k';
//prepare the cipher with shared key 'secret_k'
const decipher = crypto.createDecipheriv('DES-CBC',key,'iv123456');
var notFirstMessage = false;//just a flag
net.createServer(function(socket){
socket.on('data', function(data){
if(notFirstMessage){
console.log("I will do decipher work\n");
console.log("encrypted data is: ", data);
//do the decipher here
var remote_message = Buffer.concat([decipher.update(data),decipher.final()]);
console.log("After decipher: ",remote_message.slice(8).toString());//remove the iv
}else {
//
console.log('connection is ok, I got data: ',data.toString());
notFirstMessage = true;
console.log("============[Plain Text Connection OK]==============\n")
}
});
}).listen(8007);
console.log("server started at 8007 \n");
</code></pre>
<p>希望上面的例子可以帮助其他面临同样问题的人。你知道吗</p>