RSA加密的实现(Python2.7(分段加密)+python3)

栏目: Python · 发布时间: 6年前

内容简介:RSA加密的实现(Python2.7(分段加密)+python3)

公钥密码学与RSA加密

什么是RSA加密呢?

RSA是一种 非对称加密算法 ,那什么是非对称加密呢?非对称加密又叫做公开密钥加密,就是说我有一对密钥,分为公钥和私钥。私钥我悄悄的留着,不给别人看。然后把公钥给别人(无论是谁)。当别人用公钥加密了数据之后,这串加密后的数据只有我(拥有私钥的人)用私钥才能解开,其余谁都不能解开。这就是非对称加密。

加密时遇到的问题:加密的 plaintext 最大长度是 证书key位数/8 - 11 , 例如1024 bit的证书,被加密的串最长 1024/8 - 11=117

那么加密长的文本就需要分段进行加密

python2的实现

def rsa_long_encrypt(pub_key_str, msg)为加密方法,要求输入公钥和明文

def rsa_long_decrypt(priv_key_str, msg)为解密方法,要求输入私钥和密文

#coding:utf-8
import sys  

reload(sys)  
sys.setdefaultencoding('utf8')

from Crypto.PublicKey import RSA as rsa
from Crypto.Cipher import PKCS1_v1_5 #RSA加密协议

#公密钥对在线生成(1024bit)
pub_key_str = """-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEAuw4T755fepEyXTM66pzf6nv8NtnukQTMGnhmBFIFHp/P2vEpxjXU
BBDUpzKkVFR3wuK9O1FNmRDAGNGYC0N/9cZNdhykA1NixJfKQzncN31VJTmNqJNZ
W0x7H9ZGoh2aE0zCCZpRlC1Rf5rL0SVlBoQkn/n9LnYFwyLLIK5/d/y/NZVL6Z6L
cyvga0zRajamLIjY0Dy/8YIwVV6kaSsHeRv2cOB03eam6gbhLGIz/l8wuJhIn1rO
yJLQ36IOJymbbNmcC7+2hEQJP40qLvH7hZ1LaAkgQUHjfi8RvH2T1Jmce7XGPxCo
Ed0yfeFz+pL1KeSWNey6cL3N5hJZE8EntQIDAQAB
-----END RSA PUBLIC KEY-----"""

priv_key_str = """-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAuw4T755fepEyXTM66pzf6nv8NtnukQTMGnhmBFIFHp/P2vEp
xjXUBBDUpzKkVFR3wuK9O1FNmRDAGNGYC0N/9cZNdhykA1NixJfKQzncN31VJTmN
qJNZW0x7H9ZGoh2aE0zCCZpRlC1Rf5rL0SVlBoQkn/n9LnYFwyLLIK5/d/y/NZVL
6Z6Lcyvga0zRajamLIjY0Dy/8YIwVV6kaSsHeRv2cOB03eam6gbhLGIz/l8wuJhI
n1rOyJLQ36IOJymbbNmcC7+2hEQJP40qLvH7hZ1LaAkgQUHjfi8RvH2T1Jmce7XG
PxCoEd0yfeFz+pL1KeSWNey6cL3N5hJZE8EntQIDAQABAoIBAGim1ayIFK8EMQNH
uDyui/Aqcc9WWky0PGTK23irUsXxb1708gQ89WNY70Cj6qBrqZ1VMb3QHPP4FSFN
kh0rJJoi2g+ssm5R5r5KlhTKeFRrQInVC1Y3KhUUUwZa4aWtnhgSJ7Urq1yVhjU4
K7PVkhH1OHBwcp/d1Bd6jd65AgPkY63P+WpcARJkClmQ1RhgoRwThyJdpKrV4/gO
ha0AUGlJNRNvRwiZxP0zaI5C8RdrG96SnVpeYOcD0z/M1HVlkoYMXsXLKttwLfpK
88Igtm6ZJwRpfuMF5VA+9hHaYGCBdGz0B/rMp2fc+EtrOavYQGrWIWi2RL1Qk6Rt
BUyeTgECgYEA9anj4n/cak1MT+hbNFsL31mJXryl1eVNjEZj/iPMztpdS15CmFgj
Kjr9UuintjSiK7Is43nZUWWyP1XQjRhVi2uP7PRIv92QNl/YteWD6tYCInJHKe2J
QqYyZrElezsdayXb5DK6bi1UIYYji90g79N7x6pOR0UnQNQUXTv+Y8ECgYEAwuzl
6Ez4BSXIIL9NK41jfNMa73Utfl5oO1f6mHM2KbILqaFE76PSgEeXDbOKdcjCbbqC
KCGjwyPd+Clehg4vkYXTq1y2SQGHwfz7DilPSOxhPY9ND7lGbeNzDUK4x8xe52hd
MWKdgqeqCK83e5D0ihzRiMah8dbxmlfLAOZ3sPUCgYEA0dT9Czg/YqUHq7FCReQG
rg3iYgMsexjTNh/hxO97PqwRyBCJPWr7DlU4j5qdteobIsubv+kSEI6Ww7Ze3kWM
u/tyAeleQlPTnD4d8rBKD0ogpJ+L3WpBNaaToldpNmr149GAktgpmXYqSEA1GIAW
ZAL11UPIfOO6dYswobpevYECgYEApSosSODnCx2PbMgL8IpWMU+DNEF6sef2s8oB
aam9zCi0HyCqE9AhLlb61D48ZT8eF/IAFVcjttauX3dWQ4rDna/iwgHF5yhnyuS8
KayxJJ4+avYAmwEnfzdJpoPRpGI0TCovRQhFZI8C0Wb+QTJ7Mofmt9lvIUc64sff
GD0wT/0CgYASMf708dmc5Bpzcis++EgMJVb0q+ORmWzSai1NB4bf3LsNS6suWNNU
zj/JGtMaGvQo5vzGU4exNkhpQo8yUU5YbHlA8RCj7SYkmP78kCewEqxlx7dbcuj2
LAPWpiDca8StTfEphoKEVfCPHaUk0MlBHR4lCrnAkEtz23vhZKWhFw==
-----END RSA PRIVATE KEY-----"""

