Ошибка в doFinal при множественном шифровании DES_CBC_NOPAD - PullRequest
0 голосов
/ 10 мая 2018

У меня была проблема с шифрованием DES на Java-карте: я шифрую данные перед отправкой, а затем отправляю их в ответ на запросы, поступающие из какой-либо библиотеки.

Если в одном апплете SELECT отправляет запросы на информацию, то через 28-30 шифрований на карточке сеанс падает с ошибкой 6F00. После этого все вызовы шифрования возвращают 6F00. Проблема исчезнет, ​​если вы сделаете второй выбор апплета.

Все данные перед шифрованием я делаю кратно 8, поэтому ошибку из-за длины сообщения я сразу устранил. Может быть проблема с памятью, но я звоню JCSystem.requestObjectDeletion(); после каждой отправки данных.

Ниже приведена функция инициализации и шифрования, реализованная в моем апплете.

public static void Init()
    rw_des_key = (DESKey) KeyBuilder.buildKey(KeyBuilder.TYPE_DES, KeyBuilder.LENGTH_DES3_3KEY, false);
    rw_cipherDes = Cipher.getInstance(Cipher.ALG_DES_CBC_NOPAD, false);
    rw_des_key.setKey(rwdeskey, (short) 0);
}

public static short RWEncrypt(byte[] msg, short pos, short len, byte[] encMsg, short encPos) throws ArithmeticException, ArrayIndexOutOfBoundsException, ArrayStoreException, ClassCastException, IndexOutOfBoundsException, NegativeArraySizeException, NullPointerException, RuntimeException, SecurityException {
        rw_cipherDes.init(rw_des_key, Cipher.MODE_ENCRYPT);
        return rw_cipherDes.doFinal(msg, (short) pos, len, encMsg, (short) encPos);}

Если кто-то может сказать, в чем может быть дело, тогда я буду очень признателен!

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

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

Например (из вашего кода): -

rw_cipherDes = Cipher.getInstance (Cipher.ALG_DES_CBC_NOPAD, false);

Здесь флаг внешнего доступа имеет значение False, т.е. вы указываете API-интерфейсу шифра , а не , чтобы предоставить доступобъекта шифрования для любого внешнего приложения (для случая вызова этого API через разделяемый интерфейс).

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

return rw_cipherDes.doFinal (msg, (short) pos, len, encMsg, (short) encPos);}

Очевидно, что при вызове того же API изего собственное приложение, тогда оно будет работать нормально.

Решение позволяет externalAccess (true) для объекта.Это сделает его доступным через разделяемый интерфейс.

rw_cipherDes = Cipher.getInstance (Cipher.ALG_DES_CBC_NOPAD, true);

0 голосов
/ 10 мая 2018

Я исправляю свою проблему, меняя флаг externalAccess с False на True в Cipher.getInstance Функция:

Cipher.getInstance(Cipher.ALG_DES_CBC_NOPAD, true);

Это решило мою проблему.

...