注意:只是我的理解,可能有不正確的地方html
RSA是目前用的最普遍的不對稱加密算法,即採用公鑰、密鑰兩部分,公鑰用來加密,私鑰用來解密。公鑰是公開的。
算法
RSA算法的可靠性基於數學難題:對大數作因式分解很難。安全
目前尚未快速算法,以目前計算機的計算能力,求解須要很長時間。數越大須要的時間越長,RSA算法也越安全。函數
因爲RSA算法加解密運算量大,因此一般RSA算法先用來加密一個對稱加密算法(好比AES、DES)的密鑰,實際數據加密解密過程使用對稱加密算法進行。優化
公鑰、密鑰生成過程:加密
注:歐拉函數、互質、模反元素等概念參考文後文章1和2spa
一、找到兩個比較大的質數p、q3d
二、計算他們的乘積n,n=p×q。htm
在實際中用二進制表示的n的位數即RSA密鑰長度,1024位RSA密鑰,就是說n有1024位。n越大越安全,到2010年被分解的最大的數是768位,但密鑰越長,解密運算量也越大,因此爲了平衡目前一般密鑰在1024到2048位之間。blog
三、選取一個整數e
這個整數須要知足的條件:
1<e<φ(n),φ(n)是歐拉函數,好比若是n=8,那麼φ(n)=4。
e與φ(n)互質
在實際狀況中e不計算,只選取一個固定的質數,一般爲質數65537。
四、計算整數d,d爲e對於φ(n)的模反元素
五、公鑰爲n、e,私鑰爲n、d
使用公鑰、密鑰加解密:
一、使用公鑰(n、e)加密:
若是須要加密的整數爲m,且m<n,那加密後的結果爲:
c=(m^e)%n,^表明乘方運算,如2^3=2*2*2,%爲求模運算,好比5%3=2
二、使用私鑰(n、d)解密:
原整數m=(c^d)%n
使用公鑰、私鑰給信息簽名:
將加密、解密過程反過來就能夠實現「簽名」效果,由於使用私鑰加密過的信息只有公鑰才能解密,因此能夠驗證信息確實來自私鑰的全部人。
一、使用私鑰(n、d)對信息m簽名
c=(m^d)%n
二、使用公鑰(n、e)驗證簽名
m=(c^e)%n
加解密示例:
一、選兩個質數p=61,q=53
二、計算乘積n=p×q=61*53=3233
三、選取整數e=17
四、計算整數得d=2753
五、得到公鑰(3233,17),私鑰(3233,2753)
六、將整數m=65加密:
c=(m^e)%n=(65^17)%3233=2790
七、解密:
m=(c^d)%n=(2790^2753)%3233=65
簽名示例:
仍使用上例公鑰私鑰
一、對整數m=65簽名:
c=(m^d)%n=(65^2753)%3233=588
二、驗證簽名:
m=(c^e)%n=(588^17)%3233=65
由加解密示例能夠看出解密過程的計算量是很大的,好比若是直接計算2790^2735,對CPU要求高,計算很耗時。實際使用中兩個數比如今更大,直接運算是不合適的。但(c^d)%n這種運算被稱爲模冪運算(Modular exponentiation),有一些的優化計算方法,比直接運算佔用內存小速度快,但運算量仍然不小。
實際應用中一般再計算如下三個數exponent一、exponent二、coexponent並和私鑰保存在一塊兒,用於優化解密過程,雖然如此解密仍是很佔用CPU的。
因爲公鑰是公開的,實際中公鑰也會保存在私鑰中。
好比查看一個由openssl生成的私鑰:
生成1024位rsa私鑰,保存爲pem格式:
openssl genpkey -out key.pem -algorithm rsa
查看私鑰內容:
openssl pkey -in key.pem -text -noout
輸出:
Private-Key: (1024 bit)
modulus:
00:bd:c0:10:ae:26:12:c3:82:2c:56:d1:bb:26:42:
38:47:3d:ca:c5:ae:a4:c8:de:27:4f:a1:61:e5:f3:
2e:ce:d7:48:62:20:1f:76:47:c2:cf:6b:43:d2:b4:
b6:b4:eb:21:21:d6:f4:d8:c8:09:ab:cd:c5:ce:65:
48:56:43:d6:d2:f4:0c:e4:66:ef:34:33:bd:9d:1d:
d3:23:af:39:63:51:4c:b5:88:ea:b5:92:7e:4e:e0:
6f:cd:50:7f:06:49:ea:dc:80:59:12:d4:59:86:6e:
79:a5:b7:d9:c0:b0:c8:cd:12:4b:6c:49:7e:33:5f:
b4:f7:6b:37:8e:18:42:3c:ed
publicExponent: 65537 (0x10001)
privateExponent:
3f:4f:d5:80:f5:ed:2e:d4:c1:4c:9a:a0:32:4c:c8:
10:65:3a:c2:28:da:8c:b7:2b:30:b3:ad:41:97:99:
97:a4:57:5f:7e:4e:61:1d:e2:8f:68:bf:f1:8f:20:
a3:4f:0c:f8:08:8c:1b:c4:eb:0d:2b:14:84:20:61:
39:7f:5b:2e:e6:84:87:2f:0f:e1:b2:a6:ec:6a:19:
33:c7:44:c9:86:ca:66:9d:ad:d4:a3:70:f2:a7:99:
da:fe:1a:c2:8e:21:01:bb:4d:14:48:16:67:d0:59:
4a:25:0a:0c:2c:73:3a:47:05:d6:de:b9:d1:a5:67:
b8:98:03:fe:e9:ae:3d:75
prime1:
00:ed:ca:a8:af:62:70:84:c2:53:bf:6e:61:cd:ac:
24:7e:4c:cd:16:28:f3:f0:b8:10:bb:b5:9f:f5:49:
fd:98:e7:28:44:d4:82:8c:9c:14:69:07:79:49:0e:
b8:fd:8d:0c:d8:74:5a:06:f3:8c:9f:f4:39:f2:57:
ce:31:57:50:9f
prime2:
00:cc:47:ab:3b:77:12:e9:43:9f:cd:61:ba:05:22:
83:89:d1:b4:f5:97:32:7c:4d:ff:63:03:d4:df:cb:
1c:9b:4a:88:aa:a7:e9:8e:92:66:3f:2c:34:b7:b3:
f0:ec:86:00:30:d9:01:17:34:96:7c:35:c9:c1:8b:
87:80:35:8a:f3
exponent1:
37:08:02:b7:ec:21:3c:28:38:f7:81:95:32:e3:16:
e2:ff:e5:2a:ae:b9:9d:c9:0b:5e:55:af:3a:36:30:
71:75:75:b5:50:35:12:53:80:c9:b9:c8:10:e7:4e:
5a:a7:8d:04:7f:10:e2:b0:f4:a7:83:fe:f1:1d:ef:
03:2e:40:e3
exponent2:
00:8a:21:70:24:ce:98:88:08:c5:16:e0:9d:23:79:
ba:0e:48:32:1f:da:f4:35:5f:9c:70:3c:98:06:17:
d6:a9:1f:16:18:a7:5f:e3:9b:14:ee:64:9a:e5:19:
14:b1:2a:cf:18:38:b4:67:17:95:26:3a:4c:c9:c5:
ea:83:04:31:87
coefficient:
6e:09:3a:c8:dd:44:2e:1c:e0:e3:e7:a3:44:7e:c3:
56:fe:6c:a9:22:44:11:63:92:91:90:80:f4:86:6e:
e5:03:c0:ea:2e:c1:83:8c:5b:74:82:8b:5d:22:6e:
6f:2b:9c:d2:84:29:60:12:dc:06:3a:5f:65:bd:66:
6a:aa:fb:d9
各項內容表明意義:
來源(http://stackoverflow.com/questions/22078801/creating-pem-pfx-from-private-modulus)
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
otherPrimeInfos OtherPrimeInfos OPTIONAL
}
參考:
RSA算法原理(一) http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html
RSA算法原理(二) http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html
wiki: http://en.wikipedia.org/wiki/RSA_(cryptosystem)
exponent一、exponent二、coexponent做用: http://www.di-mgt.com.au/crt_rsa.html
RSA密鑰生成速度參考: https://wiki.strongswan.org/projects/strongswan/wiki/PublicKeySpeed
模冪運算 Modular exponentiation : http://en.wikipedia.org/wiki/Modular_exponentiation