java - 编辑代码示例以指定 DES key 值

标签 java security encryption key des

我有一个使用 DES 的工作代码示例(见下文),但我想指定要使用的 key 数据。如何编辑代码示例来执行此操作?

import java.security.InvalidKeyException;  
import java.security.NoSuchAlgorithmException;    
import javax.crypto.BadPaddingException;  
import javax.crypto.Cipher;  
import javax.crypto.IllegalBlockSizeException;  
import javax.crypto.KeyGenerator;  
import javax.crypto.NoSuchPaddingException;  
import javax.crypto.SecretKey;

public class DESEncryptionDecryption {

private static Cipher encryptCipher;  
private static Cipher decryptCipher; 
public static void main(String[] args) {  
try {
KeyGenerator keygenerator = KeyGenerator.getInstance("DES");  
SecretKey secretKey = keygenerator.generateKey();  

encryptCipher = Cipher.getInstance("DES/ECB/PKCS5Padding");  
encryptCipher.init(Cipher.ENCRYPT_MODE, secretKey);  
byte[] encryptedData = encryptData("Classified Information!");  

decryptCipher = Cipher.getInstance("DES/ECB/PKCS5Padding");  
decryptCipher.init(Cipher.DECRYPT_MODE, secretKey);  
decryptData(encryptedData);
}}}

最佳答案

不要使用KeyGenerator,使用SecretKeyFactory:

String desKey = "0123456789abcdef"; // value from user  
byte[] keyBytes = DatatypeConverter.parseHexBinary(desKey);

SecretKeyFactory factory = SecretKeyFactory.getInstance("DES");
SecretKey key = factory.generateSecret(new DESKeySpec(keyBytes));

请注意,DES 不是一种安全算法。考虑使用 AES 或三重 DES (DESede)。


对于德塞德:

String desKey = "0123456789abcdef0123456789abcdef0123456789abcdef"; // user value (24 bytes)  
byte[] keyBytes = DatatypeConverter.parseHexBinary(desKey);

SecretKeyFactory factory = SecretKeyFactory.getInstance("DESede");
SecretKey key = factory.generateSecret(new DESedeKeySpec(keyBytes));

对于 AES,只需执行以下操作:

String aesKey = "0123456789abcdef0123456789abcdef"; // user value (16/24/32 bytes)
byte[] keyBytes = DatatypeConverter.parseHexBinary(aesKey);
SecretKey key = new SecretKeySpec(keyBytes, "AES"); 

关于java - 编辑代码示例以指定 DES key 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22858497/

相关文章:

c - sprintf/snprintf 哪个更安全?

ruby-on-rails - Rails OpenSSL::Cipher 为 AES-CBC-256 使用什么样的填充?

c++ - SEAL:平方运算后解密不正确,即使密文的噪声预算大于零

go - 如何解密HTTPS数据包

java - 在 Linux 上安装 Java EE SDK 时出错

javascript - 对实际被黑网站的取证分析

java - 将 certificate.pfx 导入到 cacerts 中,但仍然出现 "PKIX...unable to find valid certification path to requested target"错误。做什么?

javascript - 使用 Chrome 扩展中的 prompt() 函数来询问密码是否安全?

java - 调用 Applet 方法 - Firefox 12 错误

java - 在 log4j 中包含堆栈跟踪