我正在尝试运行example from IBM website。 我写了这个方法:
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());
。当我调用这个servlet服务器时,我给出了内部服务器错误和javacard.security.CryptoException
。
我尝试了ALG_DES_CBC_ISO9797_M1
,ALG_DES_CBC_ISO9797_M2
(和其他人)并获得了同样的例外。
如何在Java Card Connected上运行简单的密码示例?
更新
正如@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);
我在文档中找不到任何相关内容。
答案 0 :(得分:1)
除@ vojta的答案外,输入数据应该是块对齐的。
您的输入数据"test".getBytes()
的长度为4,对Cipher.ALG_DES_CBC_NOPAD
无效(但对Cipher.ALG_DES_CBC_ISO9797_M2
有效)。
奇怪的是,这应该导致CryptoException.ILLEGAL_USE
理由(这与你得到的3相反)......