2015-02-19 5 views
2

Я пытаюсь воссоздать открытый ключ на Java-карте и использовать его для шифрования некоторых данных.Java Card Crypto Exception Шифрование ключа RSA

Вот код, чтобы построить открытый ключ, который я использую:

rsaPublicId = (RSAPublicKey) KeyBuilder.buildKey(KeyBuilder.TYPE_RSA_PUBLIC, KeyBuilder.LENGTH_RSA_2048, false); 
rsaPublicId.setExponent(rsaExponent, (short) 0, (short) rsaExponent.length); 
rsaPublicId.setModulus(rsaPublicModulus, (short) 12, (short) ((short) rsaPublicModulus.length - (short) 12)); 

cipherId.init(rsaPublicId, Cipher.MODE_ENCRYPT); 

И когда я пытаюсь зашифровать данные я использую этот код:

cipherId.doFinal(serviceBytes, (short) 0, (short) 16, buffer, (short) 0); 

Но это происходит javacard.security.cryptoException с сообщением детали из «NULL»

cipherId = Cipher.getInstance(Cipher.ALG_RSA_PKCS1, false); 

модуль устанавливается с размером 308, я t создан с Java и отправлен на карту.

+0

Оставьте свое исключение блоком try-catch и сообщите нам, что является результатом getReason(), вызываемого экземпляром исключения, пожалуйста. – vojta

+0

В Исключении появляется код 5. Он говорит: « /*** Этот код причины используется, чтобы указать, что алгоритм подписи или шифрования не заполняет входящее сообщение, а входное сообщение не выравнивается по блоку. */ открытый статический окончательный короткий ILLEGAL_USE = 5; " –

+0

Какое подробное сообщение? В Java Card Classic нет такого понятия, как подробное сообщение. Я имею в виду: строки даже не поддерживаются ... –

ответ

2

Ваш модуль должен быть точно такой же размер, установленный во время buildKey вызова. Итак, если ваш размер 308 (308 что?), То ваш ключ либо слишком мал (в битах), либо слишком большой (если он был указан в байтах).

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

+0

Какую реализацию Java-карты вы используете? Вы ожидали бы, что слишком большой или слишком маленький модуль, который будет обнаружен ранее; кажется, что реализация не под силу быстро. –

+0

Я создаю пару ключей RSA в приложении Java и отправляю модуль открытого ключа в апплет. Затем я хотел бы перестроить этот ключ и использовать его для криптографии некоторых данных и отправить его обратно. Длина модуля составляет 617 строк - 308 байт. Я использую 2.2 Java-карту. –

+0

Итак, создайте открытый ключ размером 2464 бит (это число бит 308-байтового ключа). Вам не нужно придерживаться заранее определенных констант. Если это не работает, ваше приложение Java Card не поддерживает этот размер ключа, и вам практически не повезло с этим размером ключа. –

-1

Ваш алго здесь не так

cipherId = Cipher.getInstance(Cipher.ALG_RSA_PKCS1, false); 

Пожалуйста, попробуйте

cipherId = Cipher.getInstance(Cipher.ALG_RSA_NOPAD, false); 
+0

Я попытался, но произошло то же самое исключение –

+0

Это тип алгоритма, в любом случае я могу использовать оба. –

0

Возможно, длина модуля не равна 2048 бит, возможно, вызывается ILLEGAL_USE.

Смежные вопросы