同餘:給定一個正整數m,若是兩個整數a和b知足(a-b)可以被m整除,即 (a-b)/m 獲得一個整數,html
那麼就稱整數a b對模m同餘,記作a ≡ b( mod n )算法
RSA算法的參數構成:dom
1)選擇兩個大素數p、q;函數
2)計算n,n = pq和n的歐拉定理的值,ψ(n) = (p-1)(q-1)測試
3)隨機選擇公鑰e,e只須要知足1<e<ψ(n),而且e和ψ(n)互素,(e, ψ(n)) = 1優化
4)計算私鑰d,知足ed ≡ 1( mod ψ(n))加密
公鑰(e,n),私鑰(d,n)htm
最基本的RSA算法,很容易受到選擇密文攻擊,因此一幫能夠採用最佳對稱加密填充(OAEP)來解決。blog
這樣就切斷了攻擊者,直接利用密文來測試明文的途徑。ip
CRT,Chinese Remander Theorem是一種對模冪運算速度進行優化的算法。
在計算模冪的時候,能夠分爲兩步:
1)CRT keysetup
input p(first prime modulus factors),q(second prime modulus factors),d(私鑰 secret exponent)
output dp,dq,qinv;
流程:qinv = 1/q mod p;
dp = d mod (p-1);
dq = d mod (q-1);
2)CRT Modular Exponent
input msg, p, q, qinv, dp, dq
output c
流程:mp = msg^p mod p;
mq = msg^q mod q;
i = mp^dp mod p;
j = mq^dq mod q;
j' = j mod p;
k = (i - j') mod p;
L = (k*qinv) mod p;
s = L*q
c = s+j
因爲公鑰e的通常範圍都比較小,openssl的默認值是3-64之間,因此加密運算和signature,通常是不用crt加速的。
這樣:公鑰通常指:(n,e)
私鑰通常指:(n,d) (p,q,dp,dq,qinv)
RSA的key_generation函數:包括1)選擇公鑰指數e,2)內部產生factors,p,q,n,3)計算私鑰指數d
input包括:
1) k,length of modulus n in bits,(k = 1024+256s)
2) e的長度,2<=e<=2k-160 (e的長度爲零,表示內部本身randomize)
3) hash function, random_seed,TRNG function
output包括:
1)公鑰(n, e)
2)私鑰(n, d)以及(p,q,dp,dq,qinv)
公鑰e通常能夠使用固定值也能夠使用隨機值,
固定值,通常包括2,3,17,217+1(65537)
隨機值通常要求,e的最高位和最低位都爲1,而且,2<=e<2k-160 k爲modulus n的bits
RSA的應用能夠分爲加解密primitives和簽名驗籤primitives
1) Encryption/Decryption primitives,
RSAEP((n,e), m)
輸入: (n,e) RSA公鑰
m message,範圍在0 - n-1之間,不然報錯
輸出:c ciphertext,範圍在0 - n-1之間,
步驟:1) 判斷m的範圍是否在0 - n-1之間,不然報錯
2) c = memod n
3) 輸出c
RSADP(K,c)
輸入:K--------(n, d)
(p,q,dp,dq,qinv)
c ciphertext,在0 - n-1之間
輸出:m message,範圍在0 - n-1之間
步驟:crt_exp或mod_exp算法
2)Signature/Verifiaction primitives,
RSASP1(K, m)
輸入: K---------一對密鑰(n,d)
---------CRT的密鑰序列(p,q,dp,dq,qinv)
m message介於0 - n-1之間
輸出: s signature介於0 - n-1之間
步驟: 1)判斷message的範圍在0 - n-1之間,
2)進行crt_exp, mod_exp的計算。
RSAVP1((n,e), s)
輸入: (n,e) RSA公鑰
s signature介於0 - n-1之間
輸出: m message 基於0-n-1之間
步驟:m = semodn
在簽名驗籤中必須保證密鑰對是正確的。這是一個前提條件
在PKCS1的標準中:
encryption scheme能夠分爲RSAES-OAEP和RSAES-PKCS1-v1.5
RSAES-OAEP的步驟:
RSAES-OAEP-ENCRYPT
1) 首先檢查原始字符串的長度是否超過sha運算的最大支持長度;
檢查mLen的長度是否<= k -2hLen -2
2) EME-OAEP encoding,產生EM(Encoding message)
其中seed爲隨機數,lHash,不一樣的hash算法,初始值不一樣:
3) RSA encryption primitive
RSAES-OAEP-DECRYPT(K, C, L)步驟:
1)長度檢查,原始字符串的長度必須小於SHA運算的最大值;
若是密文C不是modulus的比特數,輸出decryption error
若是k < 2hLen + 2,輸出decryption error
2) RSA decryption
3) EME-OAEP decoding
RSAES-PKCS1-V1_5-Encrypt((n,e) M)
Encryption步驟:
1) length check,mLen > k-11
2) EME_PKCS1-v1_5 encoding,
3) RSA encryption
Decryption步驟:
1) length check,若是k<11或者C不是k bit長度
2) RSA decryption
3) EME-PKCS1-v1_5 decoding
Signature和Verification的流程有:RSASSA-PSS和RSASSA-PKCS1-v1_5
PSS:RSASSA-PSS-SIGN(K, M)
步驟: EMSA-PSS encoding
RSA signature
RSASSA-PSS-VERIFY ((n,e), M, S)
步驟: Length checking
RSA verification
EMSA-PSS decoding
RSASSA-PKCS1-v1_5只是encoding和decoding的方式不一樣。
具體的encoding方式,見http://www.cnblogs.com/-9-8/p/7997965.html
RSA-X9.31 1998中的Signature和Verification流程:
verification流程:
關於RSA的一個很好的網頁
https://www.di-mgt.com.au/rsa_alg.html