客户端未收到加密后数据被截断
Data Truncated After Encryption Not Received at Client
向服务器发送数据的代码
BufferedReader keyRead = new BufferedReader(new InputStreamReader(System.in));
OutputStream ostream = sock.getOutputStream();
PrintWriter pwrite = new PrintWriter(ostream, true);
// receiving from server ( receiveRead object)
InputStream istream = sock.getInputStream();
BufferedReader receiveRead = new BufferedReader(new InputStreamReader(istream));
String receiveMessage, sendMessage;
while(true)
{
sendMessage = keyRead.readLine(); // keyboard reading
String enc = crypt.encrypt(sendMessage, serverPublicKey);
System.out.println("sending to server: "+enc);
pwrite.println(enc); // sending to server
pwrite.flush(); // flush the data
if((receiveMessage = receiveRead.readLine()) != null) //receive from server
{
//System.out.println(crypt.decrypt(receiveMessage, clientPrivateKey)); // displaying at DOS prompt
System.out.println(receiveMessage);
}
}
输出 加密后在控制台上如下所示
sending to server: YRJ7ZNgqSQ56nGc8ff7ktoybYEohQJS2R+Vh3YN1YfHipUS64MyFrrYAzL4CiTPv2WF7zvaJst1A
qsiPsv3/1Q==
要在服务器上接收的代码
BufferedReader keyRead = new BufferedReader(new InputStreamReader(System.in));
// sending to client (pwrite object)
OutputStream ostream = sock.getOutputStream();
PrintWriter pwrite = new PrintWriter(ostream, true);
// receiving from server ( receiveRead object)
InputStream istream = sock.getInputStream();
BufferedReader receiveRead = new BufferedReader(new InputStreamReader(istream));
String receiveMessage, sendMessage;
while(true)
{
if((receiveMessage = receiveRead.readLine()) != null)
{
//System.out.println(crypt.decrypt(receiveMessage, serverPrivateKey));
System.out.println(receiveMessage);
}
sendMessage = keyRead.readLine();
String enc = crypt.encrypt(sendMessage, clientPublicKey);
System.out.println("sending to clinet: "+enc);
pwrite.println(enc);
pwrite.flush();
}
但是接收到的数据像
YRJ7ZNgqSQ56nGc8ff7ktoybYEohQJS2R+Vh3YN1YfHipUS64MyFrrYAzL4CiTPv2WF7zvaJst1A
其余
qsiPsv3/1Q==
从服务器向客户端发送东西时收到,请帮我定位问题,由于截断数据导致解密失败
您不仅对输入进行了加密,而且还对加密字节进行了 Base64 编码。您的 Base64 编码器每 76 个字符插入换行符,这是 Base64 transfer encoding for MIME (RFC 2045) 的标准。这就是为什么在服务器端你的 readLine()
只读取前 76 个字符。
您需要将 Base64 编码器配置为不添加换行符。
向服务器发送数据的代码
BufferedReader keyRead = new BufferedReader(new InputStreamReader(System.in));
OutputStream ostream = sock.getOutputStream();
PrintWriter pwrite = new PrintWriter(ostream, true);
// receiving from server ( receiveRead object)
InputStream istream = sock.getInputStream();
BufferedReader receiveRead = new BufferedReader(new InputStreamReader(istream));
String receiveMessage, sendMessage;
while(true)
{
sendMessage = keyRead.readLine(); // keyboard reading
String enc = crypt.encrypt(sendMessage, serverPublicKey);
System.out.println("sending to server: "+enc);
pwrite.println(enc); // sending to server
pwrite.flush(); // flush the data
if((receiveMessage = receiveRead.readLine()) != null) //receive from server
{
//System.out.println(crypt.decrypt(receiveMessage, clientPrivateKey)); // displaying at DOS prompt
System.out.println(receiveMessage);
}
}
输出 加密后在控制台上如下所示
sending to server: YRJ7ZNgqSQ56nGc8ff7ktoybYEohQJS2R+Vh3YN1YfHipUS64MyFrrYAzL4CiTPv2WF7zvaJst1A
qsiPsv3/1Q==
要在服务器上接收的代码
BufferedReader keyRead = new BufferedReader(new InputStreamReader(System.in));
// sending to client (pwrite object)
OutputStream ostream = sock.getOutputStream();
PrintWriter pwrite = new PrintWriter(ostream, true);
// receiving from server ( receiveRead object)
InputStream istream = sock.getInputStream();
BufferedReader receiveRead = new BufferedReader(new InputStreamReader(istream));
String receiveMessage, sendMessage;
while(true)
{
if((receiveMessage = receiveRead.readLine()) != null)
{
//System.out.println(crypt.decrypt(receiveMessage, serverPrivateKey));
System.out.println(receiveMessage);
}
sendMessage = keyRead.readLine();
String enc = crypt.encrypt(sendMessage, clientPublicKey);
System.out.println("sending to clinet: "+enc);
pwrite.println(enc);
pwrite.flush();
}
但是接收到的数据像
YRJ7ZNgqSQ56nGc8ff7ktoybYEohQJS2R+Vh3YN1YfHipUS64MyFrrYAzL4CiTPv2WF7zvaJst1A
其余
qsiPsv3/1Q==
从服务器向客户端发送东西时收到,请帮我定位问题,由于截断数据导致解密失败
您不仅对输入进行了加密,而且还对加密字节进行了 Base64 编码。您的 Base64 编码器每 76 个字符插入换行符,这是 Base64 transfer encoding for MIME (RFC 2045) 的标准。这就是为什么在服务器端你的 readLine()
只读取前 76 个字符。
您需要将 Base64 编码器配置为不添加换行符。