2016-04-28 5 views
2

Я пытаюсь реализовать функцию modPow на Java-карте, используя сборку в RSA CryptoSystem. Код кажется тривиальным, но я выпустил его на реализацию.Метод Java Card setExponent() сбой при экспоненте более 10 байт

Мой код нед Сейчас:

Cipher m_encryptCipherRSA = Cipher.getInstance(Cipher.ALG_RSA_NOPAD, false); // create the cipher 
    RSAPublicKey m_rsaPublicKey = (RSAPublicKey) KeyBuilder.buildKey(KeyBuilder.TYPE_RSA_PUBLIC,KeyBuilder.LENGTH_RSA_1024,false); // create the public key 
    m_random = RandomData.getInstance(RandomData.ALG_SECURE_RANDOM); 
    m_random.generateData(temp1, (short)0, MODULUS_LENGTH); 
    m_rsaPublicKey.setModulus(temp1,(short)0, MODULUS_LENGTH); //generate modulus 
    m_random.generateData(temp1,(short)0, (short) EXPONENT_LENGTH); 
    m_rsaPublicKey.setExponent(temp1,(short)0, (short)EXPONENT_LENGTH); 

треск, кажется, работает нормально, если EXPONENT_LENGTH имеет не более 10 bytes.The Ja Ca Я не ограничил размер государственного показателя. Однако мой проект основан на числах до 128 байтов long.Is существует способ создать общую функцию modpow, основанную на этом аппаратном ограничении? Есть ли другой способ, которым я мог бы реализовать усиление мощности, которое по-прежнему возможно.

+0

Что происходит, если вы используете 'EXPONENT_LENGTH> 10'? Какое слово статуса вы получаете? – vojta

+0

@vojta 6f 00, который неизвестен. – Marga

+0

Поймайте исключение броска и сообщите нам его тип (используйте оператор instanceof) и его причину (вывод метода getReason()), пожалуйста. – vojta

ответ

1

Мне удалось решить проблему, используя частный экспонент (который, как представляется, не является ограничителем криптосистемой RSA). Ниже приводится рабочий код.

public byte[] modPow(byte[] x,short xOffset,short xLength,byte[] y,short yOffset,short yLength) 
{ 
    Util.arrayCopy(y, yOffset, tempBuffer, (short)(Configuration.TEMP_OFFSET_EXPONENT+4), yLength); 
    Util.arrayFillNonAtomic(tempBuffer, Configuration.TEMP_OFFSET_EXPONENT, (byte)4,(byte)0x00); 
    mRsaPrivateKeyModPow.setExponent(tempBuffer,Configuration.TEMP_OFFSET_EXPONENT, (short)(yLength+4)); 
    mRsaCipherModPow.init(mRsaPrivateKeyModPow, Cipher.MODE_DECRYPT); 
    Util.arrayCopy(x,xOffset,tempBuffer, Configuration.TEMP_OFFSET_RSA, Configuration.LENGTH_RSAOBJECT_MODULUS); 
    mRsaCipherModPow.doFinal(tempBuffer,Configuration.TEMP_OFFSET_RSA, (short) (Configuration.LENGTH_RSAOBJECT_MODULUS), tempBuffer,Configuration.TEMP_OFFSET_RSA); 
    mRsaPrivateKeyModPow.clearKey(); 
    return tempBuffer; 
} 
1

Ну, я пытался как RSAPublicKey и RSAPrivateKey для двух различных карт, и оба работали хорошо:

package soqPack; 

import javacard.framework.*; 
import javacard.security.KeyBuilder; 
import javacard.security.RSAPrivateKey; 
import javacard.security.RSAPublicKey; 
import javacard.security.RandomData; 
import javacardx.biometry.BioBuilder; 
import javacardx.crypto.Cipher; 

public class modPowtest extends Applet { 

    //Definition Of INS in APDU command 
    public static final byte INS_MOD_POW = (byte) 0x00; 

