ALG_RSA_NOPAD в Java-карте

Чтобы эффективно вычислить квадрат в Java Card, я хочу использовать алгоритм ALG_RSA_NOPAD с показателем, равным 2 и модуль больше ожидаемого результата (таким образом, модульное сокращение не имеет никакого эффекта).

Но я не могу использовать алгоритм ALG_RSA_NOPAD, На самом деле, когда я вызываю метод doFinal() Я получаю CryptoException который ILLEGAL_VALUE, В спецификации Java Card 2.2.2 сказано, что:

CryptoException.ILLEGAL_USE, если выполняется одно из следующих условий:

• Этот алгоритм шифрования не дополняет сообщение, и сообщение не выровнено по блокам.

• Этот алгоритм шифрования не дополняет сообщение, и входные данные не были предоставлены в inBuff или через метод update().

• Длина входного сообщения не поддерживается.

• Дешифрованные данные не ограничены соответствующими байтами заполнения.

Поэтому я пришел к выводу, что мое сообщение не выровнено по блокам. Но что значит выравнивание блоков для этого алгоритма? Имеет ли мое сообщение ту же длину, что и модуль? Экспонент? Я пробовал разные вещи, но я не нашел...

Соответствующий код:

   byte[] res_RSA = new byte[(short) 0x0080];
   KeyPair rsa_KeyPair = new   KeyPair(KeyPair.ALG_RSA,KeyBuilder.LENGTH_RSA_1024);
        rsa_KeyPair.genKeyPair();
   RSAPublicKey rsa_PubKey; rsa_PubKey = (RSAPublicKey) rsa_KeyPair.getPublic();


    rsa_PubKey.setExponent(new byte[]{(byte) 0x02}, (short) 0x00000, (short) 0x0001);
    rsa_PubKey.setModulus(new byte[] { (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, }, (short) 0x0000, (short) 0x0080);

    cipherRSA = Cipher.getInstance(Cipher.ALG_RSA_NOPAD, false);

    x = new byte[] { (byte) 0x0C, (byte) 0xE2, (byte) 0x65, (byte) 0x92,
        (byte) 0x98, (byte) 0x84, (byte) 0x4C, (byte) 0x6C,
        (byte) 0x39, (byte) 0x31, (byte) 0x78, (byte) 0x22,
        (byte) 0x99, (byte) 0x39, (byte) 0xAD, (byte) 0xAD,
        (byte) 0x74, (byte) 0x31, (byte) 0x45, (byte) 0xD2,
        (byte) 0xB9, (byte) 0x37, (byte) 0xB2, (byte) 0x92,
        (byte) 0x7D, (byte) 0x32, (byte) 0xE9, (byte) 0x70,
        (byte) 0x91, (byte) 0x7D, (byte) 0x78, (byte) 0x45,
        (byte) 0xC9, (byte) 0x5C, (byte) 0xF9, (byte) 0xF2,
        (byte) 0xFD, (byte) 0xB9, (byte) 0xAE, (byte) 0x6C,
        (byte) 0xC9, (byte) 0x42, (byte) 0x64, (byte) 0xBA,
        (byte) 0x2A, (byte) 0xCE, (byte) 0x5A, (byte) 0x71,
        (byte) 0x60, (byte) 0x58, (byte) 0x56, (byte) 0x17,
        (byte) 0x2E, (byte) 0x25, (byte) 0xDD, (byte) 0x47,
        (byte) 0x23, (byte) 0x6B, (byte) 0x15, (byte) 0x76,
        (byte) 0x8F, (byte) 0x2A, (byte) 0x87, (byte) 0xC7 };

   cipherRSA.init(rsa_PubKey, Cipher.MODE_ENCRYPT);
   cipherRSA.doFinal(x, (short) 0x0000,
            (short) 0x0040, res_RSA, (short) 0x0000);

Итак CryptoException ставится на последней строчке, но я не совсем понимаю, почему.

(Обратите внимание, что в моем коде я установил модуль на наибольшее значение длиной 128 байт, чтобы быть уверенным, что квадрат не будет затронут.)

2 ответа

Решение

Ну, на моей карточке сообщение должно иметь ту же длину, что и модуль... Я думал, что проверял этот случай, но я не соответствовал смещениям.

Так что даже мое сообщение не является длинным модулем (я не смог вычислить квадрат), я должен заполнить массив нулями.

Зачастую RSA проверяется только на работу с определенными открытыми показателями для конкретной реализации Java Card. Весьма вероятно, что эта проблема исчезнет, ​​если при использовании более широкой общедоступной экспоненты, такой как 65537 (0x01, 0x00, 0x01). Пожалуйста, обратитесь к руководству пользователя вашего чипа / платформы.

Обратите внимание, что такие вычисления без заполнения не являются безопасными для RSA. Это означает, что их может быть сложно объяснить органам по сертификации. Возможно, вам больше повезет с реализациями Диффи-Хеллмана (если есть).

Другие вопросы по тегам