非对称加密和RSA

上:

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. 相同的明文,相同的密钥,每次加密结果可能不一样

作业

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、数字签名的作用是什么?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值