git: https://github.com/XHTeng/XHCryptorToolspython
RSA加解密中必須考慮到的密鑰長度、明文長度和密文長度問題。明文長度須要小於密鑰長度,而密文長度則等於密鑰長度。所以當加密內容長度大於密鑰長度時,有效的RSA加解密就須要對內容進行分段。git
這是由於,RSA算法自己要求加密內容也就是明文長度m必須0<m<密鑰長度n。若是小於這個長度就須要進行padding,由於若是沒有padding,就沒法肯定解密後內容的真實長度,字符串之類的內容問題還不大,以0做爲結束符,但對二進制數據就很難,由於不肯定後面的0是內容仍是內容結束符。而只要用到padding,那麼就要佔用實際的明文長度,因而實際明文長度須要減去padding字節長度。咱們通常使用的padding標準有NoPPadding、OAEPPadding、PKCS1Padding等,其中PKCS#1建議的padding就佔用了11個字節。github
PKCS#1 - 11算法
OAEP - 42app
k-2hLen-2加密
sha1 (size+1)//8-2*20-2code
這樣,對於1024長度的密鑰。128字節(1024bits)-減去11字節正好是117字節,但對於RSA加密來說,padding也是參與加密的,因此,依然按照1024bits去理解,但實際的明文只有117字節了。blog
import base64 from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_v1_5 from Crypto.Hash import SHA, MD5 def rsa_md5_sign(data, pri_key): h = MD5.new(data.encode()) signer = PKCS1_v1_5.new(RSA.importKey(pri_key)) signature = signer.sign(h) return base64.b64encode(signature).decode() def rsa_md5_verify(data, sign, pub_key): key = RSA.importKey(pub_key) signer = PKCS1_v1_5.new(key) h = MD5.new(data.encode()) return signer.verify(h, base64.b64decode(sign)) def rsa_en(msg, pub): pubkey = RSA.importKey(pub) pubobj = PKCS1_v1_5.new(pubkey) res = [] data = msg.encode() check_len = (pubkey.size() + 1) // 8 - 11 for i in range(0, len(data), check_len): res.append(pubobj.encrypt(data[i:i + check_len])) a = b"".join(res) return base64.b64encode(a).decode() def rsa_de(msg, pri): prikey = RSA.importKey(pri) priobj = PKCS1_v1_5.new(prikey) res = [] data = base64.b64decode(msg) length = len(data) check_len = (prikey.size() + 1) // 8 for i in range(0, length, check_len): res.append(priobj.decrypt(data[i:i+check_len], b'').decode()) return "".join(res)