快速了解常⽤的⾮对称加密算法,再也不⽤担⼼⾯试官的刨根
问底
⾯试官:说⼀说你常⽤的加密算法有哪些?
加密算法通常被分为两种:对称加密算法和⾮对称加密算法。其中,对称加密算法在加密和解密时使⽤的密钥相同;⾮对称加密算法在加密
和解密时使⽤的密钥不同,分为公钥和私钥。此外,还有⼀类叫做消息摘要算法,是对数据进⾏摘要并且不可逆的算法。
这次我们了解⼀下⾮对称加密算法。
⾮对称加密算法
⾮对称加密算法在加密和解密时使⽤两个不同的密钥,其中⼀个可以公开的密钥被称为公钥,另外⼀个完全保密的密钥被称为私钥。只有同
⼀个公钥私钥对才能正常加密和解密。
对于同⼀个公钥私钥对,如果使⽤公钥对数据进⾏加密,只有⽤对应的私钥才能进⾏解密;如果使⽤私钥对数据进⾏加密,只有⽤对应的公
钥才能进⾏解密。
常见的⾮对称加密算法有:RSA算法、DSA。
RSA算法
RSA算法是⽬前最有影响⼒的公钥加密算法,它由RonRivest、AdiShamir和LeonardAdleman三位⼤佬在1977年⿇省理⼯学院⼯作
时⼀起提出的,RSA就是他们三⼈姓⽒开头字母拼在⼀起组成的。
另外,1973年,在英国政府通讯总部⼯作的数学家CliffordCocks在⼀个内部⽂件中提出了⼀个与之等效的算法,但该算法被列⼊机密,
直到1997年才得到公开。
RSA算法利⽤了两个数论特性:
1.p1、p2为两个质数,n=p1*p2。已知p1、p2求n简单,已知n求p1、p2很难。
2.(m^e)modn=c,已知m、e、n求c简单,已知e、n、c求m很难。
公钥私钥⽣成过程:随机选取两个质数p1、p2,n=p1*p2,再随机选取⼀个与φ(n)互质且⼩于φ(n)的整数e,然后再计算e对于φ(n)的
模反元素d,最后得到n和e为公钥,n和d为私钥。
加密过程:(m^e)modn=c,其中m为明⽂,c为密⽂,n和e为公钥。
解密过程:(c^d)modn=m,其中m为明⽂,c为密⽂,n和d为私钥。
我们⽤Java写个例⼦:
;
t;
rdCharts;
lSecurityException;
tory;
r;
r;
rGenerator;
eKey;
Key;
8EncodedKeySpec;
.X509EncodedKeySpec;
64;
publicclassRsaUtil{
privatestaticfinalStringRSA="RSA";
privatestaticfinalChartCHARSET=_8;
/**
*加密
*
*@paraminput明⽂
*@parampublicKey公钥
*@return密⽂
*@throwsGeneralSecurityException
*/
publicstaticStringencrypt(Stringinput,StringpublicKey)throwsGeneralSecurityException{
Ciphercipher=tance(RSA);
PublicKeypubKey=tance(RSA)
.generatePublic(newX509EncodedKeySpec(oder().decode(publicKey)));
(T_MODE,pubKey);
byte[]data=l(es(CHARSET));
oder().encodeToString(data);
}
/**
*解密
*
*@paraminput密⽂
*@paramprivateKey私钥
*@return明⽂
*@throwsGeneralSecurityException
*/
publicstaticStringdecrypt(Stringinput,StringprivateKey)throwsGeneralSecurityException{
Ciphercipher=tance(RSA);
PrivateKeypriKey=tance("RSA")
.generatePrivate(newPKCS8EncodedKeySpec(oder().decode(privateKey)));
(T_MODE,priKey);
byte[]data=l(oder().decode(input));
returnnewString(data,CHARSET);
}
publicstaticvoidmain(String[]args)throwsGeneralSecurityException{
//⽣成公钥/私钥对:
KeyPairGeneratorkpGen=tance(RSA);
lize(1024);
KeyPairkeyPair=teKeyPair();
StringpublicKey=oder().encodeToString(lic().getEncoded());
StringprivateKey=oder().encodeToString(vate().getEncoded());
n("公钥:"+publicKey);
n("私钥:"+privateKey);
Stringmsg="我喜欢你,可以做我⼥朋友吗?";
n("加密前:"+msg);
Stringpwd=t(msg,publicKey);
n("加密后:"+pwd);
n("解密后:"+t(pwd,privateKey));
}
}
运⾏结果如下:
公钥:MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDd4brSm8gdJqFi04m3aW8kjVYbd/T4ymyc7l3c2WmwOhVPlZO1eaZJpTvas61rW0HPf267CRIhc52Z
私钥:MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAN3hutKbyB0moWLTibdpbySNVht39PjKbJzuXdzZabA6FU+Vk7V5pkmlO9qzrWtbQc9/brsJ
加密前:我喜欢你,可以做我⼥朋友吗?
加密后:tRt5hdF0XB8V2wk6BWC2i8UWVQj/jOCRZn3wIfGYqVaYJ9OjC/+VRUI3c5WgpZlKCZd5zrHo3g1LuQ02G934Gcb51cKH4uhWxRY8oxUgs/fibkvc9+w1X7F
解密后:我喜欢你,可以做我⼥朋友吗?
RSA算法解决了对称算法的安全性依赖于同⼀个密钥的缺点。不过,RSA算法在计算上相当复杂,性能⽋佳、远远不如对称加密算法。因
此,在⼀般实际情况下,往往通过⾮对称加密算法来随机创建临时的对称密钥,然后通过对称加密来传输⼤量、主体的数据。
DSA
DSA(DigitalSignatureAlgorithm,数字签名算法)是Schnorr和ElGamal签名算法的变种,基于模算数和离散对数的复杂度。
美国国家标准技术研究所(NIST)于1991年提出将DSA⽤于其DSS(DigitalSignatureStandard,数字签名标准),并于1994年将其
作为FIPS186采⽤。
和RSA算法使⽤公钥加密私钥解密的⽅式不同,DSA使⽤私钥对数据进⾏加密⽣成数字签名,然后使⽤公钥解密后的数据和原数据进⾏对
⽐,以验证数字签名。
数字签名提供信息鉴定(接收者可以验证消息的来源),完整性(接收⽅可以验证消息⾃签名以来未被修改)和不可否认性(发送⽅不能错
误地声称它们没有签署消息)。
我们⽤Java写个例⼦:
t;
rdCharts;
lSecurityException;
tory;
r;
rGenerator;
eKey;
Key;
ure;
8EncodedKeySpec;
.X509EncodedKeySpec;
64;
publicclassDsaUtil{
privatestaticfinalStringDSA="DSA";
privatestaticfinalStringSHA1withDSA="SHA1withDSA";
privatestaticfinalChartCHARSET=_8;
/**
*签名
*
*@paramdata数据
*@paramprivateKey私钥
*@return签名
*@throwsGeneralSecurityException
*/
publicstaticStringsign(Stringdata,StringprivateKey)throwsGeneralSecurityException{
PrivateKeypriKey=tance(DSA)
.generatePrivate(newPKCS8EncodedKeySpec(oder().decode(privateKey)));
Signaturesignature=tance(SHA1withDSA);
gn(priKey);
(es(CHARSET));
oder().encodeToString(());
}
/**
/**
*验证
*
*@paramdata数据
*@parampublicKey公钥
*@paramsign签名
*@return是否验证通过
*/
publicstaticbooleanverify(Stringdata,StringpublicKey,Stringsign)throwsGeneralSecurityException{
try{
PublicKeypubKey=tance(DSA)
.generatePublic(newX509EncodedKeySpec(oder().decode(publicKey)));
Signaturesignature=tance(SHA1withDSA);
rify(pubKey);
(es(CHARSET));
(oder().decode(sign));
}catch(Exceptione){
thrownewRuntimeException(e);
}
}
publicstaticvoidmain(String[]args)throwsGeneralSecurityException{
//⽣成公钥/私钥对:
KeyPairGeneratorkpGen=tance(DSA);
lize(1024);
KeyPairkeyPair=teKeyPair();
StringpublicKey=oder().encodeToString(lic().getEncoded());
StringprivateKey=oder().encodeToString(vate().getEncoded());
n("公钥:"+publicKey);
n("私钥:"+privateKey);
Stringmsg="我喜欢你,可以做我⼥朋友吗?";
n("数据:"+msg);
Stringsign=(msg,privateKey);
n("签名:"+sign);
n("验证是否通过:"+(msg,publicKey,sign));
}
}
运⾏结果如下:
公钥:MIIBtzCCASwGByqGSM44BAEwggEfAoGBAP1/U4EddRIpUt9KnC7s5Of2EbdSPO9EAMMeP4C2USZpRV1AIlH7WT2NWPq/xfW6MPbLm1Vs14E7gB00b/Jm
私钥:MIIBSwIBADCCASwGByqGSM44BAEwggEfAoGBAP1/U4EddRIpUt9KnC7s5Of2EbdSPO9EAMMeP4C2USZpRV1AIlH7WT2NWPq/xfW6MPbLm1Vs14E7gB
数据:我喜欢你,可以做我⼥朋友吗?
签名:MCwCFHhnd/3yRCIygyD1GPa1K9ZVQ+4rAhR8zAtlrBim9KKEkv+Fxz47opvSuA==
验证是否通过:true
过Java的⽰例可以看到,不会直接对数据进⾏私钥的加密,⽽是先通过信息摘要算法对数据进⾏摘要,然后对摘要信息进⾏私钥的加密。
总结
⾮对称加密算法在加密和解密时使⽤两个不同的密钥,分别被称为公钥和私钥,只有同⼀个公钥私钥对才能正常加密和解密。
常见的⾮对称加密算法有:RSA算法、DSA。RSA算法主要进⾏对数据的公钥加密,DSA主要是对数据的签名验证。
看完三件事❤
本文发布于:2022-12-31 21:46:43,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/90/68021.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |