2015-09-10 2 views
2

Я пытаюсь запустить run example from IBM website. Я написал этот метод:Как использовать образец криптограммы Java Card?

public static byte[] cipher(byte[] inputData) { 
    Cipher cipher 
     = Cipher.getInstance(
       Cipher.ALG_DES_CBC_NOPAD, true); 

    DESKey desKey = (DESKey) KeyBuilder.buildKey(
          KeyBuilder.TYPE_DES, 
          KeyBuilder.LENGTH_DES, 
          false); 

    byte[] keyBytes = {(byte) 0x01, (byte) 0x02, (byte) 0x03, (byte) 0x04}; 
    desKey.setKey(keyBytes, (short) 0); 

    cipher.init(desKey, Cipher.MODE_ENCRYPT); 
    byte[] outputData = new byte[8]; 

    cipher.doFinal(inputData, (short) 0, (short) inputData.length, outputData, (short) 0); 
    return outputData; 
} 

И этот метод вызывается cipher("test".getBytes());. Когда я вызываю этот сервер сервлета, я даю мне внутреннюю ошибку сервера и javacard.security.CryptoException.

Я пробовал ALG_DES_CBC_ISO9797_M1, ALG_DES_CBC_ISO9797_M2 (и другие) и получил то же исключение.

Как сделать простой пример шифрования на подключенной Java-карте?

UPDATE

Как @vojta сказал, ключ должен быть длиной 8 байт. Так что это должно быть что-то вроде этого:

byte[] keyBytes = {(byte) 0x01, (byte) 0x02, (byte) 0x03, (byte) 0x04, (byte) 0x01, (byte) 0x02, (byte) 0x03, (byte) 0x04}; 

Я не знаю, почему, но это работает только если заменить

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

с

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

Я не мог найти ничего об этом в документации.

+2

Всего несколько замечаний: не создавать новые массивы байтов в методах -> вы будете запускать из памяти очень скоро. 'outputData' массив должен быть длиннее, правильно? В противном случае он может содержать только один блок данных. – vojta

+0

Спасибо. Это всего лишь образец, но я буду принимать во внимание. – LEQADA

ответ

2

Эти строки, кажется, не так:

byte[] keyBytes = {(byte) 0x01, (byte) 0x02, (byte) 0x03, (byte) 0x04}; 
desKey.setKey(keyBytes, (short) 0); 

ключ DES должен быть больше, чем 4 байта, не так ли? Стандартный ключ DES имеет длину 8 байтов (с прочностью 56 бит).

+0

Я изменил его на byte [] keyBytes = {(byte) 0x01, (байт) 0x02, (байт) 0x03, (байт) 0x04, (байт) 0x01, (байт) 0x02, (байт) 0x03, (байт) 0x04}; Но получил то же исключение. – LEQADA

+0

@ user980828 Какой результат getReason вызвал ваш экземпляр исключения? – vojta

+0

Результат getReason() равен 3. – LEQADA

1

В дополнение к ответу @ vojta входные данные должны быть выровнены по блоку.

Ваши данные "test".getBytes() имеют длину 4, которая недействительна для Cipher.ALG_DES_CBC_NOPAD (но действительна для Cipher.ALG_DES_CBC_ISO9797_M2).

Странно, что это должно привести к CryptoException.ILLEGAL_USE причину (которая 5 противоположность 3 вы получаете) ...

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