上:
1、对称加密的不足
2、非对称加密思想的提出
3、非对称加密算法概览
4、基础数学知识
下:
1、RSA的加解密原理
2、RSA安全性分析
3、RSA加解密实现
4、签名和验签
5、RSA加密算法特点
对称加密的不足
1、密钥传输的问题(泄露)
2、密钥管理的问题(数量庞大)
非对称加密
使用算法生成两把匹配的密钥 A 和 B
l 使用 A 加密的信息,使用 B 可以解开
l 使用 B 加密的信息,使用 A 可以解开
l 使用方法:公钥加密、私钥解密
非对称加密的数学基础
1、基于因子分解难题:RSA
2、基于离散对数难题:ElGamal、DSA
3、椭圆曲线类问题:ECC
对称加密和非对称加密
非对称加密的提出
1976
l Whitfield Diffie 和 Martin Hellman
l 《密码学的新方向》
l 非对称加密的密钥分发算法、公钥加密思想、数字签名思想
原根的含义
模P本原单位根(primitive root module P)
简称:(P的)原根
原根可能没有,也可能有多个
计算原根代码:primitive_roots.py
公式生成网站:https://www.latexlive.com/
原根计算示例
11的原根2
11的原根6
DH密钥交换
非对称加密算法概览
常见非对称加密算法
非对称加密流程
B发送消息,A接收消息:
1、A生成密钥对:公钥、私钥。
2、B用户获得A用户的公钥,用公钥加密消息。
3、A用户收到B用户加密后的消息,用自己的私钥解密消息。
基础数学知识
互为质数
1、取模运算 module mod %
a%b代表求a除以b的余数
2、质数prime
除了1和自身,不能被其他自然数整除
3、公约数gcd
能被若干个整数同时均整除的整数 gcd(6, 9,12)=3
4、互为质数⟂ 两个整数的公约数只有1 gcd(7,11)=1 ∴ 7⟂ 11
互为质数结论-1
1、任意两个质数构成互质关系,比如13和61。
2、一个数是质数,另一个数只要不是前者的倍数,两者就构成互质关系,比如3和10。
3、如果两个数之中,较大的那个数是质数,则两者构成互质关系,比如97和57。
4、1和任意一个自然数是都是互质关系,比如1和99。
5、p是大于1的整数,则p和p-1构成互质关系,比如57和56(整数和比它小1的数互质)。
6、p是大于1的奇数,则p和p-2构成互质关系,比如17和15(奇数和它上一个奇数互质)。
欧拉函数
任意给定正整数n,在小于等于n的正整数之中,
有多少个与n构成互质关系?
欧拉函数,以φ(n)表示 /phi/
欧拉与欧拉定理
https://mp.weixin.qq.com/s/7OhXzvnuylqPJU_tz3Suow
欧拉函数通用计算公式
任意一个大于1的正整数,都可以写成一系列质数的积。
设:P1、P2、…… Pr 是n的不重复的质因子
欧拉函数计算的几种情况:
代码计算:phi.py
网站在线计算:
https://math.yunser.com/prime/euler
欧拉定理
如果两个正整数a和n互质,则n的欧拉函数 φ(n)可以让下面的等式成立:
“a与n互质,则正整数a的 φ(n)次方,模n,余数是1”
欧拉定理的推导
https://zhuanlan.zhihu.com/p/35060143
费马小定理
假设正整数a与质数p互质,因为质数p的φ(p)等于p-1,则欧拉定理可以写成
“a与质数p互质,则正整数a的p-1次方,模以p,余数是1”
模反元素
如果两个正整数a和n互质,那么一定可以找到整数b,使得 ab-1 被n整除,或者说ab被n除的余数是1。
“a和n互质,如果(a×b)%n余数是1,那么b就叫做a的模反元素。b一定存在。”
R S A 加解密原理
总体流程
一、生成密钥对
二、消息加密
三、消息解密
一、生成密钥对
1、选择大质数p、q
2、计算pq的乘积n
3、计算欧拉函数φ(n)
4、选随机整数e
5、求模反元素d
6、得到公钥和私钥
步骤总结
步骤 | 举例 |
1、随机选择两个不相等的质数p和q | p=61 q=53 |
2、计算p和q的乘积 | n=61*53=3233 |
3、计算n的欧拉函数φ(n) | φ(3233)=3120 |
4、选择随机整数e 1< e < φ(n),且e与φ(n) 互质 | e=17(常用费马数65537) |
5、求模反元素d(ed≡1 mod φ(n)) | d=2753 |
6、得到公钥和私钥 将(n,e)封装成公钥,(n,d)封装成私钥 | 公钥= (3233,17) 私钥=(3233, 2753) |
模反元素
如果两个正整数a和n互质,那么一定可以找到整数b,使得 ab-1 被n整除,或者说ab被n除的余数是1。
“a和n互质,如果(a×b)%n余数是1,那么b就叫做a的模反元素。b一定存在。”代码:inverse.py
n:模数(Modulus),私钥和公钥都包含有这个数。
e:公钥指数(publicExponent),一般是固定值65537。
d:私钥指数(privateExponent)。私钥指数是根据φ(n)和e求出来的,因为φ(n)不公开,所以d也是无法计算的。
加解密公式
加密:
解密:
后面明文用m代替,密文用c代替
加密流程
结果,密文:65^17%3233=2790
三、解密流程
结果,明文:2790^2753%3233=
RSA加解密公式证明
https://mp.weixin.qq.com/s/kVXROoRulq1jYt--sU_9Xw
非对称加密算法的密钥位数=n的二进制长度
1024bit最大十进制309位
2048bit最大十进制617位
公钥指数
费马数
https://baike.baidu.com/item/%E8%B4%B9%E9%A9%AC%E6%95%B0/8080264?fr=aladdin
1732年,欧拉算出F5=641×6700417,也就是说F5不是质数,宣布了费马的这个猜想不成立,它不能作为一个求质数的公式。以后,人们又陆续找到了不少反例,如n=6 时,F6= =274177×67280421310721不是质数。至今这样的反例共找到了243个,却还没有找到第6个正面的例子,也就是说只有n=0,1,2,3,4这5个情况下,Fn才是质数。
https://crypto.stackexchange.com/questions/3110/impacts-of-not-using-rsa-exponent-of-65537
生产环境中公钥指数e常取e=65537(费马数)
R S A 的安全性分析
加密涉及到的数字
数字 | 描述 |
p | 质数1 |
q | 质数2 |
n | 两个质数的乘积 |
φ(n) | n的欧拉函数 |
e | 随机整数(公钥指数) |
d | 模反元素(私钥指数) |
回顾我们一共生成了六个数字:p q n φ(n) e d,这六个数字之中,公钥用到了两个(n和e),其余四个数字都是不公开的。其中最关键的是d,因为n和d组成了私钥,一旦d泄漏,就等于私钥泄漏。
如何通过n、e推导私钥的d
(1)ed ≡ 1 mod φ(n) ——只有知道e和φ(n),才能算出d
(2)φ(n)=(p-1)(q-1)——只有知道p和q,才能算出φ(n)
(3)n=pq——只有将n的因数分解,才能算出p和q
大整数的因数分解,是一件非常困难的事情。也许你可以对3233进行因数分解(61×53),但是你没办法对下面的大整数分解:
123018668453011775513049495838496272077285356959533479219732245215172640050726
365751874520219978646938995647494277406384592519255732630345373154826850791702
6122142913461670429214311602221240479274737794080665351419597459856902143413
它等于两个质素的乘积:
33478071698956898786044169
84821269081770479498371376
85689124313889828837938780
02287614711652531743087737
814467999489
×
36746043666799590428244633
79962795263227915816434308
76426760322838157396665112
79233373417143396810270092
798736308917
这也是目前维基百科记录的人类分解的最大整数(232个十进制位,768个二进制位),除了暴力破解,还没有发现别的有效方法。所以限制人类分解大整数的是计算机的计算能力,相信如果有一天真正的量子计算机问世后,又会引发一轮安全加密竞赛!
1999年,RSA-155 (512 bits)被成功分解,花了五个月时间(约8000 MIPS年)和224 CPU hours在一台有3.2G中央内存的Cray C916计算机上完成。
2009年12月12日,编号为RSA-768(768 bits, 232 digits)数也被成功分解[10]。这一事件威胁了现通行的1024-bit密钥的安全性,普遍认为用户应尽快升级到2048-bit或以上。
破解时间
1024位密钥长度,转换成十进制的长度是309位。从1开始尝试分解,共10^309种可能
大整数分解工具
http://factordb.com/
RSATool2v17.exe
yafu
Msieve
https://blog.csdn.net/mutourend/article/details/103559305
R S A 的加解密实现
加解密工具
http://tool.chacuo.net/cryptrsapubkey
在线加解密工具
加解密
公钥
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDHc+PP8LuTlBL1zCX+lh9kcur
gHHIXFnV/tDK789DaJuhwZvQ1lu5Zdcn+ULbNUKkB6b5tCP0sZxlpoCVKMyKHtde
h/YGXwBD8sMc+XcRs0eh3/tyr4EoBu3bomzHWDGmHjH/F5GotFTrGcB6xQwAROy4
mT5SketlQ3c7tucI+QIDAQAB
-----END PUBLIC KEY-----
明文
SecurityTest
密文
F5iAYON6ToJU+Ql6ySLzs1gMqDxj4MIpWhf4tjm7yFUEskmZhudMoHYEkklHzCkOrxVn2omaGysZC2INIpD6p9VwCCXaQ3BHetQMwE5/HF+Svkz+aFLvZLMQVRbearbST3JygO0Zo4lJRK7N3E+4DSD8uQ5Yi2Kcd7tljLLgbbE=
私钥
-----BEGIN PRIVATE KEY-----
MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAMMdz48/wu5OUEvX
MJf6WH2Ry6uAcchcWdX+0Mrvz0Nom6HBm9DWW7ll1yf5Qts1QqQHpvm0I/SxnGWm
gJUozIoe116H9gZfAEPywxz5dxGzR6Hf+3KvgSgG7duibMdYMaYeMf8Xkai0VOsZ
wHrFDABE7LiZPlKR62VDdzu25wj5AgMBAAECgYBKcdxYrp5EaHLwjNlIk0ciGfeY
pvhC1yGbqY6mb1soQAhpbkJyKudyVG4EHXGpy6dyiEzoJxg063NdwWp7/sYTHk/N
13UzGTudIKuNacnJk0WKu4owQticC71ZIqUjSZgN0CiEKQ6YfoGOFTzeMqzVYQjI
mPzGdLK74y3YYlmigQJBAObzhzYlWjOypx3klmrPTu2KXPg3ATTEB8kN/isY8bYu
ikVdd2yUd0AvaC7PPwEEjGmsSrEeXw1tsVfZ8VkBaikCQQDYR0+8VzGLdgIFQc/6
+IY5fQlEt/Hc7qsi7JT4o+f+BGJlAT7+OeDMThavKdWq1UvZDyCKdtYRfxQ1jj7D
4yJRAkBrG6InkGcm9sHecTb5Ti+ypqq7Svc6O3fI3L51ylm/PhJOXSyXpLsxf0r3
+pGjrTJZh9gUEJvQpIDM13zA5JERAkBI2zTsED9baIRjuvjR5Xhp00oVARYTw76Y
xDOm0qgq9NUki1fqEhs9F60ikqgspS+oziS7IC8as8FeDS3tlQ0RAkA5OdDvhQRQ
PI75ULyHazTEm4Rak8TKmKl64pmnwcw4GS9fKWs7jRAuem1OtwA8HAqjaDeXC8Cd
6fDfq7z5bZnE
-----END PRIVATE KEY-----
生成密钥对
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAorIOcAl3axXDmQe0nVFK
CKbSCHzIXbvq8CMgS1wqbgarnzoSP2nKpTJvgeDz0i1tMJocq4QegE/GXSbwib2G
WB0RSCSFZw6+fdzXVbyHEi/CrecvJNFymNByFSAFcFrPb6yX2AAvMBtvlWh8gIDV
8Zmxzt56B4pC0+89oTKyjbTzafyfBO8ivDcNm8hPTTt5+suaWaKsW98ZQyqa//H/
bPLrotXPjmy0ifA9DpuHmNB+gK4djGHdgVsBWjpwxo04pTfsU7Q/sidhYufs3nmv
gLjzJ7biiw9pQUSQ3SBBZwlD0w5ux0CvWqJ01IVGL3yUyxK1D3ZFUW4f2bQh5ZbZ
cwIDAQAB
-----END PUBLIC KEY-----
----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCisg5wCXdrFcOZ
B7SdUUoIptIIfMhdu+rwIyBLXCpuBqufOhI/acqlMm+B4PPSLW0wmhyrhB6AT8Zd
JvCJvYZYHRFIJIVnDr593NdVvIcSL8Kt5y8k0XKY0HIVIAVwWs9vrJfYAC8wG2+V
aHyAgNXxmbHO3noHikLT7z2hMrKNtPNp/J8E7yK8Nw2byE9NO3n6y5pZoqxb3xlD
Kpr/8f9s8uui1c+ObLSJ8D0Om4eY0H6Arh2MYd2BWwFaOnDGjTilN+xTtD+yJ2Fi
5+zeea+AuPMntuKLD2lBRJDdIEFnCUPTDm7HQK9aonTUhUYvfJTLErUPdkVRbh/Z
tCHlltlzAgMBAAECggEAeQJovKo92Tc54ZOaojw5DZBOviNZwGYqC2yE86hcorNx
aR//PI1KPW7zAy43C8ff4/tsgaHmMdekGdsBo+GEj/smxHrtgka0JtdgjpOH/13o
tgIyzXa/fqvjfpTvlq7khRJhajZQ4r41U3KAz++DsYx4dP6C0yLiK9JRC5mytrSF
fDJFPBylUerXdfX4517U0ngn+3rFFAPD8smzJkC0idSusl0617iYC9Xm1xFk+sUN
aaHQTtDYORKvJeLUbLmfGXF6Y0Shj/88o5/jwsmKh1Z6oELxx+xofGTyKt4j1I7S
O+ZV3KUPqw8559cifVWHL5h5b1adu7H5aK3CzRMG2QKBgQDRShZlydT8cJGSen4l
W0PWbwmNZvzGkCs/sElnZgwCRK4rLas6Z4kUOeekBT2gV1JaaKjdAGgTl5KH3AtC
bA5jBBUpTCPKBSQzUO2Y6pMddXR0QXZefTiJgroqv18LhEgBmts9wmCiDHGUzjv5
FuVjNCiz6MFKf1iUgBobUJdo5QKBgQDHAcq6XwJswu93dcYB+3bKJ95VooxvEv3X
zmUqFcoju/7xGuSnTsZCXv21DMouDKzNbhCuL4xTJ3tjH1YnN/boZNN7Mkxa3gNR
g/dA6/1mA20yj3ERlgiou4YYPkMK1pKQ2evqPuBwYAmDTE2rP4xrY/ESwvQfPYm2
zNYSj/JLdwKBgQCrv0W0EDY1VtdPQjBEzalUzlgjbvFerS6gnDUQoiCWt+/JxTdv
vUkzjPU3l4lkDGSrhpmUiuHduhPoY73lqzD/Nnl7I113SlLTvcTNKSrDEQEY6iOO
FOqRhfLqY5NGqy5ACumBvAJ62QVYXQnANnbVuxbv1MDSNsDlVF6YLcGitQKBgQCY
r/RGeF0Y65vl8TPiE3j59Arvc08CbfTbXl1aI+u67SPXA4ZKI/OTuuQ3xD9fg5QV
7gvYSV0F8/YEgGeOoa7McYedL2NMGKk9It5TLn12hsyCjXH4R0APjgl9kk/IAgfk
IX+Tc3iqX9UMqz+wU4q+Xqj5dyDs0z9VROY+ybjiUwKBgEnApxTBIpSdoOKCveMi
Sel+V0/pIzu4wDNbkkGncdpV/sYT/hIifaYSK50k/lyuri6Ggh5MZ51R7W63St0i
4QwueJZPsYjZ2uK1cdD2JXhZgl9U1tEpH0Jm5+6Cvn48Jyy2sfZE90MFX0EYD/bs
QbSP1tz30GOVFckxmarBhxWx
-----END PRIVATE KEY-----
私钥密码清除
-----BEGIN ENCRYPTED PRIVATE KEY-----
MIIFDjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQIVWcnxmpgqhQCAggA
MBQGCCqGSIb3DQMHBAgE/HwoLPS3tgSCBMi6ZEl5zPt020FlEErZXz5akwSHYy+y
QcZKAEmaJqn5mz8L4kmjO1JivuOBctBD46/C2aSWZO5RfH1YNAXWl+RQZhDYzav0
hKCNlkBOeNwAsf9e1Kzzmvvrrxqzzml+jGkjTtMlhm0tDJTBDsRDGSNKxgbWVMYz
mx4nnsEanQB089H/wEK0UCetWAIbJ2gIeAUn/vj1o+ixWZSb/OwiBLh/GT4Z2zLJ
j6sYbcuF8JWopDtM+JTKUA2RuObFfmN1WoYgMM+OA6dZamPjvvzGfw6dIxvXMRbm
Nt5pqsgjAm919HaQa/8CtJFGQSB0VAUagqMdbwoXMYZb+y6iaMU2Rc/WOKFrGuUd
I0v1ZLcCrWhTuNbuqiCkybMUBkukvW92Etb6iUPnS3LzRLNe3DwqQnBeaFoojV/S
VuAQfTaU4uMyD0EtYwV5NsetSfICSax1IOo4raPFaMry2GHnQaJKwi9QsuUPQVA4
AX9EYzxWJC3onjo/EXgsbwlAuVhJmMrYr/COZBcTCT3nUWarSTUigQTsnuiooIwN
UEAg78G0dR+AnJ/P6M6zlUNM3Y/0LMguzwb3ljTPfUJmGsZr3gY/66D64pv3ZbeN
O1dnBF6FCJoxkySxfnXtZntK0OmF4eX8OYSka40EnShkrakSBCNxhyTEpyL8Pv8D
YwW+ejUOa4Jd/heGTTtIWfLrzq52hDEYwxQbFlT6Lf2+4oOMdv1EQeYNAsRvx+Rq
+78fSJlmgQxSahteL05U3loaWHr83FLNfC4vYeYZjmy09FkEuYAClu+3v+L1KBVV
GtSHDYh7kH7QZjRoeXfVOtU72TU//ncDPtZv9supPOLhvUKZvZ0Ao6yxD+PoTmw+
vc9jxy9yGoJO+ebE2/FICpoU3NXijIeV6sUMftVVK0GdndM0zszYiopDmnrKtZ68
hvk5JEFyOfU8VIJ3Y3uO6ZG6Nj7FB+21AE1Eh9AKeTw5uBmgwHO0l4tFsLYER3tz
RfA0UQPQlVuxVF8l3XvkA6omOeqLsrkR41T7zt6IHuXl4QMnmUP/AIUKSId85iys
HpNDnWX83SksBoctyoVDmEkyEDuzB6i2RUyWY4A9mBCKBDa0IgHDjihin31rzDU/
z3mvnGebhZrXpAwjmhryGC0xkiMCoFOnxU4r5xK+TSdDFvrP9uYOgPaYrC2QS1nL
cru8HCdl+53qll+cN/hr/e826eGGhbt+Dn/4VJfzk7y8oyZNEWhUfdgYt0Mn4BHx
Y1vrAmRc7Nl90YrUJkG5BAOqVDYpNkAJCl+jfmsd2oDcW4Jz64rzAv5/WmLW49Lh
UPJRN+B9xZgpqeVbuMqZBfLDUaqFfojTOldbt8QTcMhVQ0lQtmW/0I3xMEzg0TEf
orr9WnMMAOkM8gOkdtK1mdWPquDhoXNBSbD3/7mZw0ij5Y1iap998lWYXpJdfaPg
vCjK14Phg+0rXus9s3JCtKc8fPFrfcsGa/XYxAZPKUDY8W2gUGnwMUDI+PixH5fJ
1fTr6XHjT4+mpMWc1+XvgZffOZoKslX4xxFS+McW/DV53ee42oiRsnwuKit7TW/Y
vGN+qwHI5l5+s9vw+sVtzwxUBtyBwsfyIU80GesfFa8U9fed6V2aRSimrJ7Ie5rl
jd8=
-----END ENCRYPTED PRIVATE KEY-----
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCtbHpyd9z5SB27
sJbkK0I555xmoEJSihAO8fGLELEyHlPKODUdOQAdb31a707CjiZngv4KP/ClBgNO
jJQ1car46++GcdIfnTFz19K0yq7hKLNucsqvSPoNZaw41gr1Wy3WKUFyuKRkcFDz
zaqAROvczSKm8AmDr7i1e/k/Nr9rhb6f4mZh9FkOByV2gcOPgI455lk0/xEPjUFn
HSQBav0zG3fvGi6MGdCJGVZXRnOnLsNudUTpNCFLZBPrDYKO3QQX0rDoFwgHEVh1
2VJo3YuHsdVG5WdVWuMLZFRRpCaYpB32bsflUcOhgcCtwmNZUxityuBiUGQiUHBT
H9iOE3P/AgMBAAECggEAKFwakxE6J/mUkd2jAC7hFsDEMU4SoUroOdIsuISF+Hf+
YA18rvRZBoCv173hwn16ipR9srz2sDEaC+nDhDyT4aJm+A79K8ZVf/Q2YUTaNiRW
vdmROgHtz7hdwExv+HHj1Pd898no2EcbT+IJUBi6G4TSD6/FRxRaFEJp20BOhCMW
CWCtfarxR4ViKZyjI+qHLBKAy6pcO6JS1VlhqpKxJa61RhYkcx6O/JblnhONMcM7
EmtVye5D9acrnnPHImVTV1L9+52ZtdMgj1zJ1P37ym8CQiJVeKlJbzBaOupjmj99
ARjLYKWXhbcMs+tR/ea9ojDwFbBZZ4BQmMPsw/Tn4QKBgQDVPyos8EzntuoJt9ay
rgza/cCuU73dL0LMmTCLeR0UjmrCR88YqlWL149mwyx7tvIRwZP20gxlkmc4bulX
WwQFTJyoK4Df9RsVr6ChrRCMgy0kPiHGY9wTvD4PE9jAOnLbjqSvpCL5JFkXS5d3
H4Pep+axS4pWKvibBhMNJRQe3QKBgQDQMWiMuUipF1q2ppXnlMBjS9RZEYqndJ/h
6Qtt1T1DV2p//w2tmCHTCrwNK50reppWrLSWT3vTjugF463pKy3UWeirGfvIRdic
1Su2aRbEu/Yk9rGkYmBcXBPIk7jCmxo+TNYr+B6bkhAdjQB1gQgIqQ/8wgmLURQn
3Q3GpTFaiwKBgA8CjDBvlao1uNGITCd1ktgTRm2+3T1lZzlJix42HzLkN2WHcm9V
BgJ64NAl6sqmfPF9A7I65L59iKBzRh9s+6J32wsHTOH2ubpUC2V17hVF4naLnQr+
2m3VMTUUe4xEUPNdXgAy+Hc69L5sBrRO1pRkkxtlqs4X5jnbOpoRQxJNAoGAO8oE
sW1Ajbb0SUIcCM6yVZHgYNflzuNySwmHS7qShnVjU3Dm97SZ+ia6DLo6v9LM4hll
H0miUQZYYeCaAD1zQumzJPgoU8KjS574l8EkVcl5DfJ+36uU6tFSqSarR9ANQFkG
pMfz2k+fKy1kNVqh+QK8YaVD4mudczlLjIHCY7MCgYEAoSH/GrX/+mav6n2Plb3K
kp3ZUjcIbj25kPbBmXShmF5I3xvxln3iiF0t/JNXJuPnizKDbjiiHJBtYtRwRLk1
iHCP+6duAmCttP8NYd3iUGnOudaRaD31AHFp9e62RJrD1z4MVqj4r5a1vVSjQonh
i+SuKuMBAsZYDAkcStIcHwo=
-----END PRIVATE KEY-----
命令行工具
安装
openssl
http://slproweb.com/products/Win32OpenSSL.html
安装后要设置环境变量
openssl help
openssl rsa -help
openssl
生成密钥
openssl genrsa -out private_pkcs1.pem 1024
-----BEGIN PRIVATE KEY-----
MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBANapouxEaAuFqUIg
W9RzeNpE7RAXLQ/Wj66HThwxC9DSZ0O350YyCPZ3XtdfcW7Y6+jR5lKjd8sb8t3w
0xKLpJXhjFN48r1sJYOWNbEucwNrioNhSBkrQjGhVqiLXCeIH5Ma5yerFCzLhB5k
FmNU2SJhijqN61FmUgffS4ElnbGnAgMBAAECgYAVYCMHH/C0ZQTrvskmKLF6Gq74
kTY9g4IfQP34NLIWgz0hMyjmhoj58f0RuUFUZmlnb69dv0Vohkny68445Iro6xGd
DVcap3D29Z1sh1IT37r01Xx0tii3K3wFINv0NVwrPGGvZ/3v9zoZLmPu4YffVflt
7c4MaCSWOSdKQVrl0QJBAPyYN+o4ApWO4iUwtI940kiG1mNmfZObIVmgJtIIxMOV
dFpXVZ1BON9we490sXtqlczWUTuaQ6GFwh169WMSqQMCQQDZjoDOWcJZO0r1/IIL
YQAH/j19PgU/aajKIzjN6sNLd9EPS36C+9Rqd0Ing+kGR12rqQKJKGfT+rQnbvh5
TImNAkEAvtiThpeC/FTUcJz4D16OItYdrUSGpLuU2w6xxgdyAwQswQUzXnkk600l
TiIw5rqFLBrRjWLkrmlNXNDGDnDO2QJBAIC1Idbym1wXC/4DaRw6Qr531wDlVE1z
wPv1YoHQRcG8HN6jlzD+s2hZLbYbAB1K00vfLTTfxq1OQI6jxDRe53ECQA+TxDnJ
Pukbz1yq5JKTnFpFTXDEsJ9DuJKuR2APfJ5NH9/nQsIXzsglv2VrkFvtoFYU6z2l
L1KMffK5khqoZHM=
-----END PRIVATE KEY-----
从私钥提取公钥
openssl输出格式pem和der
openssl rsa -in private_pkcs1.pem -out public_pkcs1.pem -pubout -RSAPublicKey_out
-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBANapouxEaAuFqUIgW9RzeNpE7RAXLQ/Wj66HThwxC9DSZ0O350YyCPZ3
XtdfcW7Y6+jR5lKjd8sb8t3w0xKLpJXhjFN48r1sJYOWNbEucwNrioNhSBkrQjGh
VqiLXCeIH5Ma5yerFCzLhB5kFmNU2SJhijqN61FmUgffS4ElnbGnAgMBAAE=
-----END RSA PUBLIC KEY-----
导出DER密钥
openssl rsa -in private_pkcs1.pem -out public_pkcs1.der -pubout -RSAPublicKey_out -outform DER
base64工具
https://the-x.cn/encodings/Base64.aspx
DER格式是二进制的内容
pem是对DER base64得到的
密钥格式
密钥格式PKCS1/PKCS8
PKCS
Public Key Cryptography Standards,翻译:公钥密码学标准
公钥密码学标准:
https://zh.wikipedia.org/wiki/%E5%85%AC%E9%92%A5%E5%AF%86%E7%A0%81%E5%AD%A6%E6%A0%87%E5%87%86
结论
PKCS8是更晚出现的私钥存储标准,支持的算法更多,安全性更好
PKCS1格式定义
PKCS1私钥格式定义
RSAPrivateKey ::= SEQUENCE {
version Version,
modulus INTEGER, -- n
publicExponent INTEGER, -- e
privateExponent INTEGER, -- d
prime1 INTEGER, -- p
prime2 INTEGER, -- q
exponent1 INTEGER, -- d mod (p-1)
exponent2 INTEGER, -- d mod (q-1)
coefficient INTEGER -- (inverse of q) mod p
}
PKCS1公钥格式定义
RSAPublicKey ::= SEQUENCE {
modulus INTEGER, -- n
publicExponent INTEGER -- e
}
查看密钥值
openssl rsa -in private_pkcs1.pem -text -noout
C:\Users\Strix>openssl rsa -in private_pkcs1.pem -text -noout
Private-Key: (1024 bit, 2 primes)
modulus:
00:d6:a9:a2:ec:44:68:0b:85:a9:42:20:5b:d4:73:
78:da:44:ed:10:17:2d:0f:d6:8f:ae:87:4e:1c:31:
0b:d0:d2:67:43:b7:e7:46:32:08:f6:77:5e:d7:5f:
71:6e:d8:eb:e8:d1:e6:52:a3:77:cb:1b:f2:dd:f0:
d3:12:8b:a4:95:e1:8c:53:78:f2:bd:6c:25:83:96:
35:b1:2e:73:03:6b:8a:83:61:48:19:2b:42:31:a1:
56:a8:8b:5c:27:88:1f:93:1a:e7:27:ab:14:2c:cb:
84:1e:64:16:63:54:d9:22:61:8a:3a:8d:eb:51:66:
52:07:df:4b:81:25:9d:b1:a7
publicExponent: 65537 (0x10001)
privateExponent:
15:60:23:07:1f:f0:b4:65:04:eb:be:c9:26:28:b1:
7a:1a:ae:f8:91:36:3d:83:82:1f:40:fd:f8:34:b2:
16:83:3d:21:33:28:e6:86:88:f9:f1:fd:11:b9:41:
54:66:69:67:6f:af:5d:bf:45:68:86:49:f2:eb:ce:
38:e4:8a:e8:eb:11:9d:0d:57:1a:a7:70:f6:f5:9d:
6c:87:52:13:df:ba:f4:d5:7c:74:b6:28:b7:2b:7c:
05:20:db:f4:35:5c:2b:3c:61:af:67:fd:ef:f7:3a:
19:2e:63:ee:e1:87:df:55:f9:6d:ed:ce:0c:68:24:
96:39:27:4a:41:5a:e5:d1
prime1:
00:fc:98:37:ea:38:02:95:8e:e2:25:30:b4:8f:78:
d2:48:86:d6:63:66:7d:93:9b:21:59:a0:26:d2:08:
c4:c3:95:74:5a:57:55:9d:41:38:df:70:7b:8f:74:
b1:7b:6a:95:cc:d6:51:3b:9a:43:a1:85:c2:1d:7a:
f5:63:12:a9:03
prime2:
00:d9:8e:80:ce:59:c2:59:3b:4a:f5:fc:82:0b:61:
00:07:fe:3d:7d:3e:05:3f:69:a8:ca:23:38:cd:ea:
c3:4b:77:d1:0f:4b:7e:82:fb:d4:6a:77:42:27:83:
e9:06:47:5d:ab:a9:02:89:28:67:d3:fa:b4:27:6e:
f8:79:4c:89:8d
exponent1:
00:be:d8:93:86:97:82:fc:54:d4:70:9c:f8:0f:5e:
8e:22:d6:1d:ad:44:86:a4:bb:94:db:0e:b1:c6:07:
72:03:04:2c:c1:05:33:5e:79:24:eb:4d:25:4e:22:
30:e6:ba:85:2c:1a:d1:8d:62:e4:ae:69:4d:5c:d0:
c6:0e:70:ce:d9
exponent2:
00:80:b5:21:d6:f2:9b:5c:17:0b:fe:03:69:1c:3a:
42:be:77:d7:00:e5:54:4d:73:c0:fb:f5:62:81:d0:
45:c1:bc:1c:de:a3:97:30:fe:b3:68:59:2d:b6:1b:
00:1d:4a:d3:4b:df:2d:34:df:c6:ad:4e:40:8e:a3:
c4:34:5e:e7:71
coefficient:
0f:93:c4:39:c9:3e:e9:1b:cf:5c:aa:e4:92:93:9c:
5a:45:4d:70:c4:b0:9f:43:b8:92:ae:47:60:0f:7c:
9e:4d:1f:df:e7:42:c2:17:ce:c8:25:bf:65:6b:90:
5b:ed:a0:56:14:eb:3d:a5:2f:52:8c:7d:f2:b9:92:
1a:a8:64:73
解析密钥值
00d6a9a2ec44680b85a942205bd47378da44ed10172d0fd68fae874e1c310bd0d26743b7e7463208f6775ed75f716ed8ebe8d1e652a377cb1bf2ddf0 d3128ba495e18c5378f2bd6c25839635b12e73036b8a836148192b4231a156a88b5c27881f931ae727ab142ccb841e64166354d922618a3a8deb5166 5207df4b81259db1a7
00d6a9a2ec44680b85a942205bd47378da44ed10172d0fd68fae874e1c310bd0d26743b7e7463208f6775ed75f
716ed8ebe8d1e652a377cb1bf2ddf0d3128ba495e18c5378f2bd6c25839635b12e73036b8a836148192b4231a1
56a88b5c27881f931ae727ab142ccb841e64166354d922618a3a8deb51665207df4b81259db1a7
150741233709307799862500860796076303066984451790170571247719675966823951218627784210838601302035525686123506731296197110978447510042802153855101420343987871795047244757375678441675814473069138783674119370690427306844413870500821577252511936938919093154884441546841067663127768833539501388693837047571316322727
n
2529018238047538168777947241761704089036260616325278350666382511145414263568381559306628755182131254109642275108410258909461385220650260980492048871791939769827116447506520290429305478760087093644865301051607501224487381877090920796354633871609230961903797770940085121619374906273876991459436103223113165472666595751
prime1:
00fc9837ea3802958ee22530b48f78d24886d663667d939b2159a026d208c4c395745a57559d4138df707b8f74b17b6a95ccd6513b9a43a185c21d7af56312a903
13229452827204012182747473488383501245224790320146303795177012252961861835148545258094139268923245503417246796632906496182631189654752862450864919699171587
prime2:
00d98e80ce59c2593b4af5fc820b610007fe3d7d3e053f69a8ca2338cdeac34b77d10f4b7e82fbd46a77422783e906475daba902892867d3fab4276ef8794c898d
11394366469891733965056877253184340084685796936248361741584007349130971958591907674139376676435347380695975432903274478974139977696817092041733411047246221
13229452827204012182747473488383501245224790320146303795177012252961861835148545258094139268923245503417246796632906496182631189654752862450864919699171587
乘
11394366469891733965056877253184340084685796936248361741584007349130971958591907674139376676435347380695975432903274478974139977696817092041733411047246221
是不是等于
2529018238047538168777947241761704089036260616325278350666382511145414263568381559306628755182131254109642275108410258909461385220650260980492048871791939769827116447506520290429305478760087093644865301051607501224487381877090920796354633871609230961903797770940085121619374906273876991459436103223113165472666595751
==== modulus-- n ====
150741233709307799862500860796076303066984451790170571247719675966823951218627784210838601302035525686123506731296197110978447510042802153855101420343987871795047244757375678441675814473069138783674119370690427306844413870500821577252511936938919093154884441546841067663127768833539501388693837047571316322727
==== publicExponent-- e ====
65537
==== privateExponent-- d ====
15010410778444889175621108954562978986147375259512231990518617046240949473621998562032633658804703306950913299791552593897269457719140742726374290388099313222140677578158815889332490437150261389837265480286531817172783643759327153561408931512555145822231932231356559721264750390146644639167080609056623879633
==== prime1 -- p ====
13229452827204012182747473488383501245224790320146303795177012252961861835148545258094139268923245503417246796632906496182631189654752862450864919699171587
==== prime2 -- q ====
11394366469891733965056877253184340084685796936248361741584007349130971958591907674139376676435347380695975432903274478974139977696817092041733411047246221
==== exponent1 -- d mod (p-1) ====
3442394246184319061181093736850167555544990484005039408066656404794835457158480060286218242901794055405660048098231769758371775176704145528624274431561223897
==== exponent2 -- d mod (q-1) ====
6740961239767494839452297860147141824670609256026694561006685276111296592436721918026945275169008173159350587981228284767159851919694100929888273999783793
==== coefficient -- (inverse of q) mod p ====
密钥解析工具
在线进制转换:
https://tool.lu/hexconvert/
网站在线提取
http://tool.chacuo.net/cryptrsakeyparse
代码提取
rsaextract.py
用代码实现RSA加密
Python Crypto模块
Python Crypto模块
https://pycryptodome.readthedocs.io/en/latest/src/api.html
python RSA加解密
生成密钥对
生成密钥对:rsa1_gen_keypair.py
# python 版本 3.x
# windows安装依赖:pip install pycryptodome
# Linux安装依赖: pip install pycrypto
from Crypto import Random
from Crypto.PublicKey import RSA
# 伪随机数生成器
random_generator = Random.new().read
# rsa算法生成实例;密钥长度1024位
rsa = RSA.generate(1024, random_generator)
# 私钥的生成
private_pem = rsa.exportKey()
with open("private.pem", "wb") as f:
f.write(private_pem)
# 公钥的生成
public_pem = rsa.publickey().exportKey()
with open("public.pem", "wb") as f:
f.write(public_pem)
加密
加密:rsa2_encrypt.py
# python 版本 3.x
# windows安装依赖:pip install pycryptodome
# Linux安装依赖: pip install pycrypto
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5
import base64
# 加密
message = "practice makes perfect"
# 读取公钥
rsakey = RSA.importKey(open("public.pem").read())
#创建用于执行pkcs1_v1_5加密或解密的对象
cipher = Cipher_pkcs1_v1_5.new(rsakey)
# 加密以后base64编码输出
cipher_text = base64.b64encode(cipher.encrypt(message.encode('utf-8')))
# 随机填充内容可能会导致加密结果不同
print(cipher_text.decode('utf-8'))
m0xVihOS4jMTev6VJiT9QRlTsEKCmgBObDHIr6HjgVaUg5heqstcqEnxHlvy12p9Q1ybmQGKVr1Hu1htNS2oDzqPd6/5deP/Jvg9qdaZ9JrucMfzQ5Z4oRGlVz0KaHZiI7rU+T4V90zJpv0+loDpcV4f7uZot4ouu72BXAdGRtQ=
acPfOyLF9t8zR7K63oyOTO1pD3a2t/sTUs7PdaJFnRPeP+bY2TVpF0k8ycUGHaA6YjvzVTNrv/FFKmoZBU2zmZpFT3BNs9Mj+qgNWfIQJMiqaJbKIOJtTp5j2H7mgeQlXM/z3V1ggoKxJVoL/7aoR/AE1kUMoqGZ447z4LG5I9I=
odC/mhYit4VNE1ZLrsyelAj2ZGpFCJLUqc7lpD/g/q55migmNFDXGS8SthcEL7eJyU7wSu6pF3Yr/OtuGzLUOnmHVt6PvM9j00Sb/7DPAXz2JHxwOewSHQjrZDJyJiA6Y/DVnOH244GrIGvtdafgqrRPO3idvIOSiZj7jSNqLFA=
问题:
1、为什么每次加密结果不同?
2、如何加密长文本?(m比n大的时候怎么办?)
11byte的填充预留位
随机填充内容可能会导致加密结果不同
https://www.rfc-editor.org/rfc/rfc3447
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
解密
解密:rsa3_decrypt.py
签名和验签
相互发送消息
身份冒充问题
签名和数字签名(signature)
签名和数字签名(signature)
私钥加密,公钥也可以解密(不是我的私钥发送的消息,别人无法解密)
作用:防止身份伪造
公钥加密,私钥解密
只要没有私钥,就无法解密消息。
解决了机密性的问题
私钥加密、公钥解密
如果不是我私钥加密的消息,你们都解密不出来,如果解密不出来,肯定不是我发的消息
身份认证问题
签名与哈希
对消息的哈希值进行签名
MD5withRSA
SHA1withRSA
SHA256withRSA
不是对原文进行加密,而是用原文的hash值进行加密,用RSA私钥加密hash值,得到签名。把原文和签名一起发给消息接受方。
Hash算法
原文内容的微小变动,导致hash值完全不一样。
Hash+签名
身份防止伪造,内容防止篡改。
验签流程
https://opendocs.alipay.com/common/02kipk
签名和验签-python实现
代码:
rsa4_sign.py
g3C2GFUwKR/ZNokKRtW/zicEo4aDlWQdWkv11CYYII/mk/cNjZpXH9/qvqy+483xgcX7qPBgThqVA4kR9c2orMbjfqMLEEuBfdMNJSRRwyLTEHrNPrgGsqAdyiPWG3/SZlHnG2h0FnVTDOnjlzGKrALKSxsQhFOloH1lWnnISWc=
rsa5_verifysign.py
总结
1、加密流程比较复杂,不能做到一次一密.
用来加密对称加密的密钥
2、对于大数据量的消息加密,不适合;速度慢
适合:少量消息;短消息
3、1024位密钥明文长度不能超过117;超过需要分段加密
- 相同的明文,相同的密钥,每次加密结果可能不一样
作业
1、描述RSA密钥生成的流程
2、用任意工具生成公私钥对,并且将私钥中的数字全部提取出来转换成十进制
3、在一次RSA密钥对生成中,假设p=473398607161,q=4511491,e=17,求解出d
4、为什么密钥长度大于1024的RSA加密算法被认为是安全的?
5、描述RSA加密和解密的计算公式
6、RSA加密算法,为什么同样的明文每次加密结果不一样?
7、密钥长度为1024位的RSA加密,最大的明文加密长度和解密长度分别是多少?
117 128
8、数字签名的作用是什么?