Java 对字符串进行加密解密攻略
简介
Java 中提供了多种加密解密的方案,涉及对称加密、非对称加密、哈希算法等等。本文将主要讲解在 Java 中对字符串进行加密解密的方法。
对称加密
对称加密是指加密和解密使用同一个密钥的方式,常见的有 AES、DES 等算法。
AES 加密
在 Java 中使用 AES 进行加密解密的主要步骤如下:
- 生成一个 AES 密钥,使用 SecretKeySpec 构造器指定密钥长度和加密算法类型。
- 获取一个 Cipher 对象,并指定加密模式、填充方式以及密钥。
- 调用 Cipher 对象的 encrypt/decrypt 方法,传入要加密/解密的数据,即可得到加密/解密后的数据。
下面是一个简单的 AES 加密示例:
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class AESEncryptor {
private static final String TRANSFORMATION = "AES/ECB/PKCS5Padding";
private static final String CHARSET_NAME = "UTF-8";
private SecretKeySpec key;
public AESEncryptor(String secretKey) {
key = new SecretKeySpec(secretKey.getBytes(), "AES");
}
public String encrypt(String data) throws Exception {
Cipher cipher = Cipher.getInstance(TRANSFORMATION);
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] encryptedData = cipher.doFinal(data.getBytes(CHARSET_NAME));
return Base64.getEncoder().encodeToString(encryptedData);
}
public String decrypt(String encryptedData) throws Exception {
Cipher cipher = Cipher.getInstance(TRANSFORMATION);
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] decryptedData = cipher.doFinal(Base64.getDecoder().decode(encryptedData));
return new String(decryptedData, CHARSET_NAME);
}
}
DES 加密
在 Java 中使用 DES 进行加密解密的主要步骤如下:
- 生成一个 DES 密钥,使用 SecretKeySpec 构造器指定密钥长度和加密算法类型。
- 获取一个 Cipher 对象,并指定加密模式、填充方式以及密钥。
- 调用 Cipher 对象的 encrypt/decrypt 方法,传入要加密/解密的数据,即可得到加密/解密后的数据。
下面是一个简单的 DES 加密示例:
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class DESEncryptor {
private static final String TRANSFORMATION = "DES/ECB/PKCS5Padding";
private static final String CHARSET_NAME = "UTF-8";
private SecretKeySpec key;
public DESEncryptor(String secretKey) {
key = new SecretKeySpec(secretKey.getBytes(), "DES");
}
public String encrypt(String data) throws Exception {
Cipher cipher = Cipher.getInstance(TRANSFORMATION);
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] encryptedData = cipher.doFinal(data.getBytes(CHARSET_NAME));
return Base64.getEncoder().encodeToString(encryptedData);
}
public String decrypt(String encryptedData) throws Exception {
Cipher cipher = Cipher.getInstance(TRANSFORMATION);
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] decryptedData = cipher.doFinal(Base64.getDecoder().decode(encryptedData));
return new String(decryptedData, CHARSET_NAME);
}
}
非对称加密
非对称加密是指加密和解密使用不同密钥的方式,常见的有 RSA 等算法。
RSA 加密
在 Java 中使用 RSA 进行加密解密的主要步骤如下:
- 生成一个 RSA 密钥对。
- 获取一个 Cipher 对象,并指定加密模式、填充方式以及密钥对。
- 调用 Cipher 对象的 encrypt/decrypt 方法,传入要加密/解密的数据,即可得到加密/解密后的数据。
下面是一个简单的 RSA 加密示例:
import javax.crypto.Cipher;
import java.nio.charset.StandardCharsets;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.util.Base64;
public class RSAEncryptor {
private static final String ALGORITHM = "RSA";
private static final String TRANSFORMATION = "RSA/ECB/PKCS1Padding";
private static final String CHARSET_NAME = "UTF-8";
private KeyPair keyPair;
public RSAEncryptor() throws Exception {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(ALGORITHM);
keyPairGenerator.initialize(1024);
keyPair = keyPairGenerator.generateKeyPair();
}
public String encrypt(String data) throws Exception {
Cipher cipher = Cipher.getInstance(TRANSFORMATION);
cipher.init(Cipher.ENCRYPT_MODE, keyPair.getPublic());
byte[] encryptedData = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));
return Base64.getEncoder().encodeToString(encryptedData);
}
public String decrypt(String encryptedData) throws Exception {
Cipher cipher = Cipher.getInstance(TRANSFORMATION);
cipher.init(Cipher.DECRYPT_MODE, keyPair.getPrivate());
byte[] decryptedData = cipher.doFinal(Base64.getDecoder().decode(encryptedData));
return new String(decryptedData, StandardCharsets.UTF_8);
}
}
哈希算法
哈希算法是指根据明文生成一个唯一的密文,一般来说不能通过密文反推出明文。常见的哈希算法有 MD5、SHA 等。
MD5 哈希
在 Java 中使用 MD5 进行哈希的方法如下:
import java.math.BigInteger;
import java.security.MessageDigest;
public class MD5Hash {
public static String hash(String data) throws Exception {
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
messageDigest.update(data.getBytes());
byte[] hashedData = messageDigest.digest();
return String.format("%032x", new BigInteger(1, hashedData));
}
}
SHA 哈希
在 Java 中使用 SHA 进行哈希的方法如下:
import java.math.BigInteger;
import java.security.MessageDigest;
public class SHAHash {
public static String hash(String data) throws Exception {
MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
messageDigest.update(data.getBytes());
byte[] hashedData = messageDigest.digest();
return String.format("%064x", new BigInteger(1, hashedData));
}
}
示例说明
示例一:使用 AES 加密解密字符串
try {
String secretKey = "abcdefghijklmnop";
String data = "hello, world";
AESEncryptor encryptor = new AESEncryptor(secretKey);
String encryptedData = encryptor.encrypt(data);
System.out.println("Encrypted data: " + encryptedData);
String decryptedData = encryptor.decrypt(encryptedData);
System.out.println("Decrypted data: " + decryptedData);
} catch (Exception e) {
e.printStackTrace();
}
输出结果:
Encrypted data: gvRue/ouZLbzCphZpdU4OQ==
Decrypted data: hello, world
示例二:使用 SHA 对字符串进行哈希
try {
String data = "hello, world";
String hashedData = SHAHash.hash(data);
System.out.println("Hashed data: " + hashedData);
} catch (Exception e) {
e.printStackTrace();
}
输出结果:
Hashed data: b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java对字符串进行加密解密 - Python技术站