这是我在这里的第一个问题,所以我希望我提供足够的信息,以便能够通过(IMO)非常基本的公钥加密/这个(小的?)问题得到某种解决方案解密问题。
我试图按照示例进行操作,并且我已经阅读了API以尝试找出问题所在,但到目前为止,我还未能找到解密为什么解密失败的答案。基本测试...
我打印出了我在客户端和服务器之间传输的所有内容的字符,它们似乎完全相同。我试过使用不同的填充和密码,但似乎都没有。
两个程序的代码(我已经编辑了非必要的打印输出):
服务器代码:
RSAKeyPairGenerator kpg = new RSAKeyPairGenerator();
kpg.initialize(1024);
KeyPair kp = kpg.generateKeyPair();
PublicKey pk = kp.getPublic();
PrivateKey pri = kp.getPrivate();
InputStream in = csocket.getInputStream();
OutputStream out = csocket.getOutputStream();
DataInputStream dis = new DataInputStream(in);
DataOutputStream dos = new DataOutputStream(out);
// write getEncoded().length
dos.writeInt(pk.getEncoded().length);
// write key
byte[] public_key = pk.getEncoded();
for (int x=0;x<public_key.length;x++) {
dos.writeByte(public_key[x]);
}
dos.flush();
// read enc length
int len=dis.readInt();
byte[] data = new byte[len];
// read enc stuff
System.out.println("Read data:");
for (int x=0;x<len;x++) {
data[x]=dis.readByte();
}
// decrypt
byte [] decrypted = null;
try { cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.DECRYPT_MODE, pri);
decrypted = cipher.doFinal(new String(data).getBytes());
} catch (Exception e) { e.printStackTrace(); }
客户端:
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
DataInputStream dis = new DataInputStream(in);
DataOutputStream dos = new DataOutputStream(out);
// Read key length
int len = dis.readInt();
// Read key
byte[] public_key = new byte[len];
byte[] tmp = new byte[1];
for (int x = 0; x<len; x++) {
public_key[x] = dis.readByte();
}
try {
keySpec = new X509EncodedKeySpec(public_key);
keyFactory = keyFactory.getInstance("RSA");
publicKey = keyFactory.generatePublic(keySpec);
} catch (Exception e) { e.printStackTrace(); }
try {
cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding", "IBMJCE");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
// crypt string
data = cipher.doFinal(new String("Encrypt this").getBytes());
} catch (Exception e) { e.printStackTrace(); }
// write data.length
dos.writeInt(data.length);
// write encrypted data
for (int x=0; x<data.length;x++) {
dos.writeByte(data[x]);
}
dos.flush();
答案 0 :(得分:0)
这个问题的答案是:学会阅读自己的代码,并跟踪你所做的事情......抱歉浪费你的时间:/