国密算法:利用python进行sm2非对称算法的实现,国密算法库gmssl的使用

这篇具有很好参考价值的文章主要介绍了国密算法:利用python进行sm2非对称算法的实现,国密算法库gmssl的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

我们继续来进行国密算法的演示。
本篇演示sm2非对称算法的实现,国密算法库gmssl的使用。

一 sm2算法的特点:

  • sm2: 即椭圆曲线公钥密码算法,是由国家密码管理局发布的;
  • 非对称加密算法,即有一对不一样的密钥:公钥和私钥,公钥用来加密,私钥用来解密;
  • 公钥和私钥:公钥,可以公开。私钥:不对外公开;
  • 同一个明文,同一个公钥,每次加密结果不相等;
  • 密码复杂度高,更先进,更安全,性能更快;
  • 用于替换RSA算法。很多软件都在进行国密改造,指的就是用sm1/sm2/sm3/sm4替换掉原有的加解密算法。

二sm2算法的演示:

1. 定义一个通用sm2算法类
# -*- coding: utf-8 -*-

import binascii
import re
import requests
import logging

from gmssl import sm2, func

class Sm2Tools:
    """
    通用sm2算法类
    """
    class KeyStore:
        """
        SM2 密钥对类,包含密钥对生成、获取方法
        """
        _PRIVATE_KEY = ""
        _PUBLIC_KEY = ""

        def __init__(self) -> None:
            pass

        def setKey(self, priKey: str, pubKey: str) -> bool:
            """
            简单判断密钥对格式
            :param priKey: 私钥
            :param pubKey: 公钥
            :return: bool
            """
            result = re.match(r"^[a-fA-F\d]{64}$", priKey)
            if result is None:
                logging.error("KeyStore.setKey() -> priKey is invalid.")
                return False
            result = re.match(r"^[a-fA-F\d]{128}$", pubKey)
            if result is None:
                logging.error("KeyStore.setKey() -> pubKey is invalid.")
                return False
            self._PRIVATE_KEY = priKey
            self._PUBLIC_KEY = pubKey
            return True

        def createLocal(self) -> bool:
            """
            本地创建密钥对
            :return: bool
            """

            class _Generate_SM2_Key(sm2.CryptSM2):

                #初始化
                def __init__(self, private_key=None, public_key=None, ecc_table=sm2.default_ecc_table):
                    super().__init__(private_key, public_key, ecc_table)

                #获取私钥
                def get_private_key(self):
                    if self.private_key is None:
                        self.private_key = func.random_hex(self.para_len)  # d∈[1, n-2]
                    return self.private_key

                #获取共钥
                def get_public_key(self):
                    if self.public_key is None:
                        self.public_key = self._kg(int(self.get_private_key(), 16), self.ecc_table['g'])  # P=[d]G
                    return self.public_key

            try:
                _sm2Generator = _Generate_SM2_Key()
                self._PRIVATE_KEY = _sm2Generator.get_private_key()
                self._PUBLIC_KEY = _sm2Generator.get_public_key()
                return True
            except:
                logging.error("KeyStore.createLocal() can't create the correct keys. ",
                              "Please call the Lib's Designer. ")
                return False

        def getSelf(self) -> dict:
            """
            获取创建的密钥对
            :return: dict: keyStore 格式:
            {
                "PRIVATE_KEY": "",
                "PUBLIC_KEY": ""
            }
            """
            return {
                "PRIVATE_KEY": self._PRIVATE_KEY,
                "PUBLIC_KEY": self._PUBLIC_KEY
            }

        def getPrivateKey(self) -> str:
            """
            返回公钥
            :return: str
            """
            return self._PRIVATE_KEY

        def getPublicKey(self) -> str:
            """
            返回私钥
            :return: str
            """
            return self._PUBLIC_KEY

    class SM2_Util(Exception):
        """
        SM2 加解密类
        """

        _SM2_Util = None

        def __init__(self, exception="") -> None:
            """
            构造函数
            :param exception: 默认参数,用于自定义异常
            """

            self._EXCPTION = None
            self._INIT_FLAG = False

        def setKey(self, keyStore: dict) -> bool:
            """
            初始化密钥对
            :param keyStore: dict: keyStore 格式:
                {
                    "PRIVATE_KEY": "",
                    "PUBLIC_KEY": ""
                }
            :return: bool
            """
            try:
                # 判断是否为全为英文和数字,且是 16 个字符的字符串
                # 不是,则抛出异常
                if re.match(r"^[a-fA-F\d]{64}$", keyStore["PRIVATE_KEY"]) is None:
                    raise Sm2Tools.SM2_Util(exception="SM2_Util.setKey() -> PRIVATE_KEY is invalid.")
                if re.match(r"^[a-fA-F\d]{128}$", keyStore["PUBLIC_KEY"]) is None:
                    raise Sm2Tools.SM2_Util(exception="SM2_Util.setKey() -> PUBLIC_KEY is invalid.")
            except Sm2Tools.SM2_Util as e:
                logging.error(e._EXCPTION)
                return False
            self._SM2_Util = sm2.CryptSM2(public_key=keyStore["PUBLIC_KEY"], private_key=keyStore["PRIVATE_KEY"])
            self._INIT_FLAG = True
            return True

        def getSelf(self) -> sm2.CryptSM2:
            """
            获取加解密类对象
            :return: sm2.CryptSM2 类实例
            """
            return self._SM2_Util

        def encrypt(self, data: str):
            """
            进行 SM2 加密操作
            :param data: String 格式的原文 data
            :return: String 格式的密文 enc_data
            """
            data_utf8 = data.encode("utf-8")
            enc_data = self._SM2_Util.encrypt(data_utf8)
            enc_data = binascii.b2a_hex(enc_data).decode("utf-8")
            return enc_data

        def decrypt(self, enc_data: str):
            """
            进行 SM2 解密操作
            :param enc_data: String 格式的密文 enc_data
            :return: String 格式的原文 data
            """
            enc_data = binascii.a2b_hex(enc_data.encode("utf-8"))
            dec_data = self._SM2_Util.decrypt(enc_data)
            dec_data = dec_data.decode("utf-8")
            return dec_data
