using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Arric.Crypto.SM.SM2;
using Arric.Crypto.SM.SM3;
using Arric.Crypto.SM.SM4;
using VOL.Core.Configuration;
namespace VOL.Core.Utilities
{
///
/// 国密 SM2 / SM3 / SM4 工具(密钥取自 AppSetting.GmCrypto)
///
public static class GmCryptoHelper
{
///
/// SM3 摘要(Hex,由 Arric.Crypto.SM 返回)
///
public static string Sm3HashHex(string plainText, GmCryptoOptions opt = null)
{
if (plainText == null) throw new ArgumentNullException(nameof(plainText));
opt ??= AppSetting.GmCrypto;
if (opt?.SM3 != null && !opt.SM3.Enabled)
throw new InvalidOperationException("GmCrypto:SM3:Enabled 为 false,已禁用 SM3");
var sm3 = new SM3Crypto();
return sm3.EncryptToHex(plainText);
}
///
/// 使用配置中公钥加密为 Hex(若未配置公钥则抛异常)
///
public static string Sm2EncryptToHex(string plainText, GmCryptoOptions opt = null)
{
opt ??= AppSetting.GmCrypto;
if (opt?.SM2 == null || string.IsNullOrWhiteSpace(opt.SM2.PublicKeyHex))
throw new InvalidOperationException("GmCrypto:SM2:PublicKeyHex 未配置");
var sm2 = new SM2Crypto();
return sm2.EncryptToHex(plainText, opt.SM2.PublicKeyHex.Trim(), opt.SM2.PreferC1C3C2);
}
///
/// 使用配置中私钥解密 Hex 密文
///
public static string Sm2DecryptFromHex(string cipherHex, GmCryptoOptions opt = null)
{
opt ??= AppSetting.GmCrypto;
if (opt?.SM2 == null || string.IsNullOrWhiteSpace(opt.SM2.PrivateKeyHex))
throw new InvalidOperationException("GmCrypto:SM2:PrivateKeyHex 未配置");
var sm2 = new SM2Crypto();
return sm2.DecryptFormHex(cipherHex, opt.SM2.PrivateKeyHex.Trim(), opt.SM2.PreferC1C3C2);
}
///
/// SM2 签名(Hex)
///
public static string Sm2SignToHex(string plainText, GmCryptoOptions opt = null)
{
opt ??= AppSetting.GmCrypto;
if (opt?.SM2 == null || string.IsNullOrWhiteSpace(opt.SM2.PrivateKeyHex))
throw new InvalidOperationException("GmCrypto:SM2:PrivateKeyHex 未配置");
return SM2Signature.GenerateSignatureToHex(plainText, opt.SM2.PrivateKeyHex.Trim(), opt.SM2.PreferC1C3C2);
}
///
/// SM2 验签
///
public static bool Sm2VerifySignature(string plainText, string signatureHex, GmCryptoOptions opt = null)
{
opt ??= AppSetting.GmCrypto;
if (opt?.SM2 == null || string.IsNullOrWhiteSpace(opt.SM2.PublicKeyHex))
throw new InvalidOperationException("GmCrypto:SM2:PublicKeyHex 未配置");
return SM2Signature.VerifySignature(plainText, signatureHex, opt.SM2.PublicKeyHex.Trim(), opt.SM2.PreferC1C3C2, true);
}
///
/// SM4 CBC 加密为 Hex(使用配置中的 KeyHex / IvHex)
///
public static string Sm4EncryptCbcToHex(string plainText, Encoding encoding = null, GmCryptoOptions opt = null)
{
opt ??= AppSetting.GmCrypto;
ValidateSm4(opt);
encoding ??= Encoding.UTF8;
var crypto = new Sm4Crypto { Encoding = encoding };
return crypto.EncryptCBCToHex(plainText, opt.SM4.KeyHex.Trim(), opt.SM4.IvHex.Trim());
}
///
/// SM4 CBC 解密 Hex
///
public static string Sm4DecryptCbcFromHex(string cipherHex, Encoding encoding = null, GmCryptoOptions opt = null)
{
opt ??= AppSetting.GmCrypto;
ValidateSm4(opt);
encoding ??= Encoding.UTF8;
var crypto = new Sm4Crypto { Encoding = encoding };
return crypto.DecryptCBCFormHex(cipherHex, opt.SM4.KeyHex.Trim(), opt.SM4.IvHex.Trim());
}
///
/// SM4 ECB 加密为 Hex(无需 IV)
///
public static string Sm4EncryptEcbToHex(string plainText, Encoding encoding = null, GmCryptoOptions opt = null)
{
opt ??= AppSetting.GmCrypto;
if (opt?.SM4 == null || string.IsNullOrWhiteSpace(opt.SM4.KeyHex))
throw new InvalidOperationException("GmCrypto:SM4:KeyHex 未配置");
encoding ??= Encoding.UTF8;
var crypto = new Sm4Crypto { Encoding = encoding };
return crypto.EncryptECBToHex(plainText, opt.SM4.KeyHex.Trim());
}
///
/// SM4 ECB 解密 Hex
///
public static string Sm4DecryptEcbFromHex(string cipherHex, Encoding encoding = null, GmCryptoOptions opt = null)
{
opt ??= AppSetting.GmCrypto;
if (opt?.SM4 == null || string.IsNullOrWhiteSpace(opt.SM4.KeyHex))
throw new InvalidOperationException("GmCrypto:SM4:KeyHex 未配置");
encoding ??= Encoding.UTF8;
var crypto = new Sm4Crypto { Encoding = encoding };
return crypto.DecryptECBFormHex(cipherHex, opt.SM4.KeyHex.Trim());
}
private static void ValidateSm4(GmCryptoOptions opt)
{
if (opt?.SM4 == null || string.IsNullOrWhiteSpace(opt.SM4.KeyHex) || string.IsNullOrWhiteSpace(opt.SM4.IvHex))
throw new InvalidOperationException("GmCrypto:SM4:KeyHex 与 IvHex(CBC)均需配置");
}
}
}