Java函数实现数字加密与解密的方法
发布时间:2023-06-26 13:22:31
数字加密与解密是一种常见的加密方法,可以保护敏感数据的安全。在Java中,有多种方式可以实现数字加密与解密。本文将介绍其中的三种方法。
一、使用Java自带的加密库
Java自带了多种加密与解密库,其中最常用、最安全的是JCE(Java Cryptography Extension)。使用JCE,我们可以轻松地实现数字加密与解密。
加密代码示例:
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.security.SecureRandom;
public class EncryptUtil {
public static byte[] encrypt(String content, String password) {
try {
// 生成随机密钥
KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
secureRandom.setSeed(password.getBytes());
kgen.init(128, secureRandom);
SecretKey secretKey = kgen.generateKey();
// 加密
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] result = cipher.doFinal(content.getBytes());
return result;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
解密代码示例:
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.security.SecureRandom;
public class DecryptUtil {
public static String decrypt(byte[] content, String password) {
try {
// 生成随机密钥
KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
secureRandom.setSeed(password.getBytes());
kgen.init(128, secureRandom);
SecretKey secretKey = kgen.generateKey();
// 解密
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] result = cipher.doFinal(content);
return new String(result);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
二、使用第三方加密库
除了Java自带的加密库,还有许多第三方加密库可供使用。例如,我们可以使用BouncyCastle加密库来实现数字加密与解密。
加密代码示例:
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.security.Security;
public class EncryptUtil {
static {
Security.addProvider(new BouncyCastleProvider());
}
public static byte[] encrypt(String content, String password) {
try {
// 生成密钥
SecretKey secretKey = new SecretKeySpec(password.getBytes(), "Blowfish");
// 加密
Cipher cipher = Cipher.getInstance("Blowfish/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] result = cipher.doFinal(content.getBytes());
return result;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
解密代码示例:
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.security.Security;
public class DecryptUtil {
static {
Security.addProvider(new BouncyCastleProvider());
}
public static String decrypt(byte[] content, String password) {
try {
// 生成密钥
SecretKey secretKey = new SecretKeySpec(password.getBytes(), "Blowfish");
// 解密
Cipher cipher = Cipher.getInstance("Blowfish/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] result = cipher.doFinal(content);
return new String(result);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
三、使用哈希算法加密
哈希算法是一种不可逆的加密方法,它将数据映射成一个固定长度的数值。在Java中,使用MessageDigest类可以轻松地实现哈希加密。
加密代码示例:
import java.security.MessageDigest;
public class EncryptUtil {
public static String encrypt(String content) {
try {
// 获取MD5哈希算法实例
MessageDigest md = MessageDigest.getInstance("MD5");
// 计算哈希值
md.update(content.getBytes());
byte[] result = md.digest();
// 将哈希值转换成字符串
StringBuffer sb = new StringBuffer();
for (int i = 0; i < result.length; i++) {
String hex = Integer.toHexString(0xff & result[i]);
if (hex.length() == 1) sb.append('0');
sb.append(hex);
}
return sb.toString();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
由于哈希加密是不可逆的,因此无法实现解密。但是,在实际应用中,我们可以将明文先进行哈希加密,再将加密后的内容存储在数据库中。这样,当需要验证用户的身份时,只需将用户输入的明文进行哈希加密后与数据库中存储的值进行比对即可。
总结
本文介绍了Java中三种实现数字加密与解密的方法。其中,Java自带的加密库和第三方加密库都是通过对称加密算法实现的。在使用时,需要注意密钥的生成和保存。哈希加密虽然是不可逆的,但在一些场景下仍是非常有用的。在实际应用中,可以根据具体情况选择合适的加密方法进行加密与解密。
