将公钥传递给客户端然后解密加密信息(RSA)的问题(javax.crypto.BadPaddingException)

时间:2011-11-11 14:04:27

标签: java rsa public-key-encryption

这是我在这里的第一个问题,所以我希望我提供足够的信息,以便能够通过(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();

1 个答案:

答案 0 :(得分:0)

这个问题的答案是:学会阅读自己的代码,并跟踪你所做的事情......抱歉浪费你的时间:/