Генерация ключа RSA с открытым показателем, отличным от 65537 (0x10001 в шестнадцатеричном формате)

Я реализую апплет Java-карты для 2048-битного RSA. Я хочу знать, как создать пару ключей RSA с открытым показателем (e), отличным от 65537.

Карта генерирует пару ключей RSA и возвращает ее открытую экспоненту (e) и модуль (n). Но публичный показатель всегда равен 65537 (0x10001 в шестнадцатеричном формате). Мой код выглядит следующим образом

// Initialize objects for RSA Keys and Pair
objRSAPriKey = (RSAPrivateCrtKey)KeyBuilder.buildKey(KeyBuilder.TYPE_RSA_CRT_PRIVATE, KeyBuilder.LENGTH_RSA_2048, false);
objRSAPubKey = (RSAPublicKey)KeyBuilder.buildKey(KeyBuilder.TYPE_RSA_PUBLIC,  KeyBuilder.LENGTH_RSA_2048, false);
objRSAKeyPair= new KeyPair(KeyPair.ALG_RSA_CRT, KeyBuilder.LENGTH_RSA_2048);

    ...

// Generate Key Pairs    
objRSAKeyPair.genKeyPair();

objRSAPriKey = (RSAPrivateCrtKey)objRSAKeyPair.getPrivate();
objRSAPubKey = (RSAPublicKey)objRSAKeyPair.getPublic();

GetResLen = objRSAPubKey.getModulus(Rb_GetRes, BAS);
GetResLen += objRSAPubKey.getExponent(Rb_GetRes, GetResLen);

Конечно, я знаю, что эти ключи разные, потому что другие значения ключа (n, d, p, q) различаются каждый раз, когда апплет генерирует ключ. Но я хочу знать, как сгенерировать пару ключей RSA с публичной экспонентой размером 2048 бит.

Спасибо.


person user2642459    schedule 09.08.2014    source источник


Ответы (1)


Обычно создание пары ключей ограничивается определенными значениями на карте Java Card реализацией платформы. Это, безусловно, относится к экспоненте открытого ключа.

В настоящее время вы создаете пару открытого и закрытого ключей, просто чтобы заменить ссылки на них ссылками, сгенерированными genKeyPair. Вместо этого вы можете просто создать пару ключей следующим образом:

objRSAPriKey = (RSAPrivateCrtKey)KeyBuilder.buildKey(KeyBuilder.TYPE_RSA_CRT_PRIVATE, KeyBuilder.LENGTH_RSA_2048, false);
objRSAPubKey = (RSAPublicKey)KeyBuilder.buildKey(KeyBuilder.TYPE_RSA_PUBLIC,  KeyBuilder.LENGTH_RSA_2048, false);
objRSAPubKey.setExponent(myLargeExponent, 0, (short) myLargeExponent.length);
objRSAKeyPair= new KeyPair(objRSAPubKey, objRSAPriKey);
objRSAKeyPair.genKeyPair();

Это сгенерирует открытый ключ со статической экспонентой любого значения если поддерживается платформой. Если он не поддерживается, попробуйте использовать RSAPrivateKey вместо того, которое также использует параметры CRT. Теперь, если вы хотите иметь случайный публичный показатель степени, вы можете использовать трюк:

randomExponentRSAKeyPair = new KeyPair(KeyPair.ALG_RSA, KeyBuilder.LENGTH_RSA_2048);
randomExponentRSAKeyPair.genKeyPair();
byte[] myLargeExponent = new byte[KeyBuilder.LENGTH_RSA_2048 / 8];
RSAPrivateKey tmpKey = (RSAPrivateKey)randomRSAKeyPair.getPrivate();
key.getExponent(myLargeExponent, (short) 0);

Если этот код запускается, вы создали ужасно медленный открытый ключ, который не имеет преимуществ перед ключом с другим открытым ключом и который не следует использовать вместо закрытый ключ.

Примечание. Приведенный выше код Java Card не соответствует рекомендациям по использованию Java Card, только демонстрационный код только.

person Maarten Bodewes    schedule 09.08.2014
comment
Большое спасибо. На самом деле я ищу, как сгенерировать открытый ключ со статической экспонентой, и ваш первый код очень полезен. Но я не совсем понимаю ваш второй код. Насколько я понимаю ваши комментарии, я изменил и разместил свой код ниже, но он не работает. - person user2642459; 11.08.2014