Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> RSA Encrypt/Decrypt 
V
    Опции темы
4epT
Дата 13.12.2011, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: нет
Всего: 3



Доброе утро. Делаю небольшой класс для шифрования и расшифрование на алгоритме RSA. Использую стандартные методы Java.

Вот так шифруется:

Код

            byte[] data = str.getBytes("cp1251");
            
            Cipher cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.ENCRYPT_MODE, pubKey);
            byte[] cipherData = cipher.doFinal(data);
            
            return new String(cipherData, "cp1251");


Вот так расшифровывается:

Код

            byte[] data = str.getBytes("cp1251");
            
            Cipher cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.DECRYPT_MODE, privKey);
            byte[] cipherData = cipher.doFinal(data);
            
            return new String(cipherData, "cp1251");


Размер ключей 2048 байт. Генерировались при помощи KeyPairGenerator:

Код

            KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");

            kpg.initialize(keySize);

            KeyPair kp = kpg.generateKeyPair();

            return kp;


Проблема в том, что на некоторых текстах вылетает с таким эксепшеном:

Код

javax.crypto.BadPaddingException: Data must start with zero
    at sun.security.rsa.RSAPadding.unpadV15(RSAPadding.java:308)
    at sun.security.rsa.RSAPadding.unpad(RSAPadding.java:255)
    at com.sun.crypto.provider.RSACipher.a(DashoA13*..)
    at com.sun.crypto.provider.RSACipher.engineDoFinal(DashoA13*..)
    at javax.crypto.Cipher.doFinal(DashoA13*..)
    at com.util.CryptoUtil.rsaDecrypt(CryptoUtil.java:95)
    at rsaproject.RsaProject.main(RsaProject.java:24)


В данном примере шифруется текст: "Рррфывф"

Вылетает в момент расшифровки. В чем может быть ошибка ?
PM MAIL   Вверх
jk1
Дата 13.12.2011, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 40
Всего: 75



Использовать строку в качестве контейнера байтов таким образом
Код

new String(cipherData, "cp1251");

 - плохая идея. При преобразовании байтов в символы есть вероятность потерять информацию, равно как и при обратном процессе, ведь далеко не все байтовые последовательности могут иметь смысл в выбранной кодировке. 

Лучше закодируйте массив байтов на выходе при помощи B64, так вы получите адекватное строковое представление, но при этом кодирование будет однозначным и ничего не будет потеряно.


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
4epT
Дата 13.12.2011, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: нет
Всего: 3



Спасибо большое, в который раз натыкаюсь на эту ошибку (

Можно еще один вопрос ?)

я когда передаю в метод rsaEncrypt строку, как "правильно" из нее получить массив байт ?

я делаю так:

Код

byte[] data = str.getBytes("cp1251");


использовать B64 decoder как я понимаю не правильно, так как текст у нас еще не был уложен в B64 ...

P.s. "правильно" - это  я имею ввиду что бы по пути шифрования и дешифрования не потерять какие нибудь символы.
PM MAIL   Вверх
jk1
Дата 13.12.2011, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 40
Всего: 75



Цитата

я когда передаю в метод rsaEncrypt строку, как "правильно" из нее получить массив байт ?


Нужно использовать кодировку, которая содержит адексатное представление для всех возможных в Java-строке символов. 1251 для это не очень подходит, нужен юникод:
Код

byte[] data = str.getBytes("utf8");



--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
4epT
Дата 13.12.2011, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: нет
Всего: 3



Заменил на utf8, потестил ... все работает)

Спасибо большое!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0452 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.