C# SM2加解密

这篇具有很好参考价值的文章主要介绍了C# SM2加解密。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

SM2是国家密码管理局于2010年12月17日发布的椭圆曲线公钥密码算法。

产生背景:

        随着密码技术和计算机技术的发展,目前常用的1024位RSA算法面临严重的安全威胁,我们国家密码管理部门经过研究,决定采用SM2椭圆曲线算法替换RSA算法。
        SM2算法和RSA算法都是公钥密码算法,SM2算法是一种更先进安全的算法,在我们国家商用密码体系中被用来替换RSA算法。
 

在.NET中的使用:

        本次介绍使用第三方密码库BouncyCastle实现SM2加解密,使用NuGet搜索BouncyCastle.Cryptography点击安装即可。

C# SM2加解密

1.引入命名空间

using Org.BouncyCastle.Asn1.X9;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Engines;
using Org.BouncyCastle.Crypto.Generators;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Math;
using Org.BouncyCastle.Math.EC;
using Org.BouncyCastle.Security;

 

2.生成SM2密钥对

/// <summary>
/// 生成SM2密钥对,密钥对使用Base64进行编码
/// </summary>
/// <returns>PrivateKey:私钥,PublicKey:公钥</returns>
public static (string PrivateKey,string PublicKey) GenerateKeyPair()
{
      //获取SM2曲线参数
      X9ECParameters curve = ECNamedCurveTable.GetByName("sm2p256v1");
      KeyGenerationParameters parameters = new ECKeyGenerationParameters(new ECDomainParameters(curve), new SecureRandom());

      //创建SM2密钥对生成器
      ECKeyPairGenerator generator = new ECKeyPairGenerator();
      generator.Init(parameters);

      //创建密钥对
      var keyPair = generator.GenerateKeyPair();

      //私钥
      var privateKey = Convert.ToBase64String(((ECPrivateKeyParameters)keyPair.Private).D.ToByteArrayUnsigned());

      //公钥
      var publicKey = Convert.ToBase64String(((ECPublicKeyParameters)keyPair.Public).Q.GetEncoded());

      return (privateKey, publicKey);
}

 

3.使用SM2公钥加密

/// <summary>
/// SM2公钥加密
/// </summary>
/// <param name="strs"></param>
/// <param name="publicKey"></param>
/// <returns></returns>
public static string Encrypt(string strs, string publicKey)
{
      //获取SM2曲线参数
      X9ECParameters curve = ECNamedCurveTable.GetByName("sm2p256v1");

      ECPoint q = curve.Curve.DecodePoint(Convert.FromBase64String(publicKey));
      ECDomainParameters domainParameters = new ECDomainParameters(curve);
      ECPublicKeyParameters publicKeyParameters = new ECPublicKeyParameters("EC", q, domainParameters);

      //创建SM2加密器
      SM2Engine engine = new SM2Engine();
      engine.Init(true, new ParametersWithRandom(publicKeyParameters, new SecureRandom()));

      //把待加密的字符串转换成字节数组
      byte[] bytes = Encoding.UTF8.GetBytes(strs);

      //执行加密
      byte[] result = engine.ProcessBlock(bytes, 0, bytes.Length);

      //将加密结果转换成Base64字符串,并返回
      return Convert.ToBase64String(result);
}

 

4.SM2私钥解密

/// <summary>
/// SM2私钥解密
/// </summary>
/// <param name="strs"></param>
/// <param name="privateKey"></param>
/// <returns></returns>
public static string Decrypt(string strs, string privateKey)
{
       //获取SM2曲线参数
       X9ECParameters curve = ECNamedCurveTable.GetByName("sm2p256v1");

       ECDomainParameters domainParameters = new ECDomainParameters(curve);
       BigInteger bigInteger = new BigInteger(1, Convert.FromBase64String(privateKey));
       ECPrivateKeyParameters privateKeyParameters = new ECPrivateKeyParameters(bigInteger, domainParameters);

       //创建SM2解密器
       SM2Engine engine = new SM2Engine();
       engine.Init(false, privateKeyParameters);

       //把待解密的Base64字符串转换成字节数组
       byte[] bytes = Convert.FromBase64String(strs);

       //执行解密
       byte[] result = engine.ProcessBlock(bytes, 0, bytes. Length);

       //将解密结果转换成字符串,并返回
       return Encoding.UTF8.GetString(result);
}

 

