java - 如何使用Java Card加密示例?

标签 java servlets encryption javacard

我正在尝试运行 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_M1ALG_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/

相关文章:

c# - 我如何知道文件是否已在 .NET C# 中更改?

encryption - 使用 AES 时,有没有办法判断数据是使用 128 位 key 还是 256 位 key 加密的?

java - CAMT.053 Java 解析器

java - 获取第一个值 TreeMultiMap

java - 如何配置子域以用于 Java Servlet?

java - 使用注释帮助第一个 spring MVC 页面

java - 在运行时判断某个字段是否已被 Spock 模拟或监视的方法

java - list 合并失败错误

spring - 扩展 SpringBootServletInitializer 时如何注册 DispatcherServlets 并重写 onStartup

security - X.509 DN 的所有部分都是可选的吗?