2. 通用sm2算法类的调用
def test_sm2():
    # """
    # SM2 test
    # """
    keyStore = Sm2Tools.KeyStore()
    SM2_Util = Sm2Tools.SM2_Util()
    if keyStore.createLocal():
        keysDict = keyStore.getSelf()
        SM2_Util.setKey(keysDict)
        data = "哈哈,我的国密算法改造,已完成了!!!"
        print("data: " + data)
        enc_data = SM2_Util.encrypt(data)
        print("encode_data: " + enc_data)
        dec_data = SM2_Util.decrypt(enc_data)
        print("decode_data: " + dec_data)
        if data == dec_data:
            print("data == decode_data: True")
    else:
        print("create fail")

# main 
if __name__ == '__main__':
    print("main begin");
    test_sm2();
    print("main end");

运行结果:

% python3 sm2_t2.py
main begin
data: 哈哈,我的国密算法改造,已完成了!!!
encode_data: 4c37771377ad989fbe4c405a0893f8cc1ee79dc5200dc8c9a6df7eddeb90fb8b210bea842d411700c31da4470c6387bd52f1ff25bbe777f36745cc5cf70e9e5fa40a0831f5951182fe8db50c9f3350c5a68466af218b2589f05227804d3ce53ceb44a85ea52fadfc6116956dd5d5c1ee0ceb44558acc3a07fffaeb4bc8b2d93f627f360df247f57c667b0e18c72d4c9677a7deec3ba54e1533
decode_data: 哈哈,我的国密算法改造,已完成了!!!
data == decode_data: True
main end文章来源地址https://www.toymoban.com/news/detail-464322.html