#单次加密串的长度最大为 (key_size/8)-11

'''
加密的 plaintext 最大长度是 证书key位数/8 - 11, 例如1024 bit的证书,被加密的串最长 1024/8 - 11=117, 
解决办法是 分块 加密,然后分块解密就行了,
因为 证书key固定的情况下,加密出来的串长度是固定的。
'''
def rsa_long_encrypt(pub_key_str, msg):
    msg = msg.encode('utf-8')
    length = len(msg)
    default_length = 117
    #公钥加密
    pubobj = PKCS1_v1_5.new(rsa.importKey(pub_key_str))
    #长度不用分段
    if length < default_length:
        return "".join(pubobj.encrypt(msg))
    #需要分段
    offset = 0
    res = []
    while length - offset > 0:
        if length - offset > default_length:
            res.append(pubobj.encrypt(msg[offset:offset+default_length]))  
        else:
            res.append(pubobj.encrypt(msg[offset:])) 
        offset += default_length
    return "".join(res)


def rsa_long_decrypt(priv_key_str, msg):
    #msg = msg.encode('utf-8')
    length = len(msg)
    default_length = 256
    #私钥解密
    priobj = PKCS1_v1_5.new(rsa.importKey(priv_key_str))
    #长度不用分段
    if length < default_length:
        return "".join(priobj.decrypt(msg,'xyz'))
    #需要分段
    offset = 0
    res = []
    while length - offset > 0:
        if length - offset > default_length:
            res.append(priobj.decrypt(msg[offset:offset+default_length],'xyz'))  
        else:
            res.append(priobj.decrypt(msg[offset:],'xyz'))   
        offset += default_length
    return "".join(res)


#明文
msg = "H134"*1000

e = rsa_long_encrypt(pub_key_str, msg)
d = rsa_long_decrypt(priv_key_str, e)
print "加密后是:%s ;   解密后是:%s  "%(e ,d)

PyCrypto 可能是 Python 中密码学方面最有名的第三方软件包。可惜的是,它的开发工作于2012年就已停止。幸运的是,有一个该项目的分支取代了 PyCrypto ,那就是 PyCrytodome。

windows下的安装命令

pip install pycryptodomex

python3的RSA加密实现

def create_rsa_key(self,password)为生成公钥和私钥的方法,其中私钥和password相关联,也就是将本地的私钥存储起来,可以用密码+私钥的方式解码,而不需要记忆复杂私钥。

'''
RSA算法
'''

from Cryptodome.PublicKey import RSA
from Cryptodome.Cipher import PKCS1_OAEP, PKCS1_v1_5

class MyRSA():


    def create_rsa_key(self,password):
        """
        创建RSA密钥
        步骤说明:
        1、从 Crypto.PublicKey 包中导入 RSA,创建一个密码
        2、生成 1024/2048 位的 RSA 密钥
        3、调用 RSA 密钥实例的 exportKey 方法,传入密码、使用的 PKCS 标准以及加密方案这三个参数。
        4、将私钥写入磁盘的文件。
        5、使用方法链调用 publickey 和 exportKey 方法生成公钥,写入磁盘上的文件。
        """

        key = RSA.generate(1024)
        encrypted_key = key.exportKey(passphrase=password.encode("utf-8"), pkcs=8,
                                  protection="scryptAndAES128-CBC")
        with open("my_private_rsa_key.bin", "wb") as f:
            f.write(encrypted_key)
        with open("my_rsa_public.pem", "wb") as f:
            f.write(key.publickey().exportKey())


    def encrypt(self,plaintext):
        # 加载公钥
        recipient_key = RSA.import_key(
                open("my_rsa_public.pem").read()
        )
        cipher_rsa = PKCS1_v1_5.new(recipient_key)

        en_data = cipher_rsa.encrypt(plaintext.encode("utf-8"))

        return en_data
        #print(len(en_data), en_data)
    def decrypt(self,en_data,password):
        # 读取密钥
        private_key = RSA.import_key(
            open("my_private_rsa_key.bin").read(),
            passphrase=password
        )
        cipher_rsa = PKCS1_v1_5.new(private_key)
        data = cipher_rsa.decrypt(en_data, None)

        return data
        #print(data)

mrsa=MyRSA()
mrsa.create_rsa_key('123456')
e=mrsa.encrypt('hello')
d=mrsa.decrypt(e,'123456')
print(e)
print(d)

其中create_rsa_key为创建公钥密钥,encrypt为加密,decrypt为解密


以上所述就是小编给大家介绍的《RSA加密的实现(Python2.7(分段加密)+python3)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

你不是个玩意儿

你不是个玩意儿

杰伦·拉尼尔 / 葛仲君 / 中信出版社 / 2011-8 / 35.00元

“你不是个玩意儿。” 这句话当然不是骂人,这是一个宣言。人当然不是玩意儿,不是机器,而是人。 在网络化程度越来越高的今天,我们每个人似乎都有足够的理由,无限欣喜地拥抱互联网。然而,你有没有想过互联网那些不完美的设计却是某种潜在的威胁…… 为什么如此多的暴民在社交网站上争吵不休,很多骂人的脏话我们在现实的人际交往中可能从来不会使用,但在匿名网络环境中却漫天飞舞? 互联网的本质......一起来看看 《你不是个玩意儿》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换