Python3-使用U盾完成数据的加解密(国密算法SKF接口)

如果身边有银行的U盾,或者其他Ukey产品,可以使用这些产品完成对数据的加解密,针对个人的敏感数据进行加密处理。

1-涉及的内容
  • ubuntu 24.04.2 LTS
  • Python 3.8 / 3.11
  • asn1crypto 1.5.1
  • 使用的 Python3ctypes 作用:

Python3 的外部函数库。提供与 C语言兼容的数据类型,并允许调用 DLL 或共享库中的函数。

  • 使用的 Python3asn1crypto 作用:

Python3 的外部函数库。ASN.1 格式解析组装 PKCS#7 格式的报文。版本不低于 1.5.1 ,否则可能编译错误。

  • 使用的Ukey:文鼎创的一款Key。

与Ukey使用会有配套的驱动程序(管理工具),安装之后会在【C:\Windows\System32】释放对应dll库文件,使用ctypes库调用这个dll文件。

  • dll的接口函数

现在各厂家的Ukey一般都支持国密算法(SKF),使用SKF中的函数,实现数据的加解密。了解到文鼎创这边提供的SKF的函数中有使用ECC非对称算法完成数据加解密。本文内容就是用里面的ECC算法完成数据分非对称加解密。

2-动态库涉及的函数及结构体
2.1 相关结构体

ECC签名结果结构体

C中的结构体声明:

Python的ctype库声明:

ECC公钥结构体

C中的结构体声明:

Python的ctype库声明:

密文数据结构体

C中的结构体声明:

Python的ctype库声明:

2.2 相关函数

3-Python3实现

要求:Ukey中有SM2容器,使用SM2加密密钥对,且默认在第一个容器名中,如果不是,请自行修改。

实现内容:

  • 使用ctype先定义好所需要到的结构体

  • 创建一个类,实现加解密的过程

    • 在类中在初始化中初始化句柄
    • 在对象结束的时候释放掉对应的句柄
    • 将句柄的获取放在一个函数中,获取句柄。
    • 将加密结果转换为Hex字符串形式。
    • 传入Hex密文字符进行解密。

  • 辅助函数:

    • def __IntList_ToHexStr(self, int_list):将int类型的列表转为Hex字符串
    • def __HexStr_ToIntList(self, str_hex):Hex字符串转为int类型的列表
    • def StrHex_ToCipherText(self, str_hex):Hex密文字符串转为密文结构体
    • def CipherText_ToStrHex(self, cipher_text):将密文结构体转为Hex密文字符串
    • def __BuildSm2SignP7DER(self, sig_text, der_cert, sm2_r, sm2_s): 构建 P7格式的SM2签名报文
  • 主要函数:

    • def ECCEncrypt(self, plain_text):返会的是密文结构类型数据
    • def ECCEncrypt_Hex(self, plain_text): 返会的是密文Hex字符串
    • def ECCDecrypt(self, cipher_text):传入密文结构体进行解密
    • def ECCDecrypt_Hex(self, cipher_hex): 传入密文Hex字符串进行解密
    • def VerifyPIN(self, user_pin): 验证UkeyPIN
    • def SM2Sign(self, plain_text): SM2签名
  • 其他函数:获取句柄相关,比较简单。

完整代码

4-测试结果

3-参考文档

智能 IC 卡及智能密码钥匙密码应用接口规范 GB/T 35291-2017

信息安全技术 SM2密码算法使用规范GB/T 35276-2017

智能密码钥匙密码应用接口检测规范GM/T0063—2018

信息技术ASN.1 编码规则 GB/T 16263.1

参考链接


发布者

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注