資料加密 RSA 加解密

2021-09-24 06:35:31 字數 2252 閱讀 2230

對於rsa加解密來說,在ios的api中同樣也是提供了這兩種形式的方法。

seckeyencrypt(加密)

seckeydecrypt(解密)

複製**

openssl 同樣也提供了一系列的方法:

rsa_public_encrypt

rsa_private_encrypt

rsa_public_decrypt

rsa_private_decrypt

複製**

相比較而言,openssl 提供的方法更為明確,比如:公鑰解密,私鑰解密,私鑰加密,公鑰解密。雖然 ios 原生給出的只是加密和解密的方法,但是在方法注釋中明確說了,加密用的就是公鑰,解密用的就是私鑰。

其實公鑰加密私鑰解密也是最常用的方式,私鑰加密公鑰解密用的並不多,但是私鑰加密公鑰解密有的時候也是需要的。如果真的需要私鑰加密公鑰解密,openssl 會更方便一點,但其實 ios 也可以做私鑰加密公鑰解密。

這裡大致說一下rsa加解密的過程:

1.生成金鑰

公鑰 (e,n)  

私鑰 (e,d,n)

複製**

2.加解密

密文 = 明文e  % n  

明文 = 密文d % n

我們通過乙個具體的例子來直觀體驗下,經過計算我們現在得到一對具體的金鑰對:

公鑰=(e,n) = (5,323)  

私鑰=(d,n) = (29,323)

b = ae mod n = pow(123, 5) % 323 = 225

a = bd mod n = pow(225, 29) % 323 = 123

如果 a(123) 為明文,那上面的過程就是 公鑰加密私鑰解密;

如果 b(225) 為明文,那上面的過程就是 私鑰加密公鑰解密;

換一下順序可能會更清除一點:

a = bd  mod n = pow(225, 29) % 323 = 123 (私鑰加密)   

b = ae mod n = pow(123, 5) % 323 = 225 (公鑰解密)

這樣一來我們就會發現,其實加解密是同乙個方法。那為什麼會有加密和解密兩個方法呢?我的理解是:

加密就是,傳入資料直接做計算(就像上面的那樣)

解密就是,傳入資料直接做計算(還是上面的那樣),不過會根據填充模式做資料處理,把填充的隨機數剔除掉。

所以從原理上來說私鑰加密公鑰解密是行的通的,只是需要自己做一些資料上的處理。具體實現可以看demo。

rsa演算法本身要求加密內容也就是明文長度 m 必須 0在實際的 rsa 加密中,分段的長度跟填充模式也有一定的關係:

填充方式

最大輸入長度

輸出長度

填充內容

pkcs1

keysize - 11

keysize

隨機數none

keysize - 1

keysize

00 有的文章說 padding 為 none 是的最大輸入長度為 keysize,其實這樣是有風險的。如果明文長度跟金鑰長度一樣的話,明文就有可能大於模數,這樣在加密的時候就會出錯。所以這裡建議 padding 為 none 是明文的分段長度取keysize - 1

分段加密之後就要分段解密了,在實際的rsa加密中,加密出來的密文總是等於金鑰的長度,所以在分段解密的時候密文的分段大小直接取金鑰長度。

rsa在實際應用為了提高安全性防範各種攻擊,在加解密過程中都需要新增一定的隨機因素。為了讓同一明文每次加密產生的密文都不一樣,加密前先填充一部分隨機數,這個不止rsa有,des等對稱加密也都有,稱為padding。加密標準裡有各種型別的padding標準,比如pcks1。

對於pkcs1,這個填充格式會要求每次加密的資料比金鑰長度短至少11個位元組(keysize - 11),填充格式如下:

ps 為隨機填充數,m為明文

00 02 | ps | 00 | m (公鑰加密)

00 01 | ps | 00 | m (私鑰加密)

複製**

以 00 開頭填充同時也保證了待加密資料不會大於金鑰的模數。

還有乙個比較常用的就是none(不填充),如果明文比金鑰短的話會在明文的前面填充零(0)

0000 | m

複製**

demo傳送門

rsa加解密,簽名

一 公鑰加密 假設一下,我找了兩個數字,乙個是1,乙個是2。我喜歡2這個數字,就保留起來,不告訴你們 私鑰 然後我告訴大家,1是我的公鑰。我有乙個檔案,不能讓別人看,我就用1加密了。別人找到了這個檔案,但是他不知道2就是解密的私鑰啊,所以他解不開,只有我可以用 數字2,就是我的私鑰,來解密。這樣我就...

C 非對稱加密,RSA加解密示例

引入dll bouncycastle.crypto 金鑰實體 金鑰實體 public class rsakey 私鑰 public string privatekey rsa加密和解密 using system using system.collections.generic using syste...

RSA加密解密

擷取自我的部落格 因為專案需要,最近做乙個rsa加密解密的介面,使用go進行開發,介面使用jsonrpc,go 對rsa加密解密有很好的支援,不過由於受限於底層微控制器,所以上層應用需要做一些稍微的調整。rsa是一種非對稱加密演算法,什麼是非對稱加密演算法呢,那就是公鑰 私鑰可互相進行加密解密 公鑰...