使用java通过3DES-128位CBC模式(填充零)解密数据

时间:2016-09-19 16:31:11

标签: java encryption cryptography 3des dukpt

在解密加密数据的过程中,我对它有一点挑战。如果有人能帮助我完成,我将非常高兴。

虽然我已经在执行此操作时研究了算法,因为我要从已经有基本派生密钥(BDK)的设备获取数据,最初加载的密钥序列号最初加载的密码输入设备密钥

在已提供的文档中,我们有最初加载的密钥序列号数据加密密钥变体跟踪2数据(位于明文)即可。

在这个例子中,我知道他们实际上使用了3DES-128位CBC模式(填充零)方法。

我现在的问题是,明文是如何从加密数据中获得的。我会很高兴,如果有人能让我通过(说明流程或算法用于解密这些数据)。

非常感谢你的时间。

2 个答案:

答案 0 :(得分:1)

由于你想尝试执行3DES-128位CBC模式(填充零)方法,试试这个git https://github.com/meshileya/dukpt用于从密文中获取明文。

由于您已经拥有BDK和KSN,只需尝试运行以下方法。

 public static void main(String[] args) {
     try {
        String theksn = "This should be your KSN";
        String encrypted = "This should be the encrypted data";
        String BDK = "The BDK you mentioned up there";

            tracking= DukptDecrypt.decrypt(theksn, BDK, encrypted);

            System.out.print("PlainText"+ tracking);
        }catch (Exception e){System.out.print(e);}

    }

答案 1 :(得分:0)

关于Oracle实现的一个更愚蠢的事情是SecretKeyFactory不支持DES ABA密钥,也称为“双密钥”DES密钥。

这些用于三重DES操作的密钥由单个DES密钥A组成,后跟单个DES密钥B.密钥A用于DES EDE(加密 - 解密 - 加密)中DES的第一次和最后一次迭代。 / p>

如果您使用软件,则可以创建一种创建此类密钥的方法。问题是生成的密钥实际上有192位,这根本不正确 - 它使得无法区分密钥大小。

无论如何,以下代码可用于生成DES ABA密钥:

private static final int DES_KEY_SIZE_BYTES = 64 / Byte.SIZE;
private static final int DES_ABA_KEY_SIZE_BYTES = 2 * DES_KEY_SIZE_BYTES;
private static final int DES_ABC_KEY_SIZE_BYTES = 3 * DES_KEY_SIZE_BYTES;

public static SecretKey createDES_ABAKey(byte[] key) {
    if (key.length != DES_ABA_KEY_SIZE_BYTES) {
        throw new IllegalArgumentException("128 bit key argument with size expected (including parity bits.)");
    }
    try {
        byte[] desABCKey = new byte[DES_ABC_KEY_SIZE_BYTES];
        System.arraycopy(key, 0, desABCKey, 0, DES_ABA_KEY_SIZE_BYTES);
        System.arraycopy(key, 0, desABCKey, DES_ABA_KEY_SIZE_BYTES, DES_KEY_SIZE_BYTES);
        SecretKeySpec spec = new SecretKeySpec(desABCKey, "DESede");
        SecretKeyFactory factory = SecretKeyFactory.getInstance("DESede");
        SecretKey desKey = factory.generateSecret(spec);
        return desKey;
    } catch (GeneralSecurityException e) {
        throw new RuntimeException("DES-EDE ABC key factory not functioning correctly", e);
    }
}

好的,这样我们就得到了CBC加密(没有填充,零IV):

private static final byte[] ENCRYPTION_KEY = Hex.decode("448D3F076D8304036A55A3D7E0055A78");
private static final byte[] PLAINTEXT = Hex.decode("1234567890ABCDEFFEDCBA0987654321");

public static void main(String[] args) throws Exception {
    SecretKey desABAKey = createDES_ABAKey(ENCRYPTION_KEY);
    Cipher desEDE = Cipher.getInstance("DESede/CBC/NoPadding");
    IvParameterSpec zeroIV = new IvParameterSpec(new byte[desEDE.getBlockSize()]);
    desEDE.init(Cipher.ENCRYPT_MODE, desABAKey, zeroIV);
    byte[] ciphertext = desEDE.doFinal(PLAINTEXT);
    System.out.println(Hex.toHexString(ciphertext));
}

我使用了Bouncy Castle十六进制编解码器,但也可以使用其他十六进制编解码器。