    //Switch cases to choose RSA Public key or RSA Private key for ModPow() 
    //P1 in APDU command. 
    public static final byte USE_PUB_KEY = (byte) 0x00; 
    public static final byte USE_PRI_KEY = (byte) 0x01; 

    //Required objects 
    byte[] tempMem; 
    Cipher myCipher; 
    RSAPrivateKey rsaPriKey; 
    RSAPublicKey rsaPubKey; 
    RandomData random; 

    public static void install(byte[] bArray, short bOffset, byte bLength) { 
     new modPowtest(); 
    } 

    protected modPowtest() { 
     myCipher = Cipher.getInstance(Cipher.ALG_RSA_PKCS1, false); 
     rsaPriKey = (RSAPrivateKey) KeyBuilder.buildKey(KeyBuilder.TYPE_RSA_PRIVATE, KeyBuilder.LENGTH_RSA_1024, false); 
     rsaPubKey = (RSAPublicKey) KeyBuilder.buildKey(KeyBuilder.TYPE_RSA_PUBLIC, KeyBuilder.LENGTH_RSA_1024, false); 
     tempMem = JCSystem.makeTransientByteArray((short) 0x80, JCSystem.CLEAR_ON_DESELECT); 
     random = RandomData.getInstance(RandomData.ALG_PSEUDO_RANDOM); 
     register(); 
    } 

    public void process(APDU apdu) { 
     if (selectingApplet()) { 
      return; 
     } 

     byte[] buffer = apdu.getBuffer(); 
     switch (buffer[ISO7816.OFFSET_INS]) { 
      case INS_MOD_POW: 
       modPow(apdu); 
       break; 
      default: 
       ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED); 
     } 
    } 

    public void modPow(APDU apdu) { 
     byte[] buffer = apdu.getBuffer(); 
     switch (buffer[ISO7816.OFFSET_P1]) { 
      case USE_PUB_KEY: 
       random.generateData(tempMem, (short) 0x00, (short) 0x80); 
       rsaPubKey.setModulus(tempMem, (short) 0x00, (short) 0x80); 
       random.generateData(tempMem, (short) 0x00, (short) 0x03); 
       rsaPubKey.setExponent(tempMem, (short) 0x00, (short) 0x03); 
       break; 
      case USE_PRI_KEY: 
       random.generateData(tempMem, (short) 0x00, (short) 0x80); 
       rsaPriKey.setModulus(tempMem, (short) 0x00, (short) 0x80); 
       random.generateData(tempMem, (short) 0x00, (short) 0x03); 
       rsaPriKey.setExponent(tempMem, (short) 0x00, (short) 0x03); 
       break; 
      default: 
       ISOException.throwIt(ISO7816.SW_INCORRECT_P1P2); 
     } 

    } 
} 

Работы, как показано ниже:

Download Cap begin... 
Download Cap successful. 
Install Applet begin... 
Install Applet successful. 
Select Applet begin... 
Select Applet successful. 

Send: 00 00 00 00 00 
Recv: 90 00 

Send: 00 00 01 00 00 
Recv: 90 00 

Update: (Связанный ваш новый вопрос в комментариях и here):

Я также изменил значение tempMem[0] непосредственно перед setModulus и setExponent методов к 0x69, и он все еще работает отлично.

+2

Я читал, что 'setExponent()' может выйти из строя, если размер экспоненты превышает 4 байта. Из документации оракула я нашел это: «Все реализации должны поддерживать значения экспоненты длиной до 4 байтов. Реализации могут также поддерживать значения экспоненты, превышающие 4 байта. «Здесь [ссылка] (http://www.win.tue.nl/pinpasjc/docs/apis/jc222/javacard/security/RSAPublicKey.html). – Marga

+0

Я начинаю [здесь] (http://stackoverflow.com/questions/36966764/rsa-cipher-java-card-error) с новой проблемой. Мне кажется, проблема с модулем vallue.I думаю, что это меньше чем значение x от RSA, и алгоритм терпит неудачу. – Marga