手动实施3DES(学术)

时间:2012-10-09 03:55:41

标签: java cryptography 3des

对于我正在学习的课程,我们正在手动实施3DES方案,这在纸上很简单(两个密钥,EDE加密)。我选择Java作为实现语言,但是它遇到了如何使用不同的密钥处理加密/解密的问题。尝试应用第二轮时(即使用K2“解密”),我一直收到javax.crypto.BadPaddingException错误。默认的DES Cipher使用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;
    } 

1 个答案:

答案 0 :(得分:2)

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

  

转换的形式如下:

     

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

所以,你应该明确告诉它不要在cipher2&上使用填充。 cipher3(你还没有创建后者)。

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

  • cipher1 DES / ECB / PKCS5Padding
  • cipher2 DES / ECB / NoPadding
  • cipher3 DES / ECB / NoPadding

[EXTRA HINT]

对于解密,你应该以不同的方式初始化密码,你也应该对密码进行重新排序。