常見的rsa加解密使用方式是:公鑰加密,私鑰解密。私鑰簽名,公鑰驗籤。
但我在專案上卻遇到了乙個用python解決公鑰解密的問題。查了好多資料最後完成了這需求,記錄一下。
import base64
from rsa import core, publickey, transform
def public_key_decrypt(rsa_public_key_der_b64, qr_code_cipher_b64):
qr_code_cipher = base64.b64decode(qr_code_cipher_b64)
public_key = base64.b64decode(rsa_public_key_der_b64)
try:
rsa_public_key = publickey.load_pkcs1_openssl_der(public_key)
cipher_text_bytes = transform.bytes2int(qr_code_cipher)
decrypted_text = core.decrypt_int(cipher_text_bytes, rsa_public_key.e, rsa_public_key.n)
final_text = transform.int2bytes(decrypted_text)
final_qr_code = final_text[final_text.index(0) + 1:]
return final_qr_code.decode()
except exception as ex:
_logger.exception(ex)
return none
(1)安裝rsa包
pip install rsa
(2)為什麼不用crpyto包?
我查了好多資料,也看了crypto**,實在是不知道怎麼用cytpto包進行公鑰解密,只能進行公鑰加密操作。所以最後改為使用rsa包。
rsa包實現了rsa演算法的核心,如果對rsa演算法有一些了解的,使用起來和用openssl感覺差不多。
rsa的publickey類中提供了兩個無需例項化的方法來載入公鑰,load_pkcs1_openssl_pem()和load_pkcs1_openssl_der()
具體使用哪個方法主要是看你「手中的rsa公鑰」是哪種格式的:
load_pkcs1_openssl_pem是用來載入:符合pkcs#1.5 pem-encoded 格式的公鑰檔案,具體可以搜一下pem格式。
load_pkcs1_openssl_der是用來載入:公鑰原始二進位制位元組流
由於rsa是基於「大整數運算」的,因此,需要將待處理的密文位元組陣列轉為大整數,將處理好的大整數再轉為位元組陣列。
rsa包中transform檔案中提供了這兩個方法:
transform.bytes2int()
transform.int2bytes()
由於rsa演算法是基於「大整數運算」,因此需要將待加密的明文資料轉為符合要求的大整數,其實就是在待加密資料前以某種標準的格式填充,使得填充後的新資料和rsa的金鑰模長相等。
我使用了這種方式去掉前部的填充內容:final_text[final_text.index(0) + 1:]
對rsa演算法原理感興趣的可以參看以下這位大佬的部落格日誌:
關於rsa的填充問題,可以參考這位大佬的部落格日誌:
python RSA 加密解密
公匙加密 引入from crypto.cipher import pkcs1 v1 5 as cipher pkcs1 v1 5 from crypto.publickey import rsa import base64 from crypto import random def loadpubl...
公鑰 私鑰 加密 解密 簽名 驗證
一 公鑰加密 假設一下,我找了兩個數字,乙個是1,乙個是2。我喜歡2這個數字,就保留起來,不告訴你們 私鑰 然後我告訴大家,1是我的公鑰。我有乙個檔案,不能讓別人看,我就用1加密了。別人找到了這個檔案,但是他不知道2就是解密的私鑰啊,所以他解不開,只有我可以用 數字2,就是我的私鑰,來解密。這樣我就...
php 公鑰加密 私鑰解密 私鑰加簽 公鑰驗籤
其中使用php函式可參考php openssl 公鑰加密 param data 加密資料 return mixed author xin.he date 2020 06 03 public function encryption data 公鑰加密 param data 加密資料 return mi...