Проблемы с передачей открытого ключа клиенту и последующей расшифровкой зашифрованной информации (RSA) (javax.crypto.BadPaddingException) - PullRequest
2 голосов
/ 11 ноября 2011

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

Ответ на эту проблему был следующим: научитесь читать свой собственный код и отслеживайте, что вы сделали ... Извините, что потратили ваше время: /

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...