作业要求如下图
RSA
先复习一下RSA密钥生成的过程:首选取两个互质数p和q,然后通过他俩相乘,p * q 得到 N,N=p*q
,这时我们需要计算出φ(N),φ(N)是小于或等于N的正整数中与N互质的数的数目。
我们通过φ(N)=(p-1)×(q-1)
可以快速计算出φ(N)。
然后,我们选择一个数e,满足以下两个条件,第一, 1<e<φ(N)
,第二,且e与φ(n) 互质。
接着,我们通过以下公式计算e的逆元d。
e*d ≡ 1 (mod φ(n))
这个公式简单来说就是e*d除以φ(N)得到的余数为1。
然后就计算完成,得到了私钥和公钥。
公布公钥KU={e,N}
保存私钥KR={d,N}
- 为什么q和p的选择是要安全素数?
答:首先,RSA的安全性依赖于大数的因子分解,而且涉及到一个乘法逆的问题。两个大质数的情况下乘法逆会有很多。而且为了安全,我们通常要求p和q应是大素数且他们的位数不要相差太远;gcd(p-1,q-1)应该要较小; p-1 和 q-1都应该要有一个比较大的素数因子,那么这个就是m和n。( 也就是满足p=2m+1可以提高他的安全性) - 公钥e的选择有什么要求?
如上所述,原则上e需要满足以下两个条件,第一,1<e<φ(N)
,第二,且e与φ(n) 互质。然后平时做题可以感觉到,一般选取的e都是从小向大选取的,也就是e一般都比较小。 - 私钥d的选择有什么要求?
私钥d是由e和φ(N)计算得来的。即选择的d必须与上述e一起,满足e*d ≡ 1 (mod φ(n))。 - 加密、签名对密钥有何不同的保护要求?
(1)加密密钥
加密密钥对由加密公钥和解密私钥组成。其中,解密私钥应该进行备份和存档,以便能在任何时候解密历史密文数据,而加密公钥则无需备份和存档,加密公钥丢失时,只需重新生成密钥对即可。
(2)签名密钥
签名私钥是发送方身份的证明。
用做数字签名的这一对密钥一般可以有较长的生命期。
签名密钥由签名私钥和验证公钥组成,其中,签名私钥绝对不允许做备份和存档,丢失后只需重新生成新的密钥对。而验证公钥需要存档,用于验证旧的数字签名。
附加实验题
准备工作:
openssl genrsa -aes128 -out ca.key 2048
openssl rsa -in ca.key -out ca.key
openssl req -new -x509 -key ca.key -out ca.crt -days 365
openssl genrsa -out privkey.pem 2048
openssl rsa -in privkey.pem -pubout -out pubkey.pem
openssl ecparam -name prime256v1 -genkey -noout -out ecprikey.pem
openssl pkey -in ecprikey.pem -pubout -out ecpub.pem
- 对一个exe文件生成签名/验签
openssl dgst -sign privkey.pem -sha256 -out bigorlittle_rsa.sign bigorlittle.exe
openssl verify -CAfile ca.crt rsa.crt
openssl verify -CAfile ca.crt rsa.crt
openssl x509 -outform PEM -in rsa.crt -pubkey -out rsapub.pem
openssl dgst -verify pubkey.pem -sha256 -signature bigorlittle.sign bigorlittle.exe
- 对一个xml文件进行加密/解密
公钥加密,私钥解密
openssl verify -CAfile ca.crt xml.crt: OK
openssl rsautl -encrypt -in testxml.xml -inkey xmlpubkey.pem -pubin -out teslxml.en
openssl rsautl -decrypt -in teslxml.en -inkey xmlprivkey.pem -out testxml.de