Я пытаюсь запустить 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);
Я не мог найти ничего об этом в документации.
Всего несколько замечаний: не создавать новые массивы байтов в методах -> вы будете запускать из памяти очень скоро. 'outputData' массив должен быть длиннее, правильно? В противном случае он может содержать только один блок данных. – vojta
Спасибо. Это всего лишь образец, но я буду принимать во внимание. – LEQADA