Это мой первый вопрос здесь, поэтому я надеюсь, что я предоставляю достаточно информации, чтобы можно было как-то решить эту (небольшую?) Проблему, с которой я сталкиваюсь с (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();