在開發過程中,發現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也就是我們的公鑰,需要...