对于我正在学习的一门课程,我们正在手动实施 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;
}