spec结

更新时间:2022-12-31 21:46:43 阅读: 评论:0


2022年12月31日发(作者:初二下册英语语法)

快速了解常⽤的⾮对称加密算法,再也不⽤担⼼⾯试官的刨根

问底

⾯试官:说⼀说你常⽤的加密算法有哪些?

加密算法通常被分为两种:对称加密算法和⾮对称加密算法。其中,对称加密算法在加密和解密时使⽤的密钥相同;⾮对称加密算法在加密

和解密时使⽤的密钥不同,分为公钥和私钥。此外,还有⼀类叫做消息摘要算法,是对数据进⾏摘要并且不可逆的算法。

这次我们了解⼀下⾮对称加密算法。

⾮对称加密算法

⾮对称加密算法在加密和解密时使⽤两个不同的密钥,其中⼀个可以公开的密钥被称为公钥,另外⼀个完全保密的密钥被称为私钥。只有同

⼀个公钥私钥对才能正常加密和解密。

对于同⼀个公钥私钥对,如果使⽤公钥对数据进⾏加密,只有⽤对应的私钥才能进⾏解密;如果使⽤私钥对数据进⾏加密,只有⽤对应的公

钥才能进⾏解密。

常见的⾮对称加密算法有: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小时内删除。

标签:spec结
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图