到了这里,关于国密算法:利用python进行sm2非对称算法的实现,国密算法库gmssl的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • vue前端国密SM2, SM4 算法实现

    整体加密逻辑是,首先生成16位key值 用SM2 公钥加密该key值,后端用sm2私钥 解密出key值,然后采用sm4方法根据key值对返回值进行加密,前端采用sm4 对后端返回结果进行解密进行前端展示 目前主要常用的国密算法有sm-crypto,gm-crypto,gm-crypt(SM4) 1、安装 sm-crypto 2、包装加解密

    2024年02月12日
    浏览(38)
  • 国密算法SM2实现基于hutool工具类

    首先引入maven 直接上代码

    2024年02月11日
    浏览(22)
  • Go实现国密算法SM2、SM3、SM4

    SM2椭圆曲线公钥密码算法 Public key cryptographic algorithm SM2 based on elliptic curves 遵循的SM2标准号为: GM/T 0003.1-2012、GM/T 0003.2-2012、GM/T 0003.3-2012、GM/T 0003.4-2012、GM/T 0003.5-2012、GM/T 0009-2012、GM/T 0010-2012 依赖包: github.com/tjfoc/gmsm/sm2 SM3密码杂凑算法 - SM3 cryptographic hash algorithm 遵循的SM

    2024年02月15日
    浏览(17)
  • 国密算法SM2,SM3,SM4-java实现原理

    国密算法SM2,SM3,SM4-java实现原理

    SM2是国家密码管理局于2010年12月17日发布的椭圆曲线公钥密码算法,基于ECC。其签名速度与秘钥生成速度都快于RSA,非对称加密,该算法已公开 SM3是中华人民共和国政府采用的一种密码散列函数标准,由国家密码管理局于2010年12月17日发布。SM3主要用数字签名及验证、消息认

    2024年02月13日
    浏览(18)
  • react+vue 前端国密算法sm2、sm3 、sm4的js ts实现

    1. 简单介绍下SM2 和 SM3 SM2 算法:是一种公钥加密算法,它的密钥长度为 256 位,安全性较高。可用于数字签名、密钥协商等场景。 SM3 算法:是一种对称加密算法,用于消息摘要和数字签名等场景。它的密钥长度为 256 位,安全性较高。SM3 算法与 SM2 算法相互配合,提高了整体

    2024年01月19日
    浏览(17)
  • 使用 Java Bouncy Castle实现国密算法SM4、SM3以及SM2的加密

    使用 Java Bouncy Castle实现国密算法SM4、SM3以及SM2的加密

    国密算法的实现借助了Java库函数 Bouncy Castle,加密库安装使用教程请参考链接 SM4,又称为商密算法,是一种分组密码算法,于2012年由中国密码技术研究中心(中国密码学会成员)发布,目前已成为我国国家密码算法,并在多个领域得到了广泛的应用。SM4算法采用了32轮迭代结

    2024年02月16日
    浏览(16)
  • 国密算法 SM2 公钥加密 数字签名 密钥交换 全网最高效的开源python代码

    国密算法 SM2 公钥加密 数字签名 密钥交换 全网最高效的开源python代码

    此前发布过SM2、SM3、SM4、ZUC等文章,以及开源的完整python代码。近些天看到一篇电子科大兰同学的硕士毕业论文(兰修文. ECC计算算法的优化及其在SM2实现中的运用[D]. 成都: 电子科技大学, 2019),文中采用预计算加速SM2椭圆曲线基点点乘,将这个思路用python代码实现后,实测

    2024年02月09日
    浏览(28)
  • 国密SM2/SM3算法

    分类 1、SM1是一种分组加密算法 对称加密算法中的分组加密算法,其分组长度、秘钥长度都是128bit,算法安全保密强度跟 AES 相当,但是算法不公开,仅以IP核的形式存在于芯片中,需要通过加密芯片的接口进行调用。 采用该算法已经研制了系列芯片、智能IC卡、智能密码钥匙

    2024年02月05日
    浏览(12)
  • 国密算法-SM2

            国密算法是国家密码局制定标准的一系列算法,包括SM1、SM2、SM3、SM4等。其中,SM1是采用硬件实现的,不予讨论;SM2是非对称加密算法;SM3是摘要算法;SM4是对称加密算法。本篇贴出SM2 Java版本实现生成公私钥及加解密、签名验签代码,供大家一起讨论学习,所有

    2024年02月11日
    浏览(11)
  • 前端使用国密sm2和sm4进行加解密

    国密SM:国密算法,即国家商用密码算法。是由国家密码管理局认定和公布的密码算法标准及其应用规范,其中部分密码算法已经成为国际标准。如SM系列密码,SM代表商密,即商业密码,是指用于商业的、不涉及国家秘密的密码技术。 安装SM加密依赖 SM2 封装 将sm2的加密解密

    2024年02月08日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包