gpt4 book ai didi

java - 3DES的手动实现(学术)

转载 作者:搜寻专家 更新时间:2023-11-01 03:26:26 26 4
gpt4 key购买 nike

对于我正在学习的类(class),我们正在手动实现 3DES 方案,这在纸面上非常简单(双 key ,使用 EDE 加密)。我选择了 Java 作为实现语言,但遇到了一个问题,即它如何使用不同的 key 处理加密/解密。尝试应用第二轮(即使用 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;
}

最佳答案

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

A transformation is of the form:

"algorithm/mode/padding" or "algorithm" (in the latter case, provider-specific default values for the mode and padding scheme are used).

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

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

  • 密码1 DES/ECB/PKCS5Padding
  • 密码2 DES/ECB/NoPadding
  • cipher3 DES/ECB/NoPadding

[额外提示]

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

关于java - 3DES的手动实现(学术),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12792604/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com