Python rsa公私钥生成 rsa公钥加密(分段加密)私钥加签实战

一般现在的SAAS服务提供现在的sdk或api对接服务都涉及到一个身份验证和数据加密的问题。一般现在普遍的做法就是配置使用非对称加密的方式来解决这个问题,你持有SAAS公司的公钥,SAAS公司持有你的公钥,你们就可以进行加密和签名的验证了。

先来看下两种在linux或者mac下面生成key pair的方法:

使用openssl 生成一把2048bit长度的钥匙对,首先我们生成一把.pem格式的私钥:

openssl genrsa -out private_key.pem 2048

然后通过这把私钥生成.pem格式的公钥:

openssl rsa -in private_key.pem -pubout -out public_key.pem

生成出来的格式是pkcs#1.5格式的,可以直接被下面类似这种语句直接读取 rsa.PublicKey.load_pkcs1_openssl_pem()对于python的rsa库来说比较方便。

同样我们也可以使用ssh-keygen来生成:

ssh-keygen -t rsa -b 2048 -C "[email protected]"

最后-C 参数是给这把钥匙的公钥添加一个comment。-t指定算法,-b指定长度。这种生成方法会让你输入一个密码,这个密码会对生成的private_key进行加密。

会长这个样子开头:

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-CBC,84E01D31C0A59D1F

如果你想使用这把钥匙进行加解密签名转成上面格式的钥匙的话。需要使用:

openssl rsa -in <Encrypted key filename>  -out < desired output file name>

可以去掉密码,得到私钥。然后再使用这把私钥生成一个公钥,向上面一样操作就可以了。直接使用生成pair的公钥应该是不行的,格式不一样并不是pkcs#1.5。

下面开始介绍加解密和加签验签:

其实在此之前,有个概念非常容易被混淆。就是同样使用非对称加密原理的数据加密和数据加签。

加密和加签完全不是同样一件事情。

加密使用的是公钥对数据进行加密,而且当你使用一把1024bit的rsa公钥的时候,你一次只能加密最多117byte的数据,如果数据量超过这个数,可能会涉及到对数据进行分段加密的问题。而且现在rsa 1024bit长度的钥匙已经被证明了不够安全,应该尽量使用2048bit长度的钥匙。2048bit长度的钥匙一次可以加密245byte长度的数据。这个计算方法是 2048bit/8 = 256byte - 11byte = 245byte长数据。就是钥匙长度减去11byte得到的自己最大能一次加密多长的数据。如果超过了就会报错,所以很多平台要求对数据用公钥进行加密,就可能涉及到分段加密的问题。

而加签是使用自己的私钥对需要加签的字符串进行签名。而对方需要拿着你给的公钥来验证这个数据是不是由你发出的,需要使用公钥对数据进行验签。如果成功验签才能说明你是你。

下面展示使用python对数据进行分段加密的过程,这里我们假设自己使用一把1024bit的公钥进行加密:

def rsa_encrypt(biz_content, public_key):
    _p = rsa.PublicKey.load_pkcs1_openssl_pem(public_key)
    biz_content = biz_content.encode(‘utf-8‘)
    # 1024bit key
    default_encrypt_length = 117
    len_content = len(biz_content)
    if len_content < default_encrypt_length:
        return base64.b64encode(rsa.encrypt(biz_content, _p))
    offset = 0
    params_lst = []
    while len_content - offset > 0:
        if len_content - offset > default_encrypt_length:
            params_lst.append(rsa.encrypt(biz_content[offset:offset+default_encrypt_length], _p))
        else:
            params_lst.append(rsa.encrypt(biz_content[offset:], _p))
        offset += default_encrypt_length
    target = ‘‘.join(params_lst)
    return base64.b64encode(target)

最后一般需要使用base64算法将二进制流转成字符串方便进行放入需要的参数里面进行传递。解密同理可以使用rsa库的此方法

rsa.decrypt(data, private_key)

进行分段解密之后把数据拼起来。

下面继续展示对数据进行加签的过程:

def rsa_signature(data, private_key):
    _pri = rsa.PrivateKey._load_pkcs1_pem(private_key)
    signature = rsa.sign(data, _pri, ‘SHA-1‘)
    return base64.b64encode(signature)

验签使用:

def rsa_verify(signature, message, public_key):
    _pub = rsa.PublicKey.load_pkcs1_openssl_pem(public_key)
    signature = base64.b64decode(signature)
    return rsa.verify(message, signature, _pub)

以上

Reference:

https://stuvel.eu/python-rsa-doc/usage.html#signing-and-verification Python-RSA 3.4.2 documentation

https://support.citrix.com/article/CTX122930#Decrypting%20the%20Private%20Key%20from%20the%20Command%20Line%20Interface How to Decrypt an RSA Private Key Using OpenSSL on NetScaler

https://segmentfault.com/a/1190000009396950?_ea=2278883 Python的RSA加密和PBE加密

https://stackoverflow.com/questions/1011572/convert-pem-key-to-ssh-rsa-format Convert pem key to ssh-rsa format

时间: 2024-10-19 04:51:39

Python rsa公私钥生成 rsa公钥加密(分段加密)私钥加签实战的相关文章

Python中rsa模块【sign 加签验签】的使用

安装 pip install rsa 使用一 说明:简单入门使用  使用公钥加密  ----------->> 使用私钥进行解密 1 # -*- coding:utf-8 -*- 2 import rsa 3 4 5 def rsa_encrypt(d_str): 6 """ 7 生成私钥 和公钥 并接受字符串进行加密 8 :param d_str: 字符串 9 :return: 返回加密结果及私钥 10 """ 11 # 生成公钥和

Java中使用OpenSSL生成的RSA公私钥进行数据加解密

RSA是什么:RSA公钥加密算法是1977年由Ron Rivest.Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的.RSA取名来自开发他们三者的名字.RSA是目前最有影响力的公钥加密算法,它能够 抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准.目前该加密方式广泛用于网上银行.数字签名等场合.RSA算法基于一个十分简单的 数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥. OpenSSL是什

Java中使用OpenSSL生成的RSA公私钥

RSA是什么:RSA公钥加密算法是1977年由Ron Rivest.Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的.RSA取名来自开发他们三者的名字.RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准.目前该加密方式广泛用于网上银行.数字签名等场合.RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥. OpenSSL是什么:众

java生成RSA公私钥字符串,简单易懂

java生成RSA公私钥字符串,简单易懂 解决方法: 1.下载bcprov-jdk16-140.jar包,参考:http://www.yayihouse.com/yayishuwu/chapter/1537 2.java代码 KeyPairGenerator keyPairGenerator = KeyPairGenerator .getInstance("RSA"); keyPairGenerator.initialize(2048); KeyPair keyPair = keyPa

如何使用openssl生成RSA公钥和私钥对

公私玥可使用OPENSSL工具生成. 在Windows环境下,可自行下载OPENSSL工具( http://www.openssl.org/related/binaries.html). 在Linux环境下,可安装OPENSSL工具包(以ubuntu为例,执行sudo apt-get install openssl). 在Windows环境下,打开OPENSSL安装目录bin文件下面的openssl.exe.在Linux环境下,直接在终端中运行openssl. 1)生成RSA私钥: genrsa

windows 下 openssl 生成RSA私钥公钥以及PKCS8

生成RSA私钥 打开bin文件夹下面的openssl.exe,输入genrsa -out rsa_private_key.pem 1024 把RSA私钥转换成PKCS8格式 输入命令pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt 生成公钥 输入命令rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem 说明: rsa_private_key

使用OpenSSL为支付宝生成RSA私钥

通过openssl工具生成RSA的公钥和私钥(opnssl工具可在互联网中下载到,也可以点此下载无线接口包,里面包含此工具)打开openssl文件夹下的bin文件夹,执行openssl.exe文件: 1)生成RSA私钥 输入“生成命令.txt”文件中:“genrsa -out rsa_private_key.pem 1024”,并回车得到生成成功的结果,如下图: 此时,我们可以在bin文件夹中看到一个文件名为rsa_private_key.pem的文件,用记事本方式打开它,可以看到-----BE

使用openssl 生成RSA公钥和私钥

sudo apt-get install openssl 安装完成就可以使用openssl了. 首先需要进入openssl的交互界面,在命令行了输入openssl即可: 1)生成RSA私钥: genrsa -out rsa_private_key.pem 1024 该命令会生成1024位的私钥,生成成功的界面如下: 此时我们就可以在当前路径下看到rsa_private_key.pem文件了. 2)把RSA私钥转换成PKCS8格式输入命令pkcs8 -topk8 -inform PEM -in r

openssl生成RSA公钥和私钥对

在ubuntu上要使用openssl的话需要先进行安装,命令如下: sudo apt-get install openssl 安装完成就可以使用openssl了. 首先需要进入openssl的交互界面,在命令行了输入openssl即可: 1)生成RSA私钥: genrsa -out rsa_private_key.pem 1024 该命令会生成1024位的私钥,生成成功的界面如下: 此时我们就可以在当前路径下看到rsa_private_key.pem文件了. 2)把RSA私钥转换成PKCS8格式