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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Загрузка ключа RSA из файла для объекта Cipher, каким способом? 
V
    Опции темы
regen
Дата 2.10.2006, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



В файл private.txt записан приватный ключ для RSA. Читаю из файла байтики в byte[] priv_key
В файл public.txt записан публичный ключ для RSA. Читаю из файла байтики в byte[] pub_key
Задача сделать init объекту типа Cipher и в качестве параметра указать публичный ключ и приватный ключ.
Почитал доки, нашёл только как экспортировать из обектов PrivateKey и PublicKey ключи в byte[].
А вот обратной функции (импорт) не нашёл. Не подскажите способ?
Вот код для пояснения:
Код

Cipher eCipher = Cipher.getInstance("RSA");
eCipher.init(eCipher.ENCRYPT_MODE, /*в качестве этого параметра публичный ключ из файла*/);

Cipher dCipher = Cipher.getInstance("RSA");
dCipher.init(dCipher.DECRYPT_MODE, /*в качестве этого параметра приватный ключ из файла*/);


Заранее спасибо за ответы
PM MAIL   Вверх
powerOn
Дата 2.10.2006, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

Репутация: 47
Всего: 159



Посмтори на этот код:

Код

import java.math.BigInteger;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.RSAPrivateKeySpec;
import java.security.spec.RSAPublicKeySpec;
import javax.crypto.Cipher;

/**
 *
 * @author powerOn
 */
public class NewClass {
    
    /** Creates a new instance of NewClass */
    public NewClass() {
    }
    public static void main(String[] args) {
        try {
            // Генерируем ключи.
            KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
            KeyPair kpair = kpg.genKeyPair();
            PrivateKey privateKey = kpair.getPrivate();
            PublicKey publicKey = kpair.getPublic();
            
            // "Разбираем" RSA ключи.
            KeyFactory kf = KeyFactory.getInstance("RSA");
            RSAPrivateKeySpec prks = kf.getKeySpec(privateKey, RSAPrivateKeySpec.class);
            // Достачно знать эти 2 числа, чтобы востановить секретный ключ. Сохранять нужно их.
            BigInteger pr_m = prks.getModulus();
            BigInteger pr_x = prks.getPrivateExponent();
            
            RSAPublicKeySpec pubks =  kf.getKeySpec(publicKey, RSAPublicKeySpec.class);
            // Достачно знать эти 2 числа, чтобы востановить открытый ключ. Сохранять нужно их.
            BigInteger pub_m = pubks.getModulus();
            BigInteger pub_x = pubks.getPublicExponent();
            
            // Востанавливаем ключ из полученных ранее BigInteger-ов.
            RSAPrivateKeySpec new_prks = new RSAPrivateKeySpec(pr_m, pr_x);
            RSAPublicKeySpec new_pubks = new RSAPublicKeySpec(pub_m, pub_x);
            PrivateKey new_private = kf.generatePrivate(new_prks);
            PublicKey new_public = kf.generatePublic(new_pubks);
            
            Cipher c = Cipher.getInstance("RSA");
            // Шифруем оригинальным ключом.
            c.init(Cipher.ENCRYPT_MODE, publicKey);
            byte [] encrypted = c.doFinal("Test string".getBytes());
            // Расшифруем репродуцированным ключом.
            c.init(Cipher.DECRYPT_MODE, new_private);
            byte [] decrypted = c.doFinal(encrypted);
            
            String s = new String(decrypted);
            System.out.println(s);

        } catch (Exception ex) {
            ex.printStackTrace();
        } 
    }
}



RSA Ключ (как закрытый, так и открытый) можно разложить на два BigInteger: Modulus и PublicExponent. Этих чисел достаточно для создания ключа. Так вот, чтоб ключ сохранить получим эти числа и сохраним в файл (я не сохранял, но получал), а чтоб востановить, соответственно обратная операция. 



--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
regen
Дата 4.10.2006, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Супер. Спасибо большое!
Именно то что нужно!
Помечаю вопрос как решённый
PM MAIL   Вверх
powerOn
Дата 4.10.2006, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

Репутация: 47
Всего: 159



пожалуйста. smile


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
v2v
Дата 24.9.2007, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1620
Регистрация: 20.9.2006
Где: Киев

Репутация: 8
Всего: 56



powerOn, большой тебе спасибо за код smile

правда есть одно замечание: в данной реализации используется ключ по умолчанию 1к и он позволяет шифровать строки с максимальной длинной 177байт. Для того что бы шифровать большие строки надо делать больше ключ или разбивать на блоки строки ).


--------------------
PM   Вверх
Alexandr87
Дата 24.9.2007, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


дыкий псых
***


Профиль
Группа: Завсегдатай
Сообщений: 1459
Регистрация: 27.11.2004
Где: Алматы, Казахстан

Репутация: 9
Всего: 39



Цитата(v2v @  24.9.2007,  15:05 Найти цитируемый пост)
Для того что бы шифровать большие строки надо делать больше ключ или разбивать на блоки строки ). 

для того чтобы шифровать большие строки не надо делать больше ключ или разбивать на блоки строки (это делать категорически нельзя - снижается криптографическая стойкость такой системы). RSA - имеет очень большую вычислительную сложность, как и любой другой ассиметричный алгоритм шифрования, и следовательно малоэффективен для шифрования больших объемов информации. На практике подобные алгоритмы используются исключительно для ключевого обмена. Т.е. генерируется сессионный ключ для симметричного алгоритма шифрования, им шифруется сообщение, а сам сессионный ключ, как раз шифруется с помощью RSA и прикрепляется к сообщению.

Это сообщение отредактировал(а) Alexandr87 - 24.9.2007, 12:48
PM Jabber   Вверх
v2v
Дата 24.9.2007, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1620
Регистрация: 20.9.2006
Где: Киев

Репутация: 8
Всего: 56



ok

Это сообщение отредактировал(а) v2v - 24.9.2007, 14:05


--------------------
PM   Вверх
Alexandr87
Дата 24.9.2007, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


дыкий псых
***


Профиль
Группа: Завсегдатай
Сообщений: 1459
Регистрация: 27.11.2004
Где: Алматы, Казахстан

Репутация: 9
Всего: 39



Цитата(v2v @  24.9.2007,  16:32 Найти цитируемый пост)
что бы передать сессионный ключ длинной 1024 бита, необходимо использовать RSA c клёчем 8192 бита!

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

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

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


 




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


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

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