一、非对称加密算法
非对称加密算法运用一对密钥,也就是公钥和私钥。公钥用于加密,私钥用于解密。该算法的优点是安全性高,能有效解决密钥分发的问题,不过加密和解密的速度相对较慢。
1.1、RSA(主流)
应用极为广泛的非对称加密算法,可用于加密和数字签名。其安全性建立在大整数分解的困难性之上。
优点
1.通用性强:是应用最广泛的非对称加密算法,几乎所有主流的编程语言和加密库都支持 RSA,在数字签名、密钥交换等场景中被广泛使用。
2.安全性基于成熟理论:其安全性基于大整数分解的困难性,这是一个经过深入研究的数学难题,在密钥长度足够长时,能提供较高的安全性。
3.功能丰富:既可以用于加密数据,也可以用于生成数字签名,能满足多种安全需求。
缺点
1.性能较低:加密和解密速度相对较慢,尤其是在处理大量数据时,效率明显低于对称加密算法。
2.密钥长度要求长:为了达到较高的安全性,需要使用较长的密钥,例如 2048 位甚至更长,这会增加密钥管理的难度和存储成本。
加密
// RSA 加密
public static String rsaEncrypt(String plainText, PublicKey publicKey) throws Exception {
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] encryptedBytes = cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8));
return Base64.getEncoder().encodeToString(encryptedBytes);
}
解密
public static String rsaDecrypt(String encryptedText, PrivateKey privateKey) throws Exception {
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decodedBytes = Base64.getDecoder().decode(encryptedText);
byte[] decryptedBytes = cipher.doFinal(decodedBytes);
return new String(decryptedBytes, StandardCharsets.UTF_8);
}
结果
public static void main(String[] args) throws Exception {
String plainText = "Hello, 感谢关注,精华内容将持续更新!";
// RSA 测试
KeyPairGenerator rsaKeyPairGenerator = KeyPairGenerator.getInstance("RSA");
rsaKeyPairGenerator.initialize(2048);
KeyPair rsaKeyPair = rsaKeyPairGenerator.generateKeyPair();
PublicKey rsaPublicKey = rsaKeyPair.getPublic();
PrivateKey rsaPrivateKey = rsaKeyPair.getPrivate();
String rsaEncrypted = rsaEncrypt(plainText, rsaPublicKey);
String rsaDecrypted = rsaDecrypt(rsaEncrypted, rsaPrivateKey);
System.out.println("RSA 加密: " + rsaEncrypted);
System.out.println("RSA 解密: " + rsaDecrypted);
}
RSA 加密: Ys8gStnOThTB2nJwbecmV55AEgdNARQOT55tNZuDz37ck/j6UxLfUop8TRMOM7xSeUFrc4uD15PlkJqPsUkQXXzGpCRDf7E7gkfA5g4MBWsCC7hms4iOH65Z7nJRl3BeuMPdQ20lzWTuoRXK4c2AsdV6YZhuyx4ZXy1tnuOp2ROnas9LjWW/LStctVV4gw9QPTrnBkyAem3QNBq+RFYjBScoi56/b72DbYuZIdTAIavfpMzNHVzW5TiXIVYZWYyti4zkBNGhW3TJhmoU5ce1gw1oNjHYCWwVQgwSpuFNhr/fG48JAQbDpy/EfsUkh5IK9ntbHnR/X0D9UKd+6SySjg==
RSA 解密: Hello, 感谢关注,精华内容将持续更新!
1.2、ECC
基于椭圆曲线数学原理的非对称加密算法,在相同的安全级别下,ECC 所需的密钥长度比 RSA 更短,因此具有更高的效率和更小的密钥存储空间。
优点
1.高安全性与短密钥:在相同的安全级别下,ECC 所需的密钥长度比 RSA 短很多,例如 256 位的 ECC 密钥与 3072 位的 RSA 密钥具有相当的安全性,这减少了密钥存储和传输的开销。
2.计算效率高:加密和解密速度快,尤其是在移动设备和资源受限的环境中,ECC 的性能优势更加明显。
3.带宽需求低:由于密钥长度短,签名和加密后的密文数据量也相对较小,降低了对网络带宽的要求。
缺点
1.算法复杂度高:椭圆曲线的数学原理相对复杂,实现难度较大,对开发者的技术要求较高。
2.应用普及度相对低:虽然 ECC 的优势明显,但在一些传统系统和应用中,RSA 仍然占据主导地位,ECC 的普及需要一定的时间。
加密
public static String eccEncrypt(String plainText, PublicKey publicKey) throws Exception {
java.security.Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
Cipher cipher = Cipher.getInstance("ECIES", "BC");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] encryptedBytes = cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8));
return Base64.getEncoder().encodeToString(encryptedBytes);
}
解密
public static String eccDecrypt(String encryptedText, PrivateKey privateKey) throws Exception {
java.security.Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
Cipher cipher = Cipher.getInstance("ECIES", "BC");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decodedBytes = Base64.getDecoder().decode(encryptedText);
byte[] decryptedBytes = cipher.doFinal(decodedBytes);
return new String(decryptedBytes, StandardCharsets.UTF_8);
}
结果
public static void main(String[] args) throws Exception {
String plainText = "Hello, 感谢关注,精华内容将持续更新!";
// ECC 测试
KeyPairGenerator eccKeyPairGenerator = KeyPairGenerator.getInstance("EC");
eccKeyPairGenerator.initialize(256);
KeyPair eccKeyPair = eccKeyPairGenerator.generateKeyPair();
PublicKey eccPublicKey = eccKeyPair.getPublic();
PrivateKey eccPrivateKey = eccKeyPair.getPrivate();
String eccEncrypted = eccEncrypt(plainText, eccPublicKey);
String eccDecrypted = eccDecrypt(eccEncrypted, eccPrivateKey);
System.out.println("ECC 加密: " + eccEncrypted);
System.out.println("ECC 解密: " + eccDecrypted);
}
ECC 加密: BDihrABFYVgdyQs2o75m2rLODXiHpdah1B7XQBu1VoJ6ggS36GvXXaMSxcB+hsXZ68/iSBzSQqSpaId5MqNCddN3zEyTNjXvPC2UW6veEs78wnt520OX7urT4azULyYgMsgp7HwDdP97RNVtyoNCCU4aJBz/JtEZ3Bg6s/KlAJyBiql//Q==
ECC 解密: Hello, 感谢关注,精华内容将持续更新!
1.3、DSA
主要用于数字签名的非对称加密算法,它是美国政府采用的标准数字签名算法。DSA 基于离散对数问题,与 RSA 不同,它主要用于签名,而不用于加密数据。
优点
1.专注数字签名:专门为数字签名设计,在签名生成和验证方面具有较高的效率和安全性,能够有效防止数据被篡改和伪造。
2.美国政府标准:是美国政府采用的标准数字签名算法,具有较高的权威性和认可度。
缺点
1.功能单一:只能用于数字签名,不能用于加密数据,适用场景相对较窄。
2.密钥管理复杂:与 RSA 相比,DSA 的密钥管理和分发过程较为复杂,需要额外的安全措施来保证密钥的安全性。
加密
public static String dsaSign(String data, PrivateKey privateKey) throws Exception {
Signature dsa = Signature.getInstance("SHA256withDSA");
dsa.initSign(privateKey);
dsa.update(data.getBytes(StandardCharsets.UTF_8));
byte[] signatureBytes = dsa.sign();
return Base64.getEncoder().encodeToString(signatureBytes);
}
解密
public static boolean dsaVerify(String data, String signature, PublicKey publicKey) throws Exception {
Signature dsa = Signature.getInstance("SHA256withDSA");
dsa.initVerify(publicKey);
dsa.update(data.getBytes(StandardCharsets.UTF_8));
byte[] signatureBytes = Base64.getDecoder().decode(signature);
return dsa.verify(signatureBytes);
}
结果
public static void main(String[] args) throws Exception {
String plainText = "Hello, 感谢关注,精华内容将持续更新!";
// DSA 测试
KeyPairGenerator dsaKeyPairGenerator = KeyPairGenerator.getInstance("DSA");
dsaKeyPairGenerator.initialize(2048);
KeyPair dsaKeyPair = dsaKeyPairGenerator.generateKeyPair();
PublicKey dsaPublicKey = dsaKeyPair.getPublic();
PrivateKey dsaPrivateKey = dsaKeyPair.getPrivate();
String dsaSignature = dsaSign(plainText, dsaPrivateKey);
boolean dsaVerified = dsaVerify(plainText, dsaSignature, dsaPublicKey);
System.out.println("DSA 加密: " + dsaSignature);
System.out.println("DSA 解密: " + dsaVerified);
}
DSA 加密: MDwCHBEwUZkEZIYMs+ELpLCrADbU7Ba1eCIlfhgagIwCHCZ59qZ+U3C4Os2URLKPLlM7S/WuynjJsQxdTkE=
DSA 解密: true
通过以上内容便可轻轻松松使用是非对称加密算法.是不是超级简单.有任何问题欢迎留言哦!!!
重点!重点!重点!
遇到问题不用怕不如来我的知识库找找看,也许有意想不到的收获!!!
易网时代-易库资源-易库教程:.NET开发、Java开发、PHP开发、SqlServer技术、MySQL技术-开发资料大全-易网时代-易库资源-易库教程 (escdns.com)