Java函数:如何实现字符串的加密和解密?
字符串加密和解密是一种数据安全措施,目的是将敏感信息转换成一种密文形式,以免被未经授权的人员或者非法机构窃取和查看。在Java中实现字符串的加密和解密,常用的方式有以下几种:
1. 对称加密算法
对称加密算法是最常用的加密算法之一。其特点是加密和解密使用相同的密钥。常见的对称加密算法有DES、3DES、AES等。
DES加密算法
DES是Data Encryption Standard(数据加密标准)的缩写,是一种对称加密算法,加密和解密使用相同的密钥。DES加密算法的代码如下:
public static String encryptDES(String data, String key) throws Exception {
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, generateKey(key));
byte[] bytes = cipher.doFinal(data.getBytes("UTF-8"));
return Base64.getEncoder().encodeToString(bytes);
}
public static String decryptDES(String data, String key) throws Exception {
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, generateKey(key));
byte[] bytes = Base64.getDecoder().decode(data);
return new String(cipher.doFinal(bytes), "UTF-8");
}
private static Key generateKey(String keyStr) throws Exception {
DESKeySpec keyspec = new DESKeySpec(keyStr.getBytes("UTF-8"));
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
return keyFactory.generateSecret(keyspec);
}
3DES加密算法
3DES是Triple Data Encryption Standard(三重数据加密标准)的缩写,是一种对称加密算法。3DES加密算法的代码如下:
public static String encrypt3DES(String data, String key) throws Exception {
Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, generateKey(key));
byte[] bytes = cipher.doFinal(data.getBytes("UTF-8"));
return Base64.getEncoder().encodeToString(bytes);
}
public static String decrypt3DES(String data, String key) throws Exception {
Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, generateKey(key));
byte[] bytes = Base64.getDecoder().decode(data);
return new String(cipher.doFinal(bytes), "UTF-8");
}
private static Key generateKey(String keyStr) throws Exception {
DESedeKeySpec keyspec = new DESedeKeySpec(keyStr.getBytes("UTF-8"));
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");
return keyFactory.generateSecret(keyspec);
}
AES加密算法
AES是Advanced Encryption Standard(高级加密标准)的缩写,是一种对称加密算法。AES加密算法的代码如下:
public static String encryptAES(String data, String key) throws Exception {
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, generateKey(key));
byte[] bytes = cipher.doFinal(data.getBytes("UTF-8"));
return Base64.getEncoder().encodeToString(bytes);
}
public static String decryptAES(String data, String key) throws Exception {
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, generateKey(key));
byte[] bytes = Base64.getDecoder().decode(data);
return new String(cipher.doFinal(bytes), "UTF-8");
}
private static Key generateKey(String keyStr) throws Exception {
MessageDigest md5 = MessageDigest.getInstance("MD5");
byte[] keyBytes = md5.digest(keyStr.getBytes("UTF-8"));
return new SecretKeySpec(keyBytes, "AES");
}
2. 非对称加密算法
非对称加密算法需要使用两个不同的密钥,一个用于加密,另一个用于解密。常见的非对称加密算法有RSA等。
RSA加密算法
RSA是一种非对称加密算法,使用两个密钥,一个公钥和一个私钥。公钥可以公开,私钥必须保密。RSA加密算法的代码如下:
public static String encryptRSA(String data, String publicKey) throws Exception {
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, getPublicKey(publicKey));
byte[] bytes = cipher.doFinal(data.getBytes("UTF-8"));
return Base64.getEncoder().encodeToString(bytes);
}
public static String decryptRSA(String data, String privateKey) throws Exception {
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, getPrivateKey(privateKey));
byte[] bytes = Base64.getDecoder().decode(data);
return new String(cipher.doFinal(bytes), "UTF-8");
}
private static PublicKey getPublicKey(String publicKey) throws Exception {
byte[] keyBytes = Base64.getDecoder().decode(publicKey);
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
return keyFactory.generatePublic(keySpec);
}
private static PrivateKey getPrivateKey(String privateKey) throws Exception {
byte[] keyBytes = Base64.getDecoder().decode(privateKey);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
return keyFactory.generatePrivate(keySpec);
}
3. 消息摘要算法
消息摘要算法是一种不可逆的加密算法,将原始信息通过算法转换为 的固定长度的字符串,用于校验数据完整性和防止篡改。常见的消息摘要算法包括MD5、SHA-1等。
MD5消息摘要算法
MD5是一种消息摘要算法,将原始信息通过算法转换为 的128位二进制数字。MD5算法的代码如下:
public static String md5(String data) throws Exception {
MessageDigest md5 = MessageDigest.getInstance("MD5");
byte[] bytes = md5.digest(data.getBytes("UTF-8"));
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
sb.append(String.format("%02x", b));
}
return sb.toString();
}
SHA-1消息摘要算法
SHA-1是一种消息摘要算法,将原始信息通过算法转换为 的160位二进制数字。SHA-1算法的代码如下:
public static String sha1(String data) throws Exception {
MessageDigest sha1 = MessageDigest.getInstance("SHA-1");
byte[] bytes = sha1.digest(data.getBytes("UTF-8"));
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
sb.append(String.format("%02x", b));
}
return sb.toString();
}
总结
本文介绍了Java中常用的字符串加密和解密的算法,包括对称加密算法(DES、3DES、AES)、非对称加密算法(RSA)、消息摘要算法(MD5、SHA-1)等。在实际应用中,应根据具体情况选择合适的加密算法,对数据进行保护和防篡改,确保信息安全。
