美文网首页
SM2加解密

SM2加解密

作者: Charles2018 | 来源:发表于2023-06-06 14:59 被阅读0次
using Org.BouncyCastle.Asn1.X9;
using Org.BouncyCastle.Crypto.Generators;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Security;
using Org.BouncyCastle.Utilities.Encoders;
using Org.BouncyCastle.Crypto.Engines;
using System.Text;
using Org.BouncyCastle.Math.EC;
using Org.BouncyCastle.Math;

// 库名称 BouncyCastle.Cryptography

/// <summary>
/// 生成 SM2 密钥对,密钥对使用 Base64 进行编码
/// </summary>
/// <param name="privateKey"></param>
/// <param name="publicKey"></param>
static void GenerateSM2KeyPair(out string privateKey, out string publicKey)
{
    // 获取 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();

    // 私钥
    ECPrivateKeyParameters privateKeyParameters = (ECPrivateKeyParameters)keyPair.Private;
    privateKey = Base64.ToBase64String(privateKeyParameters.D.ToByteArrayUnsigned());

    // 公钥
    ECPublicKeyParameters publicKeyParameters = (ECPublicKeyParameters)keyPair.Public;
    publicKey = Base64.ToBase64String(publicKeyParameters.Q.GetEncoded());
}

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

    ECPoint q = curve.Curve.DecodePoint(Base64.Decode(publicKey));
    ECDomainParameters domain = new ECDomainParameters(curve);
    ECPublicKeyParameters pubk = new ECPublicKeyParameters("EC", q, domain);

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

    // 将原始数据转换为字节数组
    byte[] dataBytes = Encoding.UTF8.GetBytes(content);

    // 执行加密操作
    byte[] encryptedData = sm2Engine.ProcessBlock(dataBytes, 0, dataBytes.Length);

    // 将加密结果转换为 Base64 字符串
    return Base64.ToBase64String(encryptedData);
}

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

    ECDomainParameters domain = new ECDomainParameters(curve);
    BigInteger d = new BigInteger(1, Base64.Decode(privateKey));
    ECPrivateKeyParameters prik = new ECPrivateKeyParameters(d, domain);

    // 创建SM2加密器
    SM2Engine sm2Engine = new SM2Engine();
    sm2Engine.Init(false, prik);

    byte[] encryptedData = Base64.Decode(content);

    // 执行解密操作
    byte[] decryptedData = sm2Engine.ProcessBlock(encryptedData, 0, encryptedData.Length);

    // 将解密结果转换为字符串
    return Encoding.UTF8.GetString(decryptedData);
}

string privateKey = "";
string publicKey = "";
GenerateSM2KeyPair(out privateKey,out publicKey);
Console.WriteLine("公钥:{0}\n私钥:{1}\n\n",publicKey,privateKey);

string content = "老中医";
string etc = Encrypt(content, publicKey);
Console.WriteLine($"加密后值:{etc}");

string de = Decrypt(etc, privateKey);
Console.WriteLine($"解密后值:{de}");

相关文章

网友评论

      本文标题:SM2加解密

      本文链接:https://www.haomeiwen.com/subject/gqegedtx.html