Python RSA 加密

引言

RSA是一种非对称加密算法,一般我们都使用公钥进行加密,私钥进行解密,当然,公钥和私钥都可以进行加解密,并且需要完整的公私钥,才能实现加解密流程,只有一个是无法进行解密的。

代码

pubkey和privkey修改成你自己生成的就好了。

import base64
from Crypto.Cipher import PKCS1_v1_5 as PKCS1_cipher
from Crypto.PublicKey import RSA
import rsa
from Crypto import Random

pubkey = """-----BEGIN RSA PUBLIC KEY----- 
MIICCgKCAgEAvbZ+f+7FOt/yj6qOXnG+28FdFKbvB3LGbTJqMq6S73ZAyt/wcHGO 
ZruhLqGK4/Ye4IIFg37KssQZuzDMS9mOpGTsyS+5uIhcTkxbjzHQt5ItDOzqFK5W 
St2A4rfQI42ONk+nnENx35wk3hD8fTez6JvWXcL3lKWW/c04PjBOnJXKT9Geuawp 
qsBiT+Knb6UHcCQIjDaPzNgDkfRhE0vRkWQ0dL0J6mBVlVN1+2UBhPxQZylA89dX 
Qd/A8CsLJnZJAhHWEvbsIGK5yjT+a5M8Br+9bhRQL80cDrKLpXejzzyTg9iCYrSb 
+cgcpTZqMUSag1vzZ3kjC89bn90hxQOeN95TqogrH2KsdIr+7+6xsgf7YsdOREW/ 
yu1rUjkAsoUvBLT76zz4D80SIfMbCnx/aIJw42UWLCDLJhg5iQaJMmKl4/jsrwLy 
GdEpht5rYlhnWWl5wN2UBSL0Qqe7EVRNEo7WI9MhwNtuYDQsttbWf5LaQn/jgUON 
OFLnposf4C245B3szS0r/BQUrEZaz9UnCdNueP/fdwZHcqUaBGutrshh+IMtXwxP 
GpdF3RyBhvtdWNzCIdbQp4KuGNdLdQ3ogcUbeyVkrkWlfo7UNBxfG66NfxOM6/eJ 
/91QsN7sweWoBUks/Kt/ipi1/a176qiE9hSWErw37E+8RZ54mpT3ZyECAwEAAQ== 
-----END RSA PUBLIC KEY----- 
"""
privkey = """-----BEGIN RSA PRIVATE KEY----- 
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 
N/FTwA/U6oO1PEI= 
-----END RSA PRIVATE KEY----- 
"""


# 非对称RSA加密
def generate():
    pubkey, privkey = rsa.newkeys(4096)
    print(pubkey.save_pkcs1())
    print(privkey.save_pkcs1())


def encrypt(data, public_key):
    if type(data) is str:
        data = data.encode('utf-8')
    pub_key = RSA.importKey(public_key)
    cipher = PKCS1_cipher.PKCS115_Cipher(pub_key, Random.get_random_bytes)
    keyLen = ((int(len(public_key) / 8)) - 11)
    if len(data) <= keyLen:
        rsa_text = base64.b64encode(cipher.encrypt(data))
        return rsa_text
    else:
        start = 0
        encrypt_data = b''
        while start < len(data.decode('utf8')):
            end = start + keyLen
            data1 = data.decode('utf8')[start:end]
            encrypt_data += cipher.encrypt(data1.encode('utf8'))
            start = start + keyLen
        return base64.b64encode(encrypt_data)


# 非对称RSA解密
def decrypt(data, private_key):
    if type(data) is str:
        data = data.encode('utf-8')
    pri_key = RSA.importKey(private_key)
    cipher = PKCS1_cipher.PKCS115_Cipher(pri_key, Random.get_random_bytes)
    binSec = base64.b64decode(data)
    keyLen = pri_key.size_in_bytes()
    if len(data) <= keyLen:
        rsa_text = cipher.decrypt(binSec, 0)
        return rsa_text
    else:
        start = 0
        decrypt_data = b''
        while start < len(binSec):
            end = start + keyLen
            data1 = binSec[start:end]
            decrypt_data += cipher.decrypt(data1, 0)
            start = start + keyLen
        return decrypt_data.decode('utf-8')


if __name__ == '__main__':
    for i in range(0, 1000):
        t = ('Security ' * i)
        e = encrypt(t, privkey)
        d = decrypt(e, privkey)
        print(d)

如果想生成自己的密钥对,执行方法generate就好了,把输出的文本替换一下就可以使用了。

结论

RSA 加解密速度慢,但是安全性高,需要按需考虑。

评论 0

还没有评论,来说点什么吧。

提交后需要审核才会公开。