【算法介绍】
国密SM2算法是一种由中国国家密码管理局发布的非对称加密算法,基于椭圆曲线密码学体系,具有较高的安全性和效率。该算法主要用于数字签名、密钥交换和公钥加密等场景,其安全性主要基于椭圆曲线离散对数问题的难解性。
SM2算法特点
- 高安全性:SM2算法基于椭圆曲线密码学,相比传统算法如RSA,在同等密钥长度下提供了更高的安全性。
- 高效率:SM2算法的计算量相对较小,适合在资源受限的环境中使用,如移动设备或嵌入式系统。
- 广泛适用性:不仅适用于数据加密,还广泛应用于数字签名、密钥协商等场景,满足多种信息安全需求。
- 标准化: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);
}