"""
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()
python 的sm2 密钥的格式转化pem 和str
最新推荐文章于 2025-01-24 16:29:59 发布
部署运行你感兴趣的模型镜像
您可能感兴趣的与本文相关的镜像
Python3.9
Conda
Python
Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本
2495

被折叠的 条评论
为什么被折叠?



