【算法介绍】

国密SM2算法是一种由中国国家密码管理局发布的非对称加密算法,基于椭圆曲线密码学体系,具有较高的安全性和效率。该算法主要用于数字签名、密钥交换和公钥加密等场景,其安全性主要基于椭圆曲线离散对数问题的难解性。

SM2算法特点

  1. 高安全性:SM2算法基于椭圆曲线密码学,相比传统算法如RSA,在同等密钥长度下提供了更高的安全性。
  2. 高效率:SM2算法的计算量相对较小,适合在资源受限的环境中使用,如移动设备或嵌入式系统。
  3. 广泛适用性:不仅适用于数据加密,还广泛应用于数字签名、密钥协商等场景,满足多种信息安全需求。
  4. 标准化:SM2算法已被国际电信联盟(ITU-T)和国际标准化组织(ISO)认可为国际标准,体现了其国际认可度和影响力。

应用场景

  • 数据加密:使用公钥加密敏感数据,确保数据在传输过程中的安全性。
  • 数字签名:通过私钥对数据进行签名,公钥进行验证,确保数据的完整性和不可抵赖性。
  • 密钥交换:在双方通信前,通过SM2算法安全地交换密钥,为后续的数据加密提供基础。

总之,SM2算法以其高安全性、高效率和广泛适用性,在信息安全领域发挥着重要作用。

加密解密字符串效果:

[C#]国密SM2算法加解密字符串加密解密文件_c#

调用代码:

using Org.BouncyCastle.Math;
using Org.BouncyCastle.Math.EC;
using Org.BouncyCastle.Utilities.Encoders;
using SM2Crypto.Lib;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SM2Crypto
{
    class Program
    {
    private static  string PubKey= "041E353292615666BB47F6358D3E893394D34AF30D64875E2E422182C15885D3ECA697C345EED99268D3CAC5F6054780C34433E1BF12EBFF1F744B67A2F6863CFB";
    private static  string PriKey = "00FAB34B54C026D158B54C88BC0463CB79B22661C7C870AD2A0455300E05471CE1";

    // 报送文件加密用公钥1 测试阶段无需修改,生产接入时另行发放
     public static readonly string PUB_X_KEY = "dc5f89775f11266dbb166638710463db31a91f7b3061aeddb69444d5ec748929";
	// 报送文件加密用公钥2 测试阶段无需修改,生产接入时另行发放
	public static readonly string PUB_Y_KEY = "740e50cb6e6e04003029a66920d1ba4bc39519035ea423bf0079ef58128202fb";
	// 反馈文件解密用私钥 测试阶段无需修改,生产接入时另行发放
	public static readonly string PRV_KEY = "9401d5a563967f8bd39fbd81d5dedea4e552bf97f5dd8cab95749421a477e7d0";

        static void Main(string[] args)
        {

            //byte a = 149;
            //var a1 = Hex.Encode(new byte[] { a });
            //var b = Hex.Decode(a1);

            生成公钥私钥对
            // GetKeyPair();

            //字符串加密与解密
            TestSm2Enc();
            //加密文件
            //EncryptFile();

            //解密文件
            //DecryptFile();

            Console.WriteLine("all done");
            Console.ReadKey();
        }
        /// <summary>
        /// 这个是演示生成公钥和私钥例子
        /// </summary>
        public static void GetKeyPair()
        {
            SM2Utils sm2Utils = new SM2Utils();
            ECPoint pubk;
            BigInteger prik;
            SM2Utils.GenerateKeyPair( out pubk,  out prik);
            var PubKey = Encoding.ASCII.GetString(Hex.Encode(pubk.GetEncoded())).ToUpper();
            var PriKey = Encoding.ASCII.GetString(Hex.Encode(prik.ToByteArray())).ToUpper();
            System.Console.Out.WriteLine("公钥: " + PubKey);
            System.Console.Out.WriteLine("私钥: " + PriKey);
        }