Целочисленная часть открытого ключа RSA

#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.