总结:

         SM2 密码复杂度高、处理速度快、机器性能消耗更小 被越来越多的程序员熟知和运用,您会在项目中使用SM2加解密吗?文章来源地址https://www.toymoban.com/news/detail-471894.html

到了这里,关于C# SM2加解密的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • SM2 加解密 一文理清

    SM2 加解密 一文理清

    1. 给一个私钥的der文件。   通过命令查看公私钥数据。 F:projectsimkeynowgmssl ec -inform der -in anca_ec_keypri.der -text Using configuration from C:Program FilesCommon FilesSSL/openssl.cnf read EC key Private-Key: (256 bit) priv:     90:8d:22:29:03:f2:8d:bf:45:20:ff:57:77:d4:a1:     cb:57:09:6b:99:45:51:62:bd:2b:d7:d3:60:b1:c

    2023年04月20日
    浏览(10)
  • SM2国密算法加解密

    接口安全设计原则的一个点就是数据不能明文传输,除了https这个必须的请求外,接口数据加密也是一个重要的方式,下面介绍一下SM2国密算法加解密的使用方式。 这里我就针对目前前后端分离架构的方式来简单介绍一下如何正确使用 SM2 算法对数据进行加解密,介绍分为后

    2024年02月11日
    浏览(32)
  • javascript实现SM2加密解密

    前提JavaWeb环境 前端代码 实现步骤 java

    2024年02月14日
    浏览(14)
  • 国密SM2前端加密解密示例

    目录 一、 安装sm2依赖 二、编写代码 1、data中绑定数据 2、公钥加密 3、私钥解密 4、按钮绑定一下,数据可见一下 三、完整代码 要改变的数据phone和过程数据copyphone,公钥publicKey和私钥privateKey 具体生成测试公钥私钥可参照SM2加解密 C1为65字节第1字节为压缩标识,这里固定为

    2024年02月03日
    浏览(47)
  • 小程序软键盘&SM2解密方式

    小程序软键盘&SM2解密方式

    转载请著名出处:https://www.cnblogs.com/funnyzpc/p/17572445.html 私钥(primary key) 公钥(public key) 加密内容 需要的加密库(java) 理论上版本越高越好,如果版本较低可能出现加解密问题,这点是要注意的~ 三方实现库(gmhelper) https://github.com/ZZMarquis/gmhelper 👏这里感谢大神 Lijun Liao 写的库

    2024年02月16日
    浏览(5)
  • 小程序安全键盘&SM2解密方式

    小程序安全键盘&SM2解密方式

    转载请著名出处:https://www.cnblogs.com/funnyzpc/p/17572445.html 私钥(primary key) 公钥(public key) 加密内容 需要的加密库(java) 理论上版本越高越好,如果版本较低可能出现加解密问题,这点是要注意的~ 三方实现库(gmhelper) https://github.com/ZZMarquis/gmhelper 👏这里感谢大神 Lijun Liao 写的库

    2024年02月16日
    浏览(8)
  • 前端sm2国密加密解密

    1.下载国密包 2.获取后端的公钥 注sm-crypto使用BC库加解密前端密钥与后端密钥是两队,非常规的base64密钥 前端公钥需要在前面加04占位否则无法解密 3.前端使用公钥进行加密 生成的加密串加04方便后端解密 4.前端使用私钥解密

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

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

    2024年02月08日
    浏览(48)
  • 基于hutool 封装国密sm2,sm4 加解密算法

    基于hutool 封装国密sm2,sm4 加解密算法 1. 加入依赖包 2. 编码

    2024年02月13日
    浏览(15)
  • Java实现SM2前后端加解密

    Sm2加解密原理,非对称加密,公钥加密,私钥解密。公私钥对成对生成,加密端解密端各自保存。用公钥加密必须要用对应的私钥才能解密,保证安全性。 这里我们实现的功能是前端加密,后端解密,这样前端暴露了公钥,后端持有配对的私钥,保证安全性。 1.jsp引入sm2 2

    2024年02月11日
    浏览(11)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包