DES(Data Encryption Standard)是一种对称加密方式,加密和解密使用相同的密钥。
在DES中,使用了一个 56 位的密钥以及附加的8位奇偶校验位,产生最大64 位的分组大小。加密过程中,将加密的文本块分成两半。使用子密钥对其中一半应用循环功能,然后将输出与另一半进行“异或”运算;接着交换这两半。循环往复。DES 使用16个循环,但最后一个循环不交换。
如果加密的时候使用随机生成的密钥并未保存,解密将因为没有密钥而无法进行。
基本步骤:
1. 获取密钥(KeyGenerator或者SecretKeyFactory)
2. 读取输入流为字节数组。
3. 实例化Cipher并指定模式(加密或解密等)和密钥
4. 加解密并产生输出流
public class DESHelper {
private static String keyFileName = "des_key.xml"; // 密钥文件名
private static final String ALGORITHM = "DES"; // 加密算法名
private static final SecureRandom sr = new SecureRandom(); // 强加密随机数生成器
// 测试方法
public static void main(String[] args) {
// 加解密字符串
byte[] encryptedObj = encryptStr("心有灵犀一点通", "astronomer");
System.out.println(new String(encryptedObj));
byte[] decryptedObj = decrypt(encryptedObj, "astronomer");
System.out.println(new String(decryptedObj));
// 加解密文件
encryptFile("plain.txt", "plain_encrypt.txt", "astronomer");
decryptFile("plain_encrypt.txt", "plain_encrypt_decrypt.txt", "astronomer");
// 使用保存的key加解密字符串
byte[] encryptedObj = encryptStr("春天花会开");
System.out.println(new String(encryptedObj));
byte[] decryptedObj = decrypt(encryptedObj);
System.out.println(new String(decryptedObj));
}
// 保存生成的密钥
public static void storeSecretKey() {
FileOutputStream out = null;
ObjectOutputStream oout = null;
try {
KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM);
keyGenerator.init(sr);
SecretKey secretKey = keyGenerator.generateKey();
out = new FileOutputStream(keyFileName);
oout = new ObjectOutputStream(out);
oout.writeObject(secretKey);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
oout.close();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
// 获取保存的密钥
public static SecretKey loadSecretKey() {
SecretKey secretKey = null;
try {
FileInputStream in = new FileInputStream(keyFileName);
ObjectInputStream oin = new ObjectInputStream(in);
secretKey = (SecretKey)oin.readObject();
} catch (Exception e) {
e.printStackTrace();
}
return secretKey;
}
// 生成密钥。由于每次产生的密钥都不同,不适合实际使用。
private static SecretKey generateSecretKey() {
KeyGenerator keyGenerator = null;
try {
keyGenerator = KeyGenerator.getInstance(ALGORITHM); // Get the key generator
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return keyGenerator.generateKey(); // Generate the secret key
}
// 根据密码的消息摘要和DESKeySpec生成密钥。
private static SecretKey generateSecretKey(String key) {
SecretKey secretKey = null;
try {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] bytes = key.getBytes();
md.update(bytes, 0, bytes.length);
byte[] mdBytes = md.digest(); // Generate 16 bytes
byte[] truncatedBytes = Arrays.copyOf(mdBytes, 8); // Fetch 8 bytes for DESKeySpec
DESKeySpec keySpec = new DESKeySpec(truncatedBytes);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM);
secretKey = keyFactory.generateSecret(keySpec);
} catch (Exception e) {
e.printStackTrace();
}
return secretKey;
}
// 根据密码和keyGenerator生成密钥。
private static SecretKey generateSecretKey2(String key) {
KeyGenerator keyGenerator = null;
try {
keyGenerator = KeyGenerator.getInstance(ALGORITHM); // Get the key generator
SecureRandom sr = new SecureRandom(key.getBytes()); // Instantiate an instance of SecureRandom
keyGenerator.init(sr);
} catch (Exception e) {
e.printStackTrace();
}
return keyGenerator.generateKey();
}
// 根据密码加密文件。
public static void encryptFile(String file, String newFile, String key) {
SecretKey secretKey = generateSecretKey(key);
encryptFile(file, newFile, secretKey);
}
public static void encryptFile(String file, String newFile) {
File keyFile = new File(keyFileName);
if (!keyFile.exists()) {
storeSecretKey();
}
SecretKey secretKey = loadSecretKey();
encryptFile(file, newFile, secretKey);
}
private static void encryptFile(String file, String newFile, SecretKey secretKey) {
InputStream in = null;
CipherInputStream cin = null;
OutputStream out = null;
try {
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, secretKey, sr);
in = new FileInputStream(file);
cin = new CipherInputStream(in, cipher);
out = new FileOutputStream(newFile);
byte[] buffer = new byte[1024];
int count = 0;
while ((count = cin.read(buffer)) > 0) {
out.write(buffer, 0, count);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
cin.close();
in.close();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
// 根据密码解密文件。
public static void decryptFile(String file, String newFile, String key) {
SecretKey secretKey = generateSecretKey(key);
decryptFile(file, newFile, secretKey);
}
public static void decryptFile(String file, String newFile) {
File keyFile = new File(keyFileName);
if (!keyFile.exists()) {
storeSecretKey();
}
SecretKey secretKey = loadSecretKey();
decryptFile(file, newFile, secretKey);
}
private static void decryptFile(String file, String newFile, SecretKey secretKey) {
InputStream in = null;
CipherOutputStream cout = null;
OutputStream out = null;
try {
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, secretKey, sr);
in = new FileInputStream(file);
out = new FileOutputStream(newFile);
cout = new CipherOutputStream(out, cipher);
byte[] buffer = new byte[1024];
int count = 0;
while ((count = in.read(buffer)) > 0) {
cout.write(buffer, 0, count);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
cout.close();
out.close();
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
// 加密字符串。
public static byte[] encryptStr(String str) {
byte[] bytes = str.getBytes();
File keyFile = new File(keyFileName);
if (!keyFile.exists()) {
storeSecretKey();
}
SecretKey secretKey = loadSecretKey();
return encrypt(bytes, secretKey);
}
// 根据密码加密字符串。
public static byte[] encryptStr(String str, String key) {
byte[] bytes = str.getBytes();
SecretKey secretKey = generateSecretKey(key);
return encrypt(bytes, secretKey);
}
// 根据密码加密字节数组。
public static byte[] encrypt(byte[] bytes, String key) {
SecretKey secretKey = generateSecretKey(key);
return encrypt(bytes, secretKey);
}
// 加密字节数组。
public static byte[] encrypt(byte[] bytes) {
File keyFile = new File(keyFileName);
if (!keyFile.exists()) {
storeSecretKey();
}
SecretKey secretKey = loadSecretKey();
return encrypt(bytes, secretKey);
}
private static byte[] encrypt(byte[] bytes, SecretKey secretKey) {
byte[] encryptedObj = null;
try {
Cipher cipher = Cipher.getInstance(ALGORITHM); // Get the cipher
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
encryptedObj = cipher.doFinal(bytes);
} catch (Exception e) {
e.printStackTrace();
}
return encryptedObj;
}
// 解密字符串。
public static byte[] decryptStr(String str) {
byte[] bytes = str.getBytes();
File keyFile = new File(keyFileName);
if (!keyFile.exists()) {
storeSecretKey();
}
SecretKey secretKey = loadSecretKey();
return decrypt(bytes, secretKey);
}
// 根据密码解密字符串。
public static byte[] decryptStr(String str, String key) {
byte[] bytes = str.getBytes();
SecretKey secretKey = generateSecretKey(key);
return decrypt(bytes, secretKey);
}
// 根据密码解密字节数组。
public static byte[] decrypt(byte[] bytes, String key) {
SecretKey secretKey = generateSecretKey(key);
return decrypt(bytes, secretKey);
}
// 解密字节数组。
public static byte[] decrypt(byte[] bytes) {
File keyFile = new File(keyFileName);
if (!keyFile.exists()) {
storeSecretKey();
}
SecretKey secretKey = loadSecretKey();
return decrypt(bytes, secretKey);
}
private static byte[] decrypt(byte[] bytes, SecretKey secretKey) {
byte[] decryptedObj = null;
try {
Cipher cipher = Cipher.getInstance(ALGORITHM); // Get the cipher
cipher.init(Cipher.DECRYPT_MODE, secretKey);
decryptedObj = cipher.doFinal(bytes);
} catch (Exception e) {
e.printStackTrace();
}
return decryptedObj;
}
分享到:
相关推荐
Java中的DES(Data Encryption Standard)是一种对称加密算法,它基于一个固定的64位密钥对数据进行加密和解密。DES在80年代被广泛使用,但由于其密钥长度较短,现在已经被AES(Advanced Encryption Standard)所...
JAVA DES加密解密
在Java中实现DES加解密,我们需要使用`javax.crypto`包中的类。首先,我们需要创建一个密钥,这通常通过`KeyGenerator`类完成,指定DES作为算法。然后,我们使用`Cipher`类来执行加密和解密操作,该类提供了`init`...
java的DES加密解密:用于密码在数据库的加密,解码类
**JAVA实现DES加解密系统** DES(Data Encryption Standard)是一种经典的对称加密算法,它在信息安全领域有着广泛的应用。本文将深入探讨如何使用Java语言实现DES加解密系统,以及涉及的相关技术点。 首先,DES...
Java DES加解密算法 DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块
在Java中实现DES加密和解密是一项常见的任务,通常涉及到`javax.crypto`包中的类和接口。本篇文章将详细阐述DES加密解密的Java实现过程。 首先,我们需要了解DES算法的基本原理。DES是一种块密码,它将明文数据分成...
Java和JavaScript之间的DES加密解密是信息安全领域中的一个重要话题,主要涉及到数据的保护和通信的安全。DES(Data Encryption Standard)是一种古老的对称加密算法,尽管它在安全性上已不被视为最佳选择,但在某些...
DES算法实现包括文件选择,包括界面,可以实现文件的加密和解密
本话题主要探讨如何在Linux环境下,使用C语言和Java实现DES加密和解密。 一、DES算法概述 DES是一种块密码,它将64位的数据块作为输入,通过一系列复杂的变换,将其转化为另一64位的密文。DES使用56位的密钥,但...
用java写的des算法加密及解密过程
2. JAVA DES加密解密: Java提供了javax.crypto包来处理加密解密。使用DES时,需要创建一个KeyGenerator对象,设置为DES算法,然后生成密钥。接着,使用Cipher类的`init()`方法初始化加密或解密模式,最后调用`...
des加密解密算法,通过DES加密解密实现一个String字符串的加密和解密.
本文将详细介绍如何在Java中实现DES加解密和MAC算法,并探讨其应用。 首先,DES是一种对称加密算法,由IBM公司开发,后被美国国家标准局采纳为标准。它使用64位的密钥对数据进行加密和解密,但实际有效密钥长度只有...
Java实现des加密解密算法,des加密解密算法
目前测试了通过的文件类 rar,txt,xml等
标题中的"Des.JAVA.rar_DES.java_DES加密_java DES 128bit_java des_加密解密"表明这是一个关于Java实现DES(Data Encryption Standard)加密算法的压缩包,其中包含用于加密和解密的源代码。DES是一种对称加密算法...
DES加密解密java工具类 public static final String KEY_ALGORITHM = "DES"; public static final String CIPHER_ALGORITHM = "DES/ECB/PKCS5PADDING"; validKeySpecException, NoSuchPaddingException, ...
在Java中,DES加密解密主要通过`javax.crypto`包中的类来实现。首先,我们需要一个密钥,通常是8字节的字节数组。然后,使用`KeyGenerator`生成一个DES密钥。接下来,创建`Cipher`对象并初始化它,根据需要进行加密...
在Java和JavaScript中实现3DES加密和解密,主要涉及以下几个关键知识点: 1. **密钥生成**:3DES需要一个168位的密钥,但通常我们提供的是一个128位或更短的密钥。Java中的`javax.crypto.SecretKeyFactory`和`javax...