2013-07-05 3 views
2

Я отправлю свой код. Извините за путаницу.Почему RSA производит разные результаты с помощью одного и того же ключа и сообщения?

StringBuilder texto1 = new StringBuilder("LALALLA"); 
byte[] x = texto1.toString().getBytes(); 
try { 
    Cipher cifrado = Cipher.getInstance("RSA/ECB/PKCS1Padding"); 
    cifrado.init(Cipher.ENCRYPT_MODE, key1.getPublic()); 
    x = cifrado.doFinal(x); 
    String texto; 
    texto = new String(x, "UTF-8"); 
    JOptionPane.showInputDialog(publicKey.toString()); 
    String teste = ""; 
    for (int i = 0; i < x.length; i++) { 
    teste += x[i]; 
    } 
    jTextPane1.setText(teste); 
    //cifrado.init(Cipher.DECRYPT_MODE, privatekey); 
    byte[] y; 
    // x= texto.getBytes(); 
    //y = cifrado.doFinal(texto.getBytes()); 
    //texto = new String(y,"UTF-8"); 
    jTextPane2.setText(x.toString()); 
} ... 

Это код в действии на кнопку. Everytime, что я запускаю этот код, с теми же ключами, texto1 шифрования возвращает другой результат, как [[email protected] или [[email protected]

+3

Прежде всего: ** да **, шифрование ** предположительно ** для этого. И второе: Строка, которую вы печатаете, это 'toString()' 'byte []', это * полностью не связанное * с его содержимым. –

+1

PKCS # 1v1.5 прокладка опасна; рассмотрите возможность использования OAEP, если это возможно. – ntoskrnl

ответ

6

The toString() метод массивов в Java не отображает содержимое массива. Вместо этого он показывает тип компонента и идентификатор на основе расположения массива в памяти.

Если вы хотите просмотреть содержимое массива, вам нужно выполнить итерацию по его элементам. И в этом случае вам придется решить, как вы хотите кодировать элементы байта в текст. Похоже, что вы пытаетесь сделать это с помощью переменной teste, но я бы рекомендовал что-то вроде этого:

StringBuilder buf = new StringBuilder(); 
for (byte b : x) 
    buf.append(String.format("%02X", b)); 
String teste = buf.toString(); 

Это будет генерировать шестнадцатеричное представление вашего шифротекста. Вы не можете создать String из случайных 8-битовых значений, как вы пытаетесь с переменной texto, потому что байты, как правило, не образуют действительных последовательностей кодировки UTF-8. В тексте вы получите много замещающих символов (& # xFFFD;).

С кодировкой hex (или base-64) вы увидите, что текст шифрования по-прежнему изменяется случайным образом. Это связано с тем, что схемы дополнений RSK PKCS # 1 используют случайные данные для заполнения сообщения до шифрования. Эта преднамеренная функция RSA предотвращает распознавание злоумышленником при отправке одного и того же сообщения.

Смежные вопросы