2015-10-07 5 views
1

Я разрабатываю апплет JavaCard. Апплет генерирует RSA открытых и закрытых ключей в конструкторе и с помощью команды шифруют APDU некоторый массив байтов:JavaCard-апплет не работает с шифрованием RSA

public RSATestApplet() { 
    keyPair = new KeyPair(KeyPair.ALG_RSA_CRT, KeyBuilder.LENGTH_RSA_2048); 
    keyPair.genKeyPair(); 
    rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate(); 
    rsaPublicKey = (RSAPublicKey) keyPair.getPublic(); 

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

    register(); 
} 

И основной метод является:

private void encryptData(APDU apdu) { 
    if (!rsaPublicKey.isInitialized()) { 
     ISOException.throwIt(ISO7816.SW_CONDITIONS_NOT_SATISFIED); 
    } 
    byte[] apduBuffer = apdu.getBuffer(); 
    apdu.setIncomingAndReceive(); 

    cipher.init(rsaPrivateKey, Cipher.MODE_ENCRYPT); 
    byte[] encryptedBuffer = new byte[apduBuffer.length]; 
    Util.arrayFillNonAtomic(encryptedBuffer, (short) 0, 
      (short) encryptedBuffer.length, (byte) 0xAA); 
    cipher.doFinal(encryptedBuffer, (short) 0, (short) encryptedBuffer.length, apduBuffer, (short) 0); 
    // Just for testing send 120 bytes 
    apdu.setOutgoingAndSend((short) 0, (short) 120); 
} 

И когда я пытаюсь установить ответ апплет APDU является 6E00 (который означает: нет точного диагноза).

Я думаю, проблема может возникнуть, когда шифр.doFinal() выполняется.

Я пробовал с другими апплетами, и все работает нормально.

я компилирую мой апплет с JavaCard 2.2.1 и Java 1.2

Есть ли у вас какие-либо идеи, что происходит?

ответ

4

Я твердо верю, что ошибка, возникающая при установке апплета, не связана с вашим методом encryptData.

Я предлагаю вам использовать try catch внутри вашего конструктора, чтобы поймать исключение, созданное JCVM. Например, при создании объекта KeyPair он может выдать ошибку, если алгоритм и длина ключа не поддерживаются платформой.

Вы можете попробовать что-то вроде этого:

try { 
    keyPair = new KeyPair(KeyPair.ALG_RSA, KeyBuilder.LENGTH_RSA_2048); 
} catch (CryptoException e) { 
    short reason = e.getReason(); 
    ISOException.throwIt(reason); 
} 
+0

Здравствуйте! Благодарим вас за полезные советы. Я уже понял, что моя карта не поддерживает RSA_2048. Но в документации RSA_2048 поддержка в DDA, а не в SDA. Дело в том, что я не знаю, что такое DDA и SDA, и как установить апплет в этом режиме. Я задам вопрос i – raiym

+0

http://stackoverflow.com/questions/33015169/differents-between-sda-and-dda-in-javacard – raiym

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