#encryption #cryptography
#шифрование #криптография
Вопрос:
Я изучаю криптосистему RSA. Открытый ключ состоит из (n, e), целого числа (произведения двух больших простых чисел) и ключа шифрования. Я хочу разделить целое число (n) и ключ (e). Типичный открытый ключ выражен в base64 и имеет следующий тип:
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCqGKukO1De7zhZj6 H0qtjTkVxwTCpvKe4eCZ0
FPqri0cb2JZfXJ/DgYSF6vUpwmJG8wVQZKjeGcjDOL5UlsuusFncCzWBQ7RKNUSesmQRMSGkVb1/
3j skZ6UtW 5u09lHNsj6tQ51s1SPrCBkedbNf0Tp0GbMJDyR4e9T04ZZwIDAQAB
-----END PUBLIC KEY-----
Теперь из приведенного выше ключа неясно, какая часть является целочисленной, а какая — ключом шифрования. Если кто-нибудь сможет меня направить, это было бы очень полезно.
Комментарии:
1. Было бы неплохо узнать, почему за него проголосовали с понижением!
2. Потому что чтение документации по методам, которые создали это представление ключа, дало бы вам ответ.
3. @OlegEstekhin Подумайте, прежде чем писать. Операционная система могла получить это по электронной почте, прочитать на сайте и т.д.
4. @Eugenemayevski’Eldoscorp этот вопрос не показывает никаких исследовательских усилий. Сброс строки base64 и вопрос, что это означает, строго говоря, даже не является вопросом, связанным с программированием.
5. @OlegEstekhin Вопрос далеко не тривиальный для человека, который изучает криптографию. Лично для вас: StackOverflow существует не для того, чтобы тешить чью-то самооценку.
Ответ №1:
Это Base64 кодировки DER структуры ASN.1 SubjectPublicKeyInfo
, которая определена в RFC 5280 (определение ASN.1 содержится в разделе 4.1, а дополнительное текстовое описание — в разделе 4.1.2.7).
SubjectPublicKeyInfo ::= SEQUENCE {
algorithm AlgorithmIdentifier,
subjectPublicKey BIT STRING }
Содержимое subjectPublicKey
поля зависит от ключевого алгоритма, который задается algorithm
полем.
Для RSA это будет RSAPublicKey
структура, определенная в RFC 3447
RSAPublicKey ::= SEQUENCE {
modulus INTEGER, -- n
publicExponent INTEGER -- e
}
Если выбранный вами язык программирования поддерживает шифрование RSA, то, скорее всего, он предоставляет класс или структуру или другое специфичное для языка средство для чтения общих SubjectPublicKeyInfo
данных и преобразования их в некоторое представление, которое позволит получить доступ к специфичным для RSA данным. Например, в Java
byte[] bytes = javax.xml.bind.DatatypeConverter.parseBase64Binary( "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCqGKukO1De7zhZj6 H0qtjTkVxwTCpvKe4eCZ0FPqri0cb2JZfXJ/DgYSF6vUpwmJG8wVQZKjeGcjDOL5UlsuusFncCzWBQ7RKNUSesmQRMSGkVb1/3j skZ6UtW 5u09lHNsj6tQ51s1SPrCBkedbNf0Tp0GbMJDyR4e9T04ZZwIDAQAB" );
X509EncodedKeySpec genericKeySpec = new X509EncodedKeySpec( bytes );
KeyFactory factory = KeyFactory.getInstance( "RSA" );
PublicKey publicKey = factory.generatePublic( genericKeySpec );
RSAPublicKeySpec rsaKeySpec = factory.getKeySpec( publicKey, RSAPublicKeySpec.class );
System.out.println( "n = " rsaKeySpec.getModulus() );
System.out.println( "e = " rsaKeySpec.getPublicExponent() );
Комментарии:
1. Пожалуйста, нет
sun.misc.*
. Они будут удалены в будущей версии. Особенно теперь, когда, начиная с Java 8, существуетjava.util.Base64
.2. Хотя в целом это допустимый пункт, использования
sun.misc.BASE64Decoder
достаточно для определения цели для этого примера без введения большого количества объяснений. Вопрос даже не специфичен для какого-либо языка программирования.3. Хорошая мысль, но меня беспокоят те, кто копирует-вставляет случайные фрагменты кода из Интернета, не до конца понимая, что они делают. Таких людей слишком много. Я бы не хотел, чтобы чума sun.misc распространилась дальше, теперь, когда для этого есть стандартный класс.
4. заменено классом, доступным с версии 1.6.