gpt4 book ai didi

java - 3des 在 java 中具有 2 个不同的键,结果为 null

转载 作者:太空宇宙 更新时间:2023-11-04 15:03:42 25 4
gpt4 key购买 nike

3des 在 java 中具有 2 个不同的键,结果为 null。

import java.security.spec.*;
import javax.crypto.*;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

public class DESedeEncryption {
public static void main(String[] args) {

SecretKey k1 = generateDESkey();
SecretKey k2 = generateDESkey();

String firstEncryption = desEncryption("plaintext", k1);
System.out.println("firstEncryption Value : "+firstEncryption);
String decryption = desDecryption(firstEncryption, k2);
System.out.println("decryption Value : "+decryption);
String secondEncryption = desEncryption(decryption, k1);
System.out.println("secondEncryption Value : "+secondEncryption);

}

public static SecretKey generateDESkey() {
KeyGenerator keyGen = null;
try {
keyGen = KeyGenerator.getInstance("DESede");
} catch (Exception ex) {
}
keyGen.init(112); // key length 56
SecretKey secretKey = keyGen.generateKey();
return secretKey;
}

public static String desEncryption(String strToEncrypt, SecretKey desKey) {
try {
Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, desKey);
BASE64Encoder base64encoder = new BASE64Encoder();
byte[] encryptedText = cipher.doFinal(strToEncrypt.getBytes());
String encryptedString =base64encoder.encode(encryptedText);
return encryptedString;
} catch (Exception ex) {
}
return null;
}

public static String desDecryption(String strToDecrypt, SecretKey desKey) {
try {
Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, desKey);
BASE64Decoder base64decoder = new BASE64Decoder();
byte[] encryptedText = base64decoder.decodeBuffer(strToDecrypt);
byte[] plainText = cipher.doFinal(encryptedText);
String decryptedString= bytes2String(plainText);
return decryptedString;
} catch (Exception ex) {
}
return null;
}

private static String bytes2String(byte[] bytes) {
StringBuffer stringBuffer = new StringBuffer();
for (int i = 0; i <bytes.length; i++) {
stringBuffer.append((char) bytes[i]);
}
return stringBuffer.toString();
}
}

当我运行上面的代码时,我得到了空值。请帮忙。

输出:

第一个加密值:jAihaGgiOzBSFwBWo3gpbw==

解密值:空

第二加密值:null

getting error:

firstEncryption Value : ygGPwCllarWvSH8td55j/w==
javax.crypto.BadPaddingException: Given final block not properly padded
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:811)
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:676)
at com.sun.crypto.provider.DESedeCipher.engineDoFinal(DESedeCipher.java:
294)
at javax.crypto.Cipher.doFinal(Cipher.java:2087)
at DESedeEncryption.desDecryption(DESedeEncryption.java:145)
at DESedeEncryption.main(DESedeEncryption.java:107)
decryption Value : null
java.lang.NullPointerException
at DESedeEncryption.desEncryption(DESedeEncryption.java:130)
at DESedeEncryption.main(DESedeEncryption.java:109)
secondEncryption Value : null

最佳答案

对称密码的工作原理是使用相同的 key 进行加密和解密,因此称为对称密码。 (对于大多数模式来说,IV 也是相同的,但 IV 不需要保密。)您使用一个 key 进行加密,并使用一个独立的 key 进行解密,该 key 以压倒性的概率不同(即,它可能无数次相同) quillion永恒)。那是行不通的。

也许您对 Triple-DES(也称为 3DES DESede 或 TDEA)的描述感到困惑。最初的 DES(或 DEA)密码使用 56 位 key (8 字节),这在 20 世纪 60 年代是安全的,但现在已经不安全了。 Triple-DES 是使用 DES 作为构建 block 来定义的,但具有 3 个 key (k1,k2,k3) 的捆绑,也可以将其视为组合的 168 位 key (24 字节);如果 k3=k1,则 key 被描述为 112 位,尽管它仍然存储为 24 字节。您对 KeyGenerator "DESede".init(112) 的调用正是这样做的;它生成一个 24 字节的包,其中 k3=k1 和 k2 不同。过去为了方便,Triple-DES被定义为使用单DES用k1加密,用k2解密,用k3加密,解密时则相反,因此得名DES-EDE或DESede。请参阅 http://en.wikipedia.org/wiki/Triple_DES

如果你真的想要,你可以使用密码“DES”在Java中自己实现Triple-DES,通过执行E,D,E(或反转D,E,D,如果使用),然后围绕它包装模式,请参阅Java Triple DES encryption with 2 different keys 。但使用密码“DESede”要容易得多,它可以为您做很多事情,将 DESede 像任何其他对称密码原语一样对待,如该问题中所回答的。

此外,ECB 模式也很危险。夸张地说,它总是像某些人那样不安全,但历史上许多由非专家设计的使用它的应用程序都是不安全的。除非您知道的内容比您的问题中明显的多得多,或者正在遵循(或接口(interface))这样做的人的设计,否则请使用更好的既定模式,例如 CBC 或 CTR。

关于java - 3des 在 java 中具有 2 个不同的键,结果为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22280721/

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