我正在编写一个应用程序,我在java中通过套接字传输一个字节数组。
客户端的字节数组生成如下:
String vote = br.readLine();
// the data that i now encrypt using RSA
PublicKey pubKey = readKeyFromFilepublic("alicepublic.txt");
Cipher cvote = Cipher.getInstance("RSA");
cvote.init(Cipher.ENCRYPT_MODE, pubKey);
byte[] voted = cvote.doFinal(vote.getBytes());
System.out.println(voted);
out.println(voted.length);
dos.write(voted,0,voted.length); // here i am sending the array to the server
在服务器端我写
String clen = in.readLine(); // read the length
byte[] array = new byte[Integer.parseInt(clen)]; // create the array of that length
dist.readFully(array); // read the array
// i am unable to read the array here at all !
PrivateKey priKey = readKeyFromFileprivate("aliceprivate.txt");
Cipher vote = Cipher.getInstance("RSA");
vote.init(Cipher.DECRYPT_MODE, priKey);
byte[] voteData = vote.doFinal(array);
System.out.println(voteData);
// finally print the decrypted array
我已经通过写入正常工作的文件来检查加密和解密过程。
我在两端使用DataInput和DataOutput流。
请告诉我我的代码有什么问题!
答案 0 :(得分:2)
不要在同一个流上混合读取字符数据和二进制数据(至少不要使用不同的流)。你没有显示“in”的类型,但我猜它是一个BufferedReader(这里的关键点是“缓冲”)。 BufferedReader将读取 more 而不是下一行,因此byte []的一部分位于BufferedReader中。对流上的所有操作使用相同的DataOutputStream / DataInputStream。如果需要编写文本数据,请使用writeUTF / readUTF。当你写byte []的长度时,只需使用writeInt / readInt。