gpt4 book ai didi

java - 如何在 Java 中使用三重 des(3des) 的三个键

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:28:50 25 4
gpt4 key购买 nike

我在 stackoverflow 中找到了一个链接 use-3des-encryption-decryption-in-java ,但实际上该方法仅使用两个参数:HG58YZ3CR9”和“IvParameterSpec iv = new IvParameterSpec(new byte[8]);
但是最强大的triple des选项可以使用三个不同的 key 来加密消息。那么如何做到呢?我在 Cipher 中找到了一个方法,它使用“SecureRandom”作为另一个参数。这是正确的方法吗?
第一种方法代码如下:

import java.security.MessageDigest;
import java.util.Arrays;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

public class TripleDESTest {

public static void main(String[] args) throws Exception {

String text = "kyle boon";

byte[] codedtext = new TripleDESTest().encrypt(text);
String decodedtext = new TripleDESTest().decrypt(codedtext);

System.out.println(codedtext); // this is a byte array, you'll just see a reference to an array
System.out.println(decodedtext); // This correctly shows "kyle boon"
}

public byte[] encrypt(String message) throws Exception {
final MessageDigest md = MessageDigest.getInstance("SHA-1");
final byte[] digestOfPassword = md.digest("HG58YZ3CR9"
.getBytes("utf-8"));
final byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24);
for (int j = 0, k = 16; j < 8;) {
keyBytes[k++] = keyBytes[j++];
}

final SecretKey key = new SecretKeySpec(keyBytes, "DESede");
final IvParameterSpec iv = new IvParameterSpec(new byte[8]);
final Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key, iv);

final byte[] plainTextBytes = message.getBytes("utf-8");
final byte[] cipherText = cipher.doFinal(plainTextBytes);
// final String encodedCipherText = new sun.misc.BASE64Encoder()
// .encode(cipherText);

return cipherText;
}

public String decrypt(byte[] message) throws Exception {
final MessageDigest md = MessageDigest.getInstance("SHA-1");
final byte[] digestOfPassword = md.digest("HG58YZ3CR9"
.getBytes("utf-8"));
final byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24);
for (int j = 0, k = 16; j < 8;) {
keyBytes[k++] = keyBytes[j++];
}

final SecretKey key = new SecretKeySpec(keyBytes, "DESede");
final IvParameterSpec iv = new IvParameterSpec(new byte[8]);
final Cipher decipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
decipher.init(Cipher.DECRYPT_MODE, key, iv);

// final byte[] encData = new
// sun.misc.BASE64Decoder().decodeBuffer(message);
final byte[] plainText = decipher.doFinal(message);

return new String(plainText, "UTF-8");
}
}

最佳答案

根据 this document ,只需将密码传递给 168 位长的 key 即可。

Keysize must be equal to 112 or 168.

A keysize of 112 will generate a Triple DES key with 2 intermediate keys, and a keysize of 168 will generate a Triple DES key with 3 intermediate keys.

您的代码似乎做了一些有问题的事情来弥补 MD5 的输出只有 128 位长这一事实。

从互联网上复制粘贴加密代码不会产生安全的应用程序。使用静态 IV 折衷了 CBC 模式优于 ECB 的几个原因。如果您使用的是静态 key ,您可能应该考虑使用安全的随机数生成器生成随机字节,而不是从短的 ASCII 字符串中导出 key 。此外,绝对没有理由在新应用程序中使用三重 DES 而不是 AES。

关于java - 如何在 Java 中使用三重 des(3des) 的三个键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17465732/

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