Как зашифровать RSAKey, используя другой RSAKey? - PullRequest
0 голосов
/ 27 мая 2010

Я знаю, что это не обычное дело. Но спецификация, которую я реализую, описана таким образом, и я не могу закончить.

Я пытался зашифровать модуль и показатель степени закрытого ключа, но следующий тестовый код вызывает исключение, потому что байтовый массив на 1 байт превышает максимально допустимый для блока RSA:

import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;

import javax.crypto.Cipher;

import org.apache.commons.lang.ArrayUtils;

public class TEST {

    public static KeyPair generateKeyPair() throws NoSuchAlgorithmException, NoSuchProviderException {
 KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA", "BC");
 keyPairGenerator.initialize(1024);
 return keyPairGenerator.generateKeyPair();
    }

    public static void main(String[] args) throws Exception {

 KeyPair keyPair = generateKeyPair();
 RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();

 System.out.println("Priv modulus len = " + privateKey.getModulus().bitLength());
 System.out.println("Priv exponent len = " + privateKey.getPrivateExponent().bitLength());
 System.out.println("Priv modulus toByteArray len = " + privateKey.getModulus().toByteArray().length);

 byte[] byteArray = privateKey.getModulus().toByteArray();
 // the byte at index 0 have no value (in every generation it is always zero)
 byteArray = ArrayUtils.subarray(byteArray, 1, byteArray.length);

 System.out.println("byteArray size: " + byteArray.length);

 RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
 Cipher cipher = Cipher.getInstance("RSA", "BC");
 cipher.init(Cipher.ENCRYPT_MODE, publicKey);
 byte[] encryptedBytes = cipher.doFinal(byteArray);

 System.out.println("Success!");
    }

}

(obs. Это просто тест, я бы никогда не зашифровал закрытый ключ его парным открытым ключом)

Массив байтов составляет 128 байтов, что является максимальным разрешением блока RSA, так почему исключение? И как это исправить?

РЕДАКТИРОВАТЬ: если я инициализирую генератор пары ключей с 1023 (вместо 1024), он работает, но не является обычным для размера ключа RSA 1024?

Ответы [ 6 ]

2 голосов
/ 28 мая 2010

Во-первых: кто-то написал эту спецификацию.Посоветуйтесь с ними вместо того, чтобы спрашивать нас.У них есть основания для написания этого требования, и вам нужно знать, что это такое.Когда вы сталкиваетесь с неясным требованием, худшее, что вы можете сделать, - это начать гадать, особенно при работе с криптографией.

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

РЕДАКТИРОВАТЬ: Как указывает Грегс в комментарияхвы не можете быть уверены, что частный показатель ключа, который вы хотите зашифровать, меньше, чем модуль ключа, который вы хотите использовать для шифрования.Я думаю, что примерно в 25% случаев это будет , а не .Поэтому вместо этого используйте метод, приведенный ниже.

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

1 голос
/ 28 мая 2010

Если вы абсолютно хотите использовать свой собственный крипто-протокол (который обычно не очень хорошая идея), вы можете оставить открытый ключ (то есть модуль N и открытый ключ e) в виде открытого текста и просто зашифровать один из факторов N Поскольку коэффициенты составляют около 512 бит для модуля 1024 бит, у вас не должно быть проблем с шифрованием. Знание одного из факторов и открытого ключа достаточно, чтобы определить остаток закрытого ключа.

1 голос
/ 27 мая 2010

Вы уверены, что вам нужно это сделать? Большинство людей шифруют симметричные ключи с помощью ключа RSA, но шифрование RSA внутри RSA ничего вам не дает.

Максимальный размер открытого текста, который может быть зашифрован RSA, составляет

  (key_size/8) - 11 bytes

Так что вы можете зашифровать только 117 байтов для 1024-битного ключа. Вам нужно использовать ключ намного большего размера для шифрования ключа меньшего размера.

0 голосов
/ 01 июня 2010

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

Извините, что беспокоитесь, ребята (я пытался удалить этот вопрос, но сейчас его нельзя удалить).

0 голосов
/ 27 мая 2010

Объем данных, которые вы можете зашифровать в RSA, равен размеру ключа - 11 байт. Если вы хотите сохранить больше данных, увеличьте размер ключа с 1024.

0 голосов
/ 27 мая 2010

Метод PKCS # 1 добавляет 11 байтов контрольных сумм и отступов, поэтому ваш максимальный размер обычного текста составит 117 байтов. См. Слишком много данных для сбоя блока RSA. Что такое PKCS # 7?

...