4

对于我正在学习的一门课程,我们正在手动实施 3DES 方案,这在纸上非常简单(双键,使用 EDE 加密)。我选择了 Java 作为实现语言,但遇到了一个问题,即它如何使用不同的密钥处理加密/解密。在尝试应用第二轮(即使用 K2 进行“解密”)时,我不断收到 javax.crypto.BadPaddingException 错误。默认的 DES 密码使用 PKCS5Padding,我认为这是问题所在,但我不确定如何解决它。我的加密代码如下(我希望它不是太直截了当,更不用说我忽略了一些简单的东西)。先感谢您。

键定义(非常基本,我会改进它,因为我在浏览时看到了一些不同的方法)

        KeyGenerator kgen = KeyGenerator.getInstance("DES");
        SecretKey sk_1 = kgen.generateKey(); 
        SecretKey sk_2 = kgen.generateKey();
        byte[] raw_1 = sk_1.getEncoded();
        byte[] raw_2 = sk_2.getEncoded();

        spec_1 = new SecretKeySpec(raw_1, "DES"); //key 1
        spec_2 = new SecretKeySpec(raw_2, "DES"); //key 2

        cipher = Cipher.getInstance("DES"); //standard mode is ECB which is block-by-block w/PKCS5Padding
        cipher2 = Cipher.getInstance("DES");


    protected byte[] get3DESEncryption(byte[] plaintext) throws Exception{
        byte[] output = new byte[plaintext.length];
        System.out.println("output len init: " + output.length);
        cipher.init(Cipher.ENCRYPT_MODE, spec_1);
        cipher2.init(Cipher.DECRYPT_MODE, spec_2);

        //first encryption round, key 1 used
        output = cipher.doFinal(plaintext);
        //second "encryption" round, key 2 used but decrypt run
        output = cipher2.doFinal(output);
        //third encryption round, key 1 used
        output = cipher.doFinal(output);

        //return ciphertext
        return output;
    } 
4

1 回答 1

2

问题是您不应该在第二步(解密)和第三步(加密)中使用任何填充。当你实际应用时EDE,你应该只填充纯文本。

转换的形式为:

“算法/模式/填充”或“算法”(在后一种情况下,使用模式和填充方案的特定于提供程序的默认值)。

因此,您应该明确告诉它不要在 cipher2 和 cipher3 上使用填充(您还没有创建后者)。

因此,您应该拥有三个密码对象:

  • cipher1 DES/ECB/PKCS5Padding
  • cipher2 DES/ECB/NoPadding
  • 密码 3 DES/ECB/NoPadding

[额外提示]

对于解密,您应该以不同的方式初始化密码,并且还应该重新排序密码。

于 2012-10-09T04:03:45.030 回答