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

【算法介绍】

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

SM2算法特点

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

应用场景

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

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

加密解密字符串效果:

调用代码:

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);
        }

 【完整演示源码下载地址】https://download.csdn.net/download/FL1623863129/88600454

以下是使用C语言实现国密SM2算法加解密代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include "sm3.h" #include "sm2.h" int main() { // 初始化SM2上下文 sm2_context ctx; sm2_init(&ctx); // 设置SM2公钥 unsigned char pub_key[64] = { 0x04, 0xA9, 0xF1, 0x9F, 0xC4, 0x5A, 0x2E, 0x4F, 0x5E, 0x4A, 0x12, 0x2F, 0x3D, 0x50, 0x32, 0x22, 0x62, 0x80, 0x20, 0x25, 0x61, 0x0B, 0x09, 0x06, 0x4A, 0x2F, 0x9A, 0x0D, 0x14, 0x70, 0x2C, 0x7D, 0x34, 0x7B, 0x33, 0x5B, 0x4F, 0x8E, 0x97, 0x63, 0x0E, 0x0C, 0xD7, 0x0D, 0x5B, 0x61, 0xA7, 0x32, 0x60, 0x2C, 0x17, 0x69, 0x2F, 0x00, 0x3E, 0x0F, 0x9C, 0x57, 0x0B, 0x8E, 0xF8, 0x1C, 0x00, 0x05 }; sm2_set_public_key(&ctx, pub_key); // 设置SM2私钥 unsigned char pri_key[32] = { 0x71, 0x1E, 0x5E, 0x6A, 0x39, 0x5D, 0x3D, 0x7D, 0x4F, 0x5C, 0x29, 0xC2, 0x76, 0x17, 0x38, 0x3A, 0x9B, 0xB5, 0x60, 0x4E, 0x81, 0x77, 0x1F, 0x15, 0x9D, 0x1C, 0x91, 0x21, 0x92, 0x4C, 0x63, 0x4F }; sm2_set_private_key(&ctx, pri_key); // 待加密的明文 unsigned char plain_text[32] = { 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35 }; // 加密密文和密钥 unsigned char cipher_text[256] = {0}; unsigned char secret_key[32] = {0}; // 进行加密 sm2_encrypt(&ctx, plain_text, 32, cipher_text, secret_key); printf("cipher text:\n"); for(int i = 0; i < 128; i++) { printf("%02x", cipher_text[i]); } printf("\n"); printf("secret key:\n"); for(int i = 0; i < 32; i++) { printf("%02x", secret_key[i]); } printf("\n"); // 解密明文 unsigned char plain_text2[32] = {0}; sm2_decrypt(&ctx, cipher_text, 128, secret_key, plain_text2); printf("plain text:\n"); for(int i = 0; i < 32; i++) { printf("%02x", plain_text2[i]); } printf("\n"); return 0; } ``` 需要使用到两个库文件 `sm3.h` 和 `sm2.h`,这里不做展示。运行代码即可进行 SM2加解密操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农张三疯

你的打赏是我写文章最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值