RSA演算法padding方式

2021-08-19 13:14:13 字數 2168 閱讀 9888

在開發過程中,發現ios端經過rsa加密的密文傳到服務端之後, 服務端無法解析,本來想通過比較同一段明文的加密結果,來判斷服務端和ios端加密方式的區別,結果發現加密結果一直不一樣。然後服務端嘗試多次加密同一段明文,得到的結果也不一樣。 

然後就很震驚。學過密碼學的我也知道rsa的原理, 類似:

1)、密文 = 明文^e mod n

2)、明文 = 密文^d mod n

3)、那麼 publickkey = (e,n),privatekey = (d,n)

經過研究,發現目前的rsa演算法其實都會在加密的過程中加入乙個隨機值,所以每次加密的結果都會不一樣。那麼既然每次加密的結果都不一樣, 那怎麼解密呢, 具體方案如下:

1)、 密文 =( random+明文) ^e mod n  //publickey  加密

2)、(random+明文) = 密文^d mod n   // 伺服器端利用privatekey 解密

3)、 明文 = (random+明文) - random //伺服器端解碼出random

解決了這個疑問之後,有回到第乙個問題,ios加密的結果為何會解不出來呢。 答案是rsa演算法新增隨機數的方式也有很多種,因為ios設定的padding方式和服務端的padding方式(即新增隨機數的方式)不一樣,導致服務端解析不出來密文。

rsa加密常用的填充方式有下面3種:

1.rsa_pkcs1_padding 填充模式,最常用的模式

要求:輸入:必須 比 rsa 鑰模長(modulus) 短至少11個位元組, 也就是 rsa_size(rsa) – 11

如果輸入的明文過長,必須切割, 然後填充

輸出:和modulus一樣長

根據這個要求,對於512bit的金鑰, block length = 512/8 – 11 = 53 位元組

2.rsa_pkcs1_oaep_padding

輸入:rsa_size(rsa) – 41

輸出:和modulus一樣長

3. rsa_no_padding  不填充

輸入:可以和rsa鑰模長一樣長,如果輸入的明文過長,必須切割, 然後填充

輸出:和modulus一樣長

用python實現rsa_pkcs1_padding填充的rsa**如下:

import cgi, base64

from crypto.publickey import rsa

from crypto.cipher import pkcs1_v1_5

from crypto.hash import sha

from crypto import random

# 私鑰檔案

prikey = '''-----begin rsa private key-----

***x

-----end rsa private key-----'''

# 公鑰檔案

pubkey = '''-----begin public key-----

***x

-----end public key-----'''

# 偽隨機數生成器

random_generator = random.new().read

'''*rsa加密

* data待加密資料

* 最後的加密結果,需要用base64編碼

* return 加密結果

'''def rsa_encrypt(data):

key = rsa.importkey(pubkey)

cipher = pkcs1_v1_5.new(key)

cipher_text = base64.b64encode(cipher.encrypt(data))

return cipher_text

'''*rsa解密

* encrypt_text待解密資料

* 解密用私鑰

* return 解密的結果

'''def rsa_decode(encrypt_text):

key = rsa.importkey(prikey)

cipher = pkcs1_v1_5.new(key)

text = cipher.decrypt(base64.b64decode(encrypt_text), random_generator)

return text

div css的padding縮寫方式

在css中使用padding可以將padding top,padding bottom,padding left,padding right縮寫為乙個標記。padding標記可以帶乙個 二個 三個 四個引數,各有不同的含義。padding 20px 上 下 左 右各20px。padding 20px...

div css的padding縮寫方式

在css中使用padding可以將padding top,padding bottom,padding left,padding right縮寫為乙個標記。padding標記可以帶乙個 二個 三個 四個引數,各有不同的含義。padding 20px 上 下 左 右各20px。padding 20px...

c 實現rsa演算法 RSA演算法實現過程

rsa演算法是實現非對稱加密的一種演算法,其用到很多有關數論的內容,在此我們不多討論。而將目光聚焦於演算法的實現過程。rsa過程 第二步 計算n a b 61 53 3233 第三步 計算 a 1 b 1 60 52 3120 第四步 選擇與3120互質的乙個數e 17,這個e也就是我們的公鑰,需要...