RSA加密是一種非對稱加密,通常使用公鑰加密,私鑰解密。
公鑰、私鑰的生成
def get_key():
// 生成公鑰、私鑰
pubkey, privkey = rsa.newkeys(1024)
// 公鑰、私鑰進行轉換,以便存儲。
// save_pkcs1 為內置方法,默認值為“PEM”
pub = pubkey.save_pkcs1()
priv = privkey.save_pkcs1('PEM')
// 創建文件,進行存儲
with open('pubkey.pem', mode='wb') as f:
f.write(pub)
with open('privkey.pem', mode='wb') as f:
f.write(priv)
生成文件如下圖:
可以將生成的公鑰、私鑰粘貼復制存儲起來,以便使用:
加密
def rsa_encrypt_password(encrypted_password):
"""
rsa公鑰加密
"""
return rsa.encrypt(encrypted_password.encode('utf-8'),
rsa.PublicKey.load_pkcs1(settings.RSA_PUB_KEY))
解密
def rsa_decrypt_password(encrypted_password):
"""
rsa私鑰解密
"""
return rsa.decrypt(encrypted_password, rsa.PrivateKey.load_pkcs1(settings.RSA_PRIV_KEY))
使用
aa = rsa_encrypt_password('aaaa')
print(aa)
r_aa = rsa_decrypt_password(aa)
print(r_aa.decode('utf-8')) // 使用之前必須先解碼
擴展
在使用中, 通常會先對數據進行bas64加密, 再對加密后的內容使用rsa加密, 最后對rsa解密后的內容進行bas64解密.
base64 + ras 加密
def rsa_encrypt_password(encrypted_password):
"""
rsa加密
"""
return base64.b64encode(rsa.encrypt(encrypted_password.encode('utf-8'),
rsa.PublicKey.load_pkcs1(settings.RSA_PUB_KEY)))
base64 + ras 解密
def rsa_decrypt_password(encrypted_password):
"""
rsa解密
"""
return rsa.decrypt(base64.decodestring(encrypted_password),
rsa.PrivateKey.load_pkcs1(settings.RSA_PRIV_KEY))