资讯专栏INFORMATION COLUMN

python (3.x) 实现RSA 加签 验签 以及key的序列化

kuangcaibao / 1190人阅读

摘要:首先安装确认安装的是版本版本的是不一样的生成公私钥对生成私钥同时包含公钥此处为序列化公钥私钥并写入文件存储序列化私钥无密码也可以加入密码保护私钥将私钥写入文件将公钥写入文件也可以采用其他序列化方法比如对公钥生成格式的序列化字符串输出类似于

首先 安装cryptography

sudo pip3 install cryptography

确认安装的是2.1.x版本 (1.x版本的api是不一样的).

生成公私钥对:

from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.hazmat.primitives import serialization, hashes
from base64 import b64encode, b64decode

# 生成私钥 (同时包含公钥), 此处为RSA 2048
private_key = rsa.generate_private_key(
    public_exponent=65537,
    key_size=2048,
    backend=default_backend()
)

序列化公钥 私钥, 并写入文件存储.

# 序列化私钥
pem = private_key.private_bytes(
   encoding=serialization.Encoding.PEM,
   format=serialization.PrivateFormat.PKCS8,
   # 无密码
   encryption_algorithm=serialization.NoEncryption()
   # 也可以加入密码保护私钥:
   # encryption_algorithm=serialization.BestAvailableEncryption(b"mypassword")
)

# 将私钥写入文件
with open("private.pem", "wb") as f:
    f.write(pem)

public_key = private_key.public_key()

pub_pem = public_key.public_bytes(
   encoding=serialization.Encoding.PEM,
   format=serialization.PublicFormat.SubjectPublicKeyInfo
)

# 将公钥写入文件
with open("public.pem", "wb") as f:
    f.write(pub_pem)

也可以采用其他序列化方法, 比如对公钥, 生成OpenSSH格式的序列化字符串:

public_key.public_bytes(
    encoding=serialization.Encoding.OpenSSH,
    format=serialization.PublicFormat.OpenSSH
)

输出类似于:

b"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCbySUldhJYrDmf8+yyQXMB5HsIMwownZq3ft7k1nei/kVC/720np/1xyk7U8yNc2jL9Yb/pctD/0WAnI7vrkIVQniYfRwiEohDlZHGIvlUpXS4dtKvbOFRDQod9nn4Q9VwfrMq4yuBbKSaCqwcu8rkApWyj36
XhTV5/mT7Zs4H4m3OAyCVD2kkAoZYYbxA+pBNDLDcU4VlUuiC1FaWLTdU5dV6A0IGRGlOuFw4qaJZaFLu6mANaRdX836LA5DOmKpcwerb0ae3eGHZNSLQO6JkIT7oe/I+417jz5JmUI3V35BjKUrd7VjBgbE0jvpkxrzMFCaoOWP0BzTDn+C64fSR"

此后可以从文件读出公钥(私钥)

# 从文件读出并创建公钥
with open("public.pem", "rb") as pub_key_file:
    # 读入私钥为 load_pem_private_key
    public_key = serialization.load_pem_public_key(
        pub_key_file.read(),
        # 读入私钥此处还有: password=b"xxxx",
        backend=default_backend()
    )

对于openSSH格式, 应采用load_ssh_public_key

给指定消息加签, 获得签名

# 需要加签的消息
message = b"A message I want to sign"
# 对消息加签, 获得签名, 为bytes
signature = private_key.sign(
    message,
    padding.PSS(
        mgf=padding.MGF1(hashes.SHA1()),
        salt_length=padding.PSS.MAX_LENGTH
    ),
    hashes.SHA1()
)

# 需要传输, 展示, 存储时, 可以将签名转为base64格式的bytes,
# 也可以继续转为str: str(enc_sig, "utf-8")
enc_sig = b64encode(signature)

验证签名:

# 通过signature, 公钥 给 消息message 验签, 验证是由私钥持有者发出的这条消息.
# 如果验签通过, 则正常通过, 否则, 抛出 cryptography.exceptions.InvalidSignature 异常
public_key.verify(
    signature,
    message,
    padding.PSS(
        mgf=padding.MGF1(hashes.SHA1()),
        salt_length=padding.PSS.MAX_LENGTH
    ),
    hashes.SHA1()
)

这样生成的签名base64encode之后, 会有344byte 的长度.

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/41266.html

相关文章

  • python加密与解密,加签验签

    摘要:在与第三方服务对接时,加密与解密,加签与验签是这个过程中的关键一步一般情况下,对接服务中会有两对公私钥。传回来的数据,使用自己的私钥解密,使用对方的公钥验签。加密加密超长字节个字节一加密解密解密超长字符一解密加签验签签名待验证签名 在与第三方服务对接时,加密与解密,加签与验签是这个过程中的关键一步 一般情况下,对接服务中会有两对公私钥。使用对方公钥进行加密,使用自己私钥进行加签。传回来...

    daydream 评论0 收藏0
  • 回眸曾经项目,与第三方支付相关,所带来沟通问题

    摘要:钱可以存储在自己的余额中,这就相当于微信钱包,余额可以提现到银行卡的中。我们的第三方支付平台是连连支付,杭州的一家公司。私钥怎么加签每个公司的加签方式是不一样的,支付宝有支付宝的加签方式,微信有微信的加签方式。 导读 笔者在校期间,通过自学java。学校里也开过这门课,但是,讲的都是一些基础,比如java的表达式、基本类型、自定义类型等等。也都是很基础的东西,就连lambda表达式都没...

    kaka 评论0 收藏0
  • 支付与签名原串那些事,但选择排序生成签名原串

    摘要:工商银行中国工商银行提现支付域名项目名接口我们第一次使用支付请求对象,是为了将其生成签名原串。第一次加密是将不包含属性值的支付请求对象封装的签名原串和我们生成的私钥共同加密成签名字符串,放进支付请求对象中的属性中。 引题 【备注】签名原串的源码放在git上了,请大家参看:项目源码 笔者最近在做支付、调用天猫优惠券、绑定银行卡相关的业务,在这些业务中,我们都需要将数据加密。然而,数据的加...

    DC_er 评论0 收藏0
  • 基于注解 java 加签验签框架 checksum

    摘要:基于注解生成加签验签。后来发现如下的问题有些字段太大,不想参与验签,但是无法方便的调整。感觉这样有很大的弊端,完全失去了灵活性。 checksum 基于 java 注解生成加签验签 checksum。 开源地址:github checksum 创作缘由 原来的代码中,checksum 的生成是用的工具类方法。 后来发现如下的问题: 有些字段太大,不想参与验签,但是无法方便的调整。 ...

    jindong 评论0 收藏0
  • RSA加密解密(无数据大小限制,php、go、java互通实现

    摘要:加解密中必须考虑到的密钥长度明文长度和密文长度问题。而只要用到,那么就要占用实际的明文长度,于是实际明文长度需要减去字节长度。所以如果要对任意长度的数据进行加密,就需要将数据分段后进行逐一加密,并将结果进行拼接。 RSA加解密中必须考虑到的密钥长度、明文长度和密文长度问题。明文长度需要小于密钥长度,而密文长度则等于密钥长度。因此当加密内容长度大于密钥长度时,有效的RSA加解密就需要对内...

    whjin 评论0 收藏0

发表评论

0条评论

kuangcaibao

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<