如何使用Java Card加密样本?

时间:2015-09-10 05:02:55

标签: 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所说,密钥必须长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);

我在文档中找不到任何相关内容。

1 个答案:

答案 0 :(得分:1)

除@ vojta的答案外,输入数据应该是块对齐的。

您的输入数据"test".getBytes()的长度为4,对Cipher.ALG_DES_CBC_NOPAD无效(但对Cipher.ALG_DES_CBC_ISO9797_M2有效)。

奇怪的是,这应该导致CryptoException.ILLEGAL_USE理由(这与你得到的3相反)......