我正在尝试运行 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所说, key 必须是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);
我在文档中找不到任何相关内容。
最佳答案
这些行似乎是错误的:
byte[] keyBytes = {(byte) 0x01, (byte) 0x02, (byte) 0x03, (byte) 0x04};
desKey.setKey(keyBytes, (short) 0);
DES key 应该长于 4 个字节,对吗?标准DES key 长度为8字节(强度为56位)。
关于java - 如何使用Java Card加密示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32493512/