python 的sm2 密钥的格式转化pem 和str

部署运行你感兴趣的模型镜像
"""
Author: tanglei
DateTime:2024-11-18 完成
微信:ciss_cedar
欢迎一起学习
"""

import base64

key_type = ('PUBLIC', 'PRIVATE')


def hex_to_pem(hex_key, key_type='PUBLIC'):
    """
    将十六进制字符串格式的密钥转换为 PEM 格式。

    :param hex_key: 十六进制编码的密钥字符串。
    :param key_type: 'PUBLIC' 或 'PRIVATE',表示公钥或私钥。
    :return: PEM 格式的密钥字符串。
    """
    # 将十六进制字符串解码为二进制数据
    bin_key = bytes.fromhex(hex_key)

    # 构造 PEM 格式的字符串
    pem_header = f'-----BEGIN {key_type.upper()} KEY-----\n'
    pem_footer = f'-----END {key_type.upper()} KEY-----\n'

    # 将二进制数据编码为 Base64,并确保每行不超过 64 个字符
    pem_body = ''.join([base64.b64encode(bin_key[i:i + 60]).decode('utf-8') for i in range(0, len(bin_key), 60)])
    pem_key = pem_header + pem_body.replace('\n', '\n    ') + '\n' + pem_footer  # 可选:添加缩进以符合某些工具的格式要求

    return pem_key


def pem_to_hex(pem_key):
    """
    将 PEM 格式的密钥字符串转换回十六进制字符串。

    :param pem_key: PEM 格式的密钥字符串。
    :return: 十六进制编码的密钥字符串。
    """
    pem_header_public = '-----BEGIN PUBLIC KEY-----'
    pem_header_private = '-----BEGIN PRIVATE KEY-----'
    pem_footer = '-----END '

    # 确定密钥类型并提取 Base64 编码的主体部分
    if pem_header_public in pem_key:
        pem_header = pem_header_public
    elif pem_header_private in pem_key:
        pem_header = pem_header_private
    else:
        raise ValueError("Invalid PEM key: Unrecognized header.")

    pem_body = pem_key[pem_key.index(pem_header) + len(pem_header):pem_key.index(pem_footer.replace(' ', '')) + len(
        ' KEY-----\n')].strip()

    # Base64 解码
    # print(f'pem_body={pem_body}')
    bin_key = base64.b64decode(pem_body)

    # 将二进制数据编码为十六进制字符串
    hex_key = bin_key.hex().upper()

    return hex_key


def main():
    # 示例用法
    public_key = 'B9C9A6E04E9C91F7BA880429273747D7EF5DDEB0BB2FF6317EB00BEF331A83081A6994B8993F3F5D6EADDDB81872266C87C018FB4162F5AF347B483E24620207'
    private_key = 'B9AB0B828FF68872F21A837FC303668428DEA11DCD1B24429D0C99E24EED83D5'

    public_key_pem = hex_to_pem(public_key, key_type[0])
    private_key_pem = hex_to_pem(private_key, key_type[1])

    print(f'public_key_pem=')
    print(f'{public_key_pem}')
    print(f'private_key_pem=')
    print(f'{private_key_pem}')

    public_key = pem_to_hex(public_key_pem)
    private_key = pem_to_hex(private_key_pem)

    print(public_key)
    print(private_key)


if __name__ == '__main__':
    main()

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值