Java 四种基本加密算法分析
在Java中,有四种基本的加密算法,分别是:DES、AES、RSA 和 MD5。本文将对四种算法进行详细讲解,并给出相关的示例说明。
DES 加密算法
DES(Data Encryption Standard)是一种对称加密算法,其密钥长度为64位,加密和解密使用相同的密钥。DES算法的加密过程如下:
- 将明文进行填充,使其长度为64的整数倍;
- 将填充后的明文划分成64位一组,称为数据块,最后一个数据块不足64位时进行填充;
- 对于每一组数据块,先进行初始置换 IP,然后进行16轮迭代,每轮迭代包括以下四步:置换、S盒代替、P盒置换和异或操作;
- 最后一轮迭代之后,交换左右两个32位的子块,然后进行最终置换 IP^-1,得到密文。
以下是Java实现DES加密的示例代码:
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
public class DESUtil {
private static final String DEFAULT_CIPHER_ALGORITHM = "DES/ECB/PKCS5Padding";
// 生成DES密钥
public static byte[] generateKey() throws Exception {
KeyGenerator keyGenerator = KeyGenerator.getInstance("DES");
keyGenerator.init(56);
SecretKey secretKey = keyGenerator.generateKey();
return secretKey.getEncoded();
}
// DES加密
public static byte[] encrypt(byte[] data, byte[] key) throws Exception {
SecretKeySpec keySpec = new SecretKeySpec(key, "DES");
Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, keySpec);
return cipher.doFinal(data);
}
// DES解密
public static byte[] decrypt(byte[] data, byte[] key) throws Exception {
SecretKeySpec keySpec = new SecretKeySpec(key, "DES");
Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, keySpec);
return cipher.doFinal(data);
}
}
AES 加密算法
AES(Advanced Encryption Standard)是一种对称加密算法,其密钥长度可以为128、192或256位,加密和解密使用相同的密钥。AES算法的加密过程如下:
- 将明文进行填充,使其长度为128的整数倍;
- 将填充后的明文划分成128位一组,称为数据块,最后一个数据块不足128位时进行填充;
- 对于每一组数据块,先进行轮密钥加,然后进行10轮迭代,每轮迭代包括以下四步:字节代替、行移位、列混淆和轮密钥加;
- 最后一轮迭代之后,进行末轮处理,得到密文。
以下是Java实现AES加密的示例代码:
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
public class AESUtil {
private static final String DEFAULT_CIPHER_ALGORITHM = "AES/ECB/PKCS5Padding";
// 生成AES密钥
public static byte[] generateKey(int keySize) throws Exception {
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(keySize);
SecretKey secretKey = keyGenerator.generateKey();
return secretKey.getEncoded();
}
// AES加密
public static byte[] encrypt(byte[] data, byte[] key) throws Exception {
SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, keySpec);
return cipher.doFinal(data);
}
// AES解密
public static byte[] decrypt(byte[] data, byte[] key) throws Exception {
SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, keySpec);
return cipher.doFinal(data);
}
}
RSA 加密算法
RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,其密钥分为公钥和私钥,公钥用于加密数据,私钥用于解密数据。RSA算法的加密过程如下:
- 选取两个大质数p和q,计算N=p*q;
- 计算φ(N)=(p-1)*(q-1);
- 随机生成一个整数e,使得1<e<φ(N),且e与φ(N)互质;
- 计算d,使得(e*d) mod φ(N)=1;
- 将明文转换成数字M,使得0<=M<N;
- 计算密码文C=(M^e) mod N。
以下是Java实现RSA加密的示例代码:
import java.math.BigInteger;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import javax.crypto.Cipher;
public class RSAUtil {
private static final String DEFAULT_CIPHER_ALGORITHM = "RSA/ECB/PKCS1Padding";
// 生成RSA密钥对
public static KeyPair generateKeyPair(int keySize) throws Exception {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(keySize);
return keyPairGenerator.generateKeyPair();
}
// RSA公钥加密
public static byte[] encrypt(byte[] data, PublicKey publicKey) throws Exception {
Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
return cipher.doFinal(data);
}
// RSA私钥解密
public static byte[] decrypt(byte[] data, PrivateKey privateKey) throws Exception {
Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, privateKey);
return cipher.doFinal(data);
}
}
MD5 散列算法
MD5(Message-Digest Algorithm 5)是一种散列算法,其作用是将任意长度的数据压缩成一个128位的散列值(即摘要值)。MD5算法的加密过程如下:
- 将明文进行填充,使其长度为512的整数倍;
- 将填充后的明文划分成512位一组,称为消息分组;
- 对于每一组消息分组,进行四轮迭代,每轮迭代包括以下四步:置换、非线性函数、循环移位和轮密钥加;
- 最后一轮迭代之后,将四个32位字沿着大端顺序连接起来,得到128位的散列值。
以下是Java实现MD5散列的示例代码:
import java.security.MessageDigest;
public class MD5Util {
public static byte[] encrypt(byte[] data) throws Exception {
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
return messageDigest.digest(data);
}
}
示例说明
- DES加解密示例
public static void main(String[] args) {
try {
// 生成DES密钥
byte[] key = DESUtil.generateKey();
// 明文
String plainText = "This is a plain text";
byte[] plainData = plainText.getBytes();
// DES加密
byte[] encryptData = DESUtil.encrypt(plainData, key);
// DES解密
byte[] decryptData = DESUtil.decrypt(encryptData, key);
// 显示结果
System.out.println("Plain Text: " + plainText);
System.out.println("Encrypted Data: " + new String(encryptData));
System.out.println("Decrypted Data: " + new String(decryptData));
} catch (Exception e) {
e.printStackTrace();
}
}
- RSA加解密示例
public static void main(String[] args) {
try {
// 生成RSA密钥对
KeyPair keyPair = RSAUtil.generateKeyPair(1024);
PublicKey publicKey = keyPair.getPublic();
PrivateKey privateKey = keyPair.getPrivate();
// 明文
String plainText = "This is a plain text";
byte[] plainData = plainText.getBytes();
// RSA公钥加密
byte[] encryptData = RSAUtil.encrypt(plainData, publicKey);
// RSA私钥解密
byte[] decryptData = RSAUtil.decrypt(encryptData, privateKey);
// 显示结果
System.out.println("Plain Text: " + plainText);
System.out.println("Encrypted Data: " + new BigInteger(encryptData).toString(16));
System.out.println("Decrypted Data: " + new String(decryptData));
} catch (Exception e) {
e.printStackTrace();
}
}
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java 四种基本加密算法分析 - Python技术站