Java可逆加密算法有哪些?
在计算机安全领域,加密和解密是非常重要的技术,为了保护数据的安全性,我们需要使用加密算法对数据进行加密,以防止未经授权的访问,有时候我们可能需要对加密后的数据进行解密,这就需要使用可逆加密算法,本文将介绍一些Java中的可逆加密算法。
对称加密算法
1、DES(Data Encryption Standard)
DES是一种对称加密算法,它使用相同的密钥进行加密和解密,Java中提供了javax.crypto.Cipher
类来实现DES加密和解密,以下是一个使用DES加密和解密的示例:
import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpec; import java.nio.charset.StandardCharsets; import java.util.Base64; public class DESDemo { public static void main(String[] args) throws Exception { String data = "Hello, World!"; String key = "12345678"; // DES密钥长度为8字节 // 加密 Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding"); SecretKey secretKey = new DESKeySpec(key.getBytes(StandardCharsets.UTF_8)).getKey(); cipher.init(Cipher.ENCRYPT_MODE, secretKey); byte[] encryptedData = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8)); String encryptedDataBase64 = Base64.getEncoder().encodeToString(encryptedData); System.out.println("加密后的数据:" + encryptedDataBase64); // 解密 cipher.init(Cipher.DECRYPT_MODE, secretKey); byte[] decryptedData = cipher.doFinal(Base64.getDecoder().decode(encryptedDataBase64)); String decryptedDataStr = new String(decryptedData, StandardCharsets.UTF_8); System.out.println("解密后的数据:" + decryptedDataStr); } }
2、AES(Advanced Encryption Standard)
AES是一种对称加密算法,它使用相同的密钥进行加密和解密,与DES相比,AES具有更高的安全性,Java中提供了javax.crypto.Cipher
类来实现AES加密和解密,以下是一个使用AES加密和解密的示例:
import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.nio.charset.StandardCharsets; import java.util.Base64; public class AESDemo { public static void main(String[] args) throws Exception { String data = "Hello, World!"; String key = "1234567890123456"; // AES密钥长度为16、24或32字节 String initVector = "abcdefghijklmnop"; // 初始化向量,长度为16字节 // 加密 Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); SecretKey secretKey = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "AES"); IvParameterSpec ivParameterSpec = new IvParameterSpec(initVector.getBytes(StandardCharsets.UTF_8)); cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivParameterSpec); byte[] encryptedData = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8)); String encryptedDataBase64 = Base64.getEncoder().encodeToString(encryptedData); System.out.println("加密后的数据:" + encryptedDataBase64); // 解密 cipher.init(Cipher.DECRYPT_MODE, secretKey, ivParameterSpec); byte[] decryptedData = cipher.doFinal(Base64.getDecoder().decode(encryptedDataBase64)); String decryptedDataStr = new String(decryptedData, StandardCharsets.UTF_8); System.out.println("解密后的数据:" + decryptedDataStr); } }
非对称加密算法
1、RSA(Rivest-Shamir-Adleman)
RSA是一种非对称加密算法,它使用公钥进行加密,私钥进行解密,Java中提供了javax.crypto
包中的类来实现RSA加密和解密,以下是一个使用RSA加密和解密的示例:
import javax.crypto.Cipher; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.PrivateKey; import java.security.PublicKey; import java.util.Base64; import java.util.Random; public class RSADemo { public static void main(String[] args) throws Exception { String data = "Hello, World!"; // 要加密的数据 int keySize = 2048; // 密钥长度,可以是1024、2048或4096字节 // 生成密钥对 KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); keyPairGenerator.initialize(keySize); KeyPair keyPair = keyPairGenerator.generateKeyPair(); PrivateKey privateKey = keyPair.getPrivate(); // 获取私钥对象 PublicKey publicKey = keyPair.getPublic(); // 获取公钥对象 // 加密数据并转换为Base64编码的字符串,以便于传输和存储 Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); // 注意:这里使用的是PKCS1Padding,因为Java不支持OAEP填充方式,但实际上OAEP更安全且性能更好,如果需要使用OAEP填充方式,可以考虑使用JCE无限制模式下的实现,Java中的RSA实现仅支持PKCS1 v1.5填充方式,更多关于Java中RSA实现的信息,请参考官方文档:https://docs.oracle.com/en/java/javase/11/docs/api/javax/crypto/CipherSpiJavadocs/package-summary-htmloverview-descriptions-and-examples%EF%BC%89%E5%AE%B9%E5%99%A8%E7%BA%BF%E6%8A%A5%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86%EF%BC%8CJDK%E7%BA%BF%E7%A7%BB%E5%8A%A8%E6%8A%A0%E5%9B%BE%E5%BA%93JDK+8+以后的版本已被标记为废弃,建议在实际项目中使用第三方库,如Bouncy Castle或Google Guava等。-https://stackoverflow.com/a/22700037/3397023 -%EF%BC%8D) cipher = Cipher.getInstance("RSA"); // 注意:这里使用的是RSA/ECB/PKCS1Padding,因为Java不支持OAEP填充方式,但实际上OAEP更安全且性能更好,如果需要使用OAEP填充方式,可以考虑使用JCE无限制模式下的实现,Java中的RSA实现仅支持PKCS1 v1
原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/269636.html