RSA數字簽名與加密、解密間的關係

RSA數字簽名與加密、解密間的關係 算法

 

 說起RSA,你們會想到公鑰、私鑰、加密、解密、數字簽名、數字信封。。。
但也許你們和曾經的我同樣,對其中的某些理解會存在誤區,最近看了下關於RSA的RFC 2313文檔,再加上本身的一些測試,終於理清了其中的一些關係,主要包括如下幾點:
一、公鑰和私鑰間的關係;
二、數字簽名和私鑰加密間的關係;
三、數字簽名的驗證具體是怎樣的過程;函數

公鑰與私鑰

通常,咱們能夠用RSA算法生成一對密鑰,公鑰發放給外部客戶,私鑰本身保管;有如下一些應用場景:
【公鑰加密、私鑰解密】或者【私鑰加密、公鑰驗證】
對於第一種場景,彷佛沒有什麼疑問;可是對於第二種場景,公鑰驗證時究竟是如何驗證法我的有我的的說法,我之前一直覺得是和數字證書同樣(固然這個理解有誤,關於數字證書後續也會詳述),只能驗證不能被解密!但通過個人測試證實:私鑰加密是能夠用公鑰解密的;因此說對於RSA算法,用任何一方密鑰加密均可以用另一個密鑰解密;這也從另一個角度說明,其實公鑰和私鑰是相對而言的,發放其中一個密鑰出去,另一個天然也就成爲私鑰了;對於該觀點,不少同窗都已經提到過,但我之前一直認爲這是一個誤解,汗本身一把;
另外,當咱們使用證書的時候,好比pfx、cer、jks、rsa等,從中咱們能夠看出私鑰比公鑰暴露出了更多的信息,你們能夠自行導出xml查看,固然其中不少參數是用來加速的,根本的信息仍是密鑰;
好比公鑰導出格式爲:
<RSAKeyValue>
 <Modulus>...</Modulus>
 <Exponent>...</Exponent>
</RSAKeyValue>
私鑰導出格式爲:
<RSAKeyValue>
 <Modulus>...</Modulus>
 <Exponent>...</Exponent>
 <P>...</p>
 <Q>...</q>
 <DP>...</DP>
 <DQ>...</DQ>
 <InverseQ>...</InverseQ>
 <D>...</D>
</RSAKeyValue>測試

數字簽名與私鑰加密

數字簽名:就是隻有信息的發送者才能產生的,別人沒法僞造的一段數字串,它同時也是對發送者發送的信息的真實性的一個證實。
對一段信息進行簽名時,通常會先用哈希函數計算出被簽名信息唯一的哈希結果值(爲實用目的,下降加密成本,RSA加密不適用於大數據量加密).最後使用私鑰將哈希結果值轉化爲數字簽名.獲得的數字簽名對於被簽名的信息和用以建立數字簽名的私鑰而言都是獨一無二的。
按照上面的說法,數字簽名=私鑰加密(hash(原始數據));可是我用相同的原始數據、相同的hash算法、相同的密鑰分別進行計算獲得的結果倒是不一致的,因此我一直懷疑這個描述有問題?
對此,我search了不少,ch的,en的,但都沒有找到一個讓我信服的解釋,大多都是如上的這種解釋;最後仍是求助於官方描述文檔RFC 2313,下面就看看數字簽名究竟是怎麼回事:
數字簽名包括4個步驟:消息散列,DER數據編碼,RSA私鑰加密和字節串到位串的轉換
這樣也就能夠解釋上面的公式爲何兩邊運算的結果不一致了,由於中間少了不少運算;以後我也下載了bouncycastle的jce實現源碼來看,過程的確如此;
關於DER數據編碼,這個會在後續文章中詳述,他是一個遵循ASN.1規範的編碼規範;大數據

數字簽名的驗證過程

咱們在驗證數字簽名的時候,通常會將簽名數據、原始數據、公鑰一塊兒做爲參數輸入,返回驗證true或false;這樣便形成了一種假象,如上面所說的:公鑰是不能解密的!可是實際驗證過程卻不是這樣的;
一樣的,他徹底是數字簽名的逆向過程,來看看RFC的官方描述,驗證過程包括四個步驟:位串到字節串的轉換,RSA公鑰解密,DER數據解碼,獲得解密後的散列值,最後與原始數據散列值進行比較,若每一位都相同則返回true,不然返回false;編碼

 

數字簽名通常使用公鑰密碼體制,用私鑰簽名,公鑰驗證簽名,如RSA。加密通常使用對稱密碼體制,如DES,AES。原理上RSA等公鑰密碼算法也可進行加密,但相比之下對稱密碼的加密速度快,故實際應用中,對稱密碼用於加密。加密

相關文章
相關標籤/搜索