博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python非对称加密模块rsa
阅读量:5331 次
发布时间:2019-06-14

本文共 2657 字,大约阅读时间需要 8 分钟。

一、代码

# 导入rsa库import rsa.commonclass RSA(object):    def __init__(self):        self.key= rsa.newkeys(256)        self.pub_key=rsa.PublicKey(self.key[1].n,self.key[1].e)        self.pri_key=rsa.PrivateKey(self.key[1].n,self.key[1].e,self.key[1].d,self.key[1].p,self.key[1].q)    # rsa 加密    def rsa_encrypt_bytes(self,bytes_str):        if not isinstance(bytes_str, bytes):            return None        key_length = rsa.common.byte_size(self.key[1].n)        max_msg_length = key_length - 11        count = len(bytes_str) // max_msg_length        if len(bytes_str) % max_msg_length > 0:            count = count + 1        cry_bytes = b''        # rsa加密要以max_msg_length分组, 每组分别加密(加密的数据长度为key_length, 解密时每key_length长度解密然后相加)        for i in range(count):            start = max_msg_length * i            size = max_msg_length            content = bytes_str[start: start + size]            # rsa 分组 加密            crypto = rsa.encrypt(content, self.pub_key)            cry_bytes = cry_bytes + crypto        return cry_bytes    # rsa 解密, bytes_string是rsa_encrypt_hex, rsa_encrypt_bytes的返回值    def rsa_decrypt(self,bytes_string):        key_length = rsa.common.byte_size(self.key[1].n)        if len(bytes_string) % key_length != 0:            # 如果数据长度不是key_length的整数倍, 则数据是无效的            return None        count = len(bytes_string) // key_length        d_cty_bytes = b''        # 分组解密        for i in range(count):            start = key_length * i            size = key_length            content = bytes_string[start: start + size]            # rsa 分组 解密            d_crypto = rsa.decrypt(content, self.pri_key)            d_cty_bytes = d_cty_bytes + d_crypto        return d_cty_bytes    # rsa 加密, 注意: 这里是传递的是16进制字符串    def rsa_encrypt_hex(self,hex_string):        # bytes.fromhex字符串转十六进制方法        return self.rsa_encrypt_bytes(bytes.fromhex(hex_string))# rsa 库的测试def test_encrypt_decrypt():    # 产生公钥私钥    (pub, pri) = rsa.newkeys(256)    # 构建新的公钥私钥    pubkey = rsa.PublicKey(pri.n, pri.e)    pri_key = rsa.PrivateKey(pri.n, pri.e, pri.d, pri.p, pri.q)    message = b'\x00\x00\x00\x00\x01'    # 加密 message    crypto = rsa.encrypt(message, pubkey)    # 解密    d_crypto = rsa.decrypt(crypto, pri_key)    print(d_crypto)if __name__ == '__main__':    r=RSA()    bts_str = 'hello world 中文'.encode()    crypto_bytes = r.rsa_encrypt_bytes(bts_str)    d_crypto_bytes = r.rsa_decrypt(crypto_bytes)    print(d_crypto_bytes.decode())    hex_str = '001122334455AAff'    crypto_bytes = r.rsa_encrypt_hex(hex_str)    d_crypto_bytes = r.rsa_decrypt(crypto_bytes)    # bytes.hex()十六进制转字符串方法    print(d_crypto_bytes.hex())

 

转载于:https://www.cnblogs.com/angelyan/p/11308910.html

你可能感兴趣的文章
freebsd 实现 tab 命令 补全 命令 提示
查看>>
struts1和struts2的区别
查看>>
函数之匿名函数
查看>>
shell习题第16题:查用户
查看>>
Redis常用命令
查看>>
2018.11.06 bzoj1040: [ZJOI2008]骑士(树形dp)
查看>>
2019.02.15 bzoj5210: 最大连通子块和(链分治+ddp)
查看>>
redis cluster 集群资料
查看>>
微软职位内部推荐-Sr. SE - Office incubation
查看>>
微软职位内部推荐-SOFTWARE ENGINEER II
查看>>
centos系统python2.7更新到3.5
查看>>
C#类与结构体究竟谁快——各种函数调用模式速度评测
查看>>
我到底要选择一种什么样的生活方式,度过这一辈子呢:人生自由与职业发展方向(下)...
查看>>
poj 题目分类
查看>>
windows 安装yaml支持和pytest支持等
查看>>
读书笔记:季羡林关于如何做研究学问的心得
查看>>
面向对象的优点
查看>>
套接口和I/O通信
查看>>
阿里巴巴面试之利用两个int值实现读写锁
查看>>
浅谈性能测试
查看>>