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;
}
分享到:
相关推荐
DES加密解密算法的C语言实现 DES(Data Encryption Standard)是一种对称密钥 BLOCK 加密算法,使用 56 位密钥对 64 位数据块进行加密。下面是 DES 加密解密算法的 C 语言实现的知识点总结。 字节与二进制转换 在...
标题中的“3DES加密解密工具”指的是一个用于执行三重数据加密标准(3DES,Triple DES)的软件工具,这种工具通常用于保护敏感数据的安全,确保信息在传输过程中的机密性。3DES是DES(Data Encryption Standard,...
在JavaScript环境中,DES加解密可以用于保护敏感数据,如用户密码、API密钥等,确保在网络传输中数据的安全性。 在JavaScript中实现DES加解密,通常需要借助库,如`crypto-js`。这个库提供了多种加密算法,包括DES...
在这个项目中,我们将探讨如何使用MFC在VC++环境中实现DES加密和解密。 首先,DES是一种块加密算法,它将明文数据分为64位的块进行处理。但是,由于其中7位是奇偶校验位,实际有效密钥长度为56位。DES通过一系列...
DES加密解密(c++实现)
下面我们将详细讨论C#实现DES加解密的相关知识点。 1. **基本概念**: - **对称加密**:加密和解密使用同一密钥。 - **DES算法**:基于Feistel结构,通过多次迭代实现数据的加密和解密。 - **密钥长度**:DES的...
本项目是使用Visual C++实现3DES加解密功能的一个实例,下面将详细介绍3DES算法及其在Visual C++中的实现。 3DES,全称为三重DES,是对DES(Data Encryption Standard)的加强版。DES是一种块密码,采用64位的数据...
DES加密解密实验旨在帮助学生理解其工作原理,并深入研究DES的弱点,特别是关于弱密钥的问题。 实验的核心是DES算法的执行流程,主要包括以下几个步骤: 1. **初始置换(IP)**:这是加密过程的第一步,用于打乱...
Java和JavaScript之间的DES加密解密是信息安全领域中的一个重要话题,主要涉及到数据的保护和通信的安全。DES(Data Encryption Standard)是一种古老的对称加密算法,尽管它在安全性上已不被视为最佳选择,但在某些...
标题中的“Delphi7与C#实现Des加解密互通Demo”指的是一个示例项目,该项目旨在演示如何在Delphi 7和C#之间进行DES加密和解密操作,确保两个环境下的数据一致性。全网找遍只此一份,表明这个示例可能比较罕见且具有...
本文将深入探讨如何使用MFC(Microsoft Foundation Classes)库实现DES(Data Encryption Standard)加密解密算法,以及如何支持文件的打开和保存操作。 DES是一种对称加密算法,由IBM在1970年代开发,并在1977年被...
本篇文章将详细探讨如何在VB环境中实现DES加密和解密,以及相关的VBA(Visual Basic for Applications)应用。 首先,DES是一种块加密算法,它的基本工作原理是将明文数据分为64位的块,然后通过一系列复杂的数学...
在VB6.0(Visual Basic 6.0)环境中实现DES加密解密是编程中常见的一种需求,主要用于保护敏感数据的安全。下面将详细阐述DES加密解密原理及其在VB6.0中的实现方法。 1. **DES加密原理**: - **初始置换**:将明文...
DES加密 解密 方法: DESr DESw 支持3DES加密 解密 类中利用函数重载的方式 实现两种加密方式 加密后为16进制字符串 使用方法: 实例化一个对象 然后就可以随便用了。 如 DES加密 解密 CString sd,sd2; yxyDES2 ...
在这个“QT做的DES加解密实例”中,我们将深入探讨如何使用QT库来实现DES的加解密功能。 首先,我们需要理解DES的工作原理。DES是一种块加密算法,它将64位的数据块作为输入,并使用56位的密钥进行加密或解密。实际...
4. **创建加密和解密对象**:使用`DES_EDE3`或`DES_EDE2`(三重DES或双密钥DES)来增强安全性,创建加密和解密对象,如`DES_EDE3::Encryption encryptor(key, sizeof(key))`和`DES_EDE3::Decryption decryptor(key, ...
微信小游戏DES加解密DEMO是一个实用的示例项目,主要展示了如何在微信小游戏平台中进行数据的安全加密和解密操作。DES(Data Encryption Standard)是一种经典的对称加密算法,而`crypto-js`是一个JavaScript库,它...
des加密解密工具
### C语言实现DES加解密 #### DES简介 DES(Data Encryption Standard,数据加密标准)是一种对称密钥算法,用于加密和解密数据。它最初由IBM开发,并于1977年被美国国家标准局采纳为官方标准。DES算法采用64位块...
可能包含的函数有`des_encrypt()`用于加密,`des_decrypt()`用于解密,以及辅助函数如`initial_permutation()`、`permutation_function_1()`等,分别对应DES算法中的各个阶段。 由于代码未给出,我们无法详细讨论...