目录
效果
项目
代码
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Crypto.Signers;
using Org.BouncyCastle.Asn1.GM;
using System;
using System.Text;
using System.Windows.Forms;
using Org.BouncyCastle.Asn1.X9;
using Org.BouncyCastle.Utilities.Encoders;
using Org.BouncyCastle.Math;
using Org.BouncyCastle.Crypto.Generators;
using Org.BouncyCastle.Security;
using System.Linq;
namespace SM2VerifySignTool
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
int toDigit(char ch, int index)
{
int digit = Convert.ToInt32(ch.ToString(), 16);
if (digit == -1)
{
throw new SystemException("Illegal hexadecimal character " + ch + " at index " + index);
}
return digit;
}
string HexToBase64(string hexString)
{
byte[] bytes = Enumerable.Range(0, hexString.Length)
.Where(x => x % 2 == 0)
.Select(x => Convert.ToByte(hexString.Substring(x, 2), 16))
.ToArray();
return Convert.ToBase64String(bytes);
}
byte[] hexStrToByte(String hexStr)
{
if ((null == hexStr) || (hexStr.Length == 0))
{
return null;
}
char[] hexData = hexStr.ToCharArray();
int len = hexData.Length;
if ((len & 0x1) != 0)
{
throw new SystemException("Odd number of characters.");
}
byte[] out1 = new byte[len >> 1];
int i = 0;
for (int j = 0; j < len; i++)
{
int f = toDigit(hexData[j], j) << 4;
j++;
f |= toDigit(hexData[j], j);
j++;
out1[i] = ((byte)(f & 0xFF));
}
return out1;
}
X9ECParameters x9ec = GMNamedCurves.GetByName("SM2P256V1");
/**
*生成
*/
void GenerateKey(out string pubkeyStr, out string prikeyStr)
{
var g = new ECKeyPairGenerator();
g.Init(new ECKeyGenerationParameters(new ECDomainParameters(x9ec), new SecureRandom()));
var k = g.GenerateKeyPair();
byte[] pubkey = ((ECPublicKeyParameters)k.Public).Q.GetEncoded(false);
byte[] privkey = ((ECPrivateKeyParameters)k.Private).D.ToByteArray();
prikeyStr = BitConverter.ToString(privkey).Replace("-", "");
pubkeyStr = BitConverter.ToString(pubkey).Replace("-", "");
}
/**
*加签
*/
string Sign(string prikeyStr, string data)
{
byte[] msg = Encoding.UTF8.GetBytes(data);
byte[] priKey = hexStrToByte(prikeyStr);
SM2Signer sm2Signer = new SM2Signer();
ECPrivateKeyParameters privateKeyParameters = new ECPrivateKeyParameters(new BigInteger(1, priKey), new ECDomainParameters(x9ec));
sm2Signer.Init(true, privateKeyParameters);
sm2Signer.BlockUpdate(msg, 0, msg.Length);
return Hex.ToHexString(sm2Signer.GenerateSignature());
}
/*
* 验签
*/
bool verifySign(string pubkeyStr, string data, string sign)
{
byte[] signHex = hexStrToByte(sign);
byte[] pubkey = hexStrToByte(pubkeyStr);
byte[] msgByte = Encoding.UTF8.GetBytes(data);
SM2Signer sm2Signer = new SM2Signer();
ECPublicKeyParameters publicKeyParameters = new ECPublicKeyParameters(x9ec.Curve.DecodePoint(pubkey), new ECDomainParameters(x9ec));
sm2Signer.Init(false, publicKeyParameters);
sm2Signer.BlockUpdate(msgByte, 0, msgByte.Length);
return sm2Signer.VerifySignature(signHex);
}
private void btnVerify_Click(object sender, EventArgs e)
{
txtResult.Text = "";
try
{
string pubk = txtPubkey.Text;
string data = txtData.Text;
string sign = txtSign.Text;
bool b = verifySign(pubk, data, sign);
if (b)
{
txtResult.Text = "验证成功";
}
else
{
txtResult.Text = "验证失败";
}
}
catch (Exception ex)
{
txtResult.Text = "验证异常:" + ex.Message;
}
}
/// <summary>
/// Base64字符串转Hex字符串↓
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
try
{
byte[] bytes = Convert.FromBase64String(txtBase64.Text); // 将base64字符串转换为byte数组
string hexString = BitConverter.ToString(bytes).Replace("-", ""); // 将byte数组转换为Hex字符串
txtHex.Text = hexString;
}
catch (Exception ex)
{
txtHex.Text = "转换异常:" + ex.Message;
}
}
private void Form1_Load(object sender, EventArgs e)
{
//string pubkeyStr = "";
//string prikeyStr = "";
//GenerateKey(out pubkeyStr, out prikeyStr);
//txtPriKey.Text = prikeyStr;
//txtPubkey.Text = pubkeyStr;
}
private void button2_Click(object sender, EventArgs e)
{
try
{
string prik = txtPriKey.Text;
string data = txtData.Text;
txtSign.Text = Sign(prik, data);
}
catch (Exception ex)
{
txtSign.Text = "加签识别:" + ex.Message;
}
}
private void button3_Click(object sender, EventArgs e)
{
string pubkeyStr = "";
string prikeyStr = "";
GenerateKey(out pubkeyStr, out prikeyStr);
txtPriKey.Text = prikeyStr;
txtPubkey.Text = pubkeyStr;
}
private void button4_Click(object sender, EventArgs e)
{
try
{
string hexString = txtHex.Text;
string base64String = HexToBase64(hexString);
txtBase64.Text = base64String;
}
catch (Exception ex)
{
txtBase64.Text = "转换异常:" + ex.Message;
}
}
private void button5_Click(object sender, EventArgs e)
{
try
{
string originalString = txtStr.Text;
byte[] bytes = System.Text.Encoding.UTF8.GetBytes(originalString);
string base64String = Convert.ToBase64String(bytes);
txtBase64.Text = base64String;
}
catch (Exception ex)
{
txtBase64.Text = "编码异常:" + ex.Message;
}
}
private void button6_Click(object sender, EventArgs e)
{
try
{
string base64String = txtBase64.Text;
byte[] bytes = Convert.FromBase64String(base64String);
string decodedString = Encoding.UTF8.GetString(bytes);
txtStr.Text = decodedString;
}
catch (Exception ex)
{
txtStr.Text = "解码异常:" + ex.Message;
}
}
}
}
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Crypto.Signers;
using Org.BouncyCastle.Asn1.GM;
using System;
using System.Text;
using System.Windows.Forms;
using Org.BouncyCastle.Asn1.X9;
using Org.BouncyCastle.Utilities.Encoders;
using Org.BouncyCastle.Math;
using Org.BouncyCastle.Crypto.Generators;
using Org.BouncyCastle.Security;
using System.Linq;
namespace SM2VerifySignTool
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
int toDigit(char ch, int index)
{
int digit = Convert.ToInt32(ch.ToString(), 16);
if (digit == -1)
{
throw new SystemException("Illegal hexadecimal character " + ch + " at index " + index);
}
return digit;
}
string HexToBase64(string hexString)
{
byte[] bytes = Enumerable.Range(0, hexString.Length)
.Where(x => x % 2 == 0)
.Select(x => Convert.ToByte(hexString.Substring(x, 2), 16))
.ToArray();
return Convert.ToBase64String(bytes);
}
byte[] hexStrToByte(String hexStr)
{
if ((null == hexStr) || (hexStr.Length == 0))
{
return null;
}
char[] hexData = hexStr.ToCharArray();
int len = hexData.Length;
if ((len & 0x1) != 0)
{
throw new SystemException("Odd number of characters.");
}
byte[] out1 = new byte[len >> 1];
int i = 0;
for (int j = 0; j < len; i++)
{
int f = toDigit(hexData[j], j) << 4;
j++;
f |= toDigit(hexData[j], j);
j++;
out1[i] = ((byte)(f & 0xFF));
}
return out1;
}
X9ECParameters x9ec = GMNamedCurves.GetByName("SM2P256V1");
/**
*生成
*/
void GenerateKey(out string pubkeyStr, out string prikeyStr)
{
var g = new ECKeyPairGenerator();
g.Init(new ECKeyGenerationParameters(new ECDomainParameters(x9ec), new SecureRandom()));
var k = g.GenerateKeyPair();
byte[] pubkey = ((ECPublicKeyParameters)k.Public).Q.GetEncoded(false);
byte[] privkey = ((ECPrivateKeyParameters)k.Private).D.ToByteArray();
prikeyStr = BitConverter.ToString(privkey).Replace("-", "");
pubkeyStr = BitConverter.ToString(pubkey).Replace("-", "");
}
/**
*加签
*/
string Sign(string prikeyStr, string data)
{
byte[] msg = Encoding.UTF8.GetBytes(data);
byte[] priKey = hexStrToByte(prikeyStr);
SM2Signer sm2Signer = new SM2Signer();
ECPrivateKeyParameters privateKeyParameters = new ECPrivateKeyParameters(new BigInteger(1, priKey), new ECDomainParameters(x9ec));
sm2Signer.Init(true, privateKeyParameters);
sm2Signer.BlockUpdate(msg, 0, msg.Length);
return Hex.ToHexString(sm2Signer.GenerateSignature());
}
/*
* 验签
*/
bool verifySign(string pubkeyStr, string data, string sign)
{
byte[] signHex = hexStrToByte(sign);
byte[] pubkey = hexStrToByte(pubkeyStr);
byte[] msgByte = Encoding.UTF8.GetBytes(data);
SM2Signer sm2Signer = new SM2Signer();
ECPublicKeyParameters publicKeyParameters = new ECPublicKeyParameters(x9ec.Curve.DecodePoint(pubkey), new ECDomainParameters(x9ec));
sm2Signer.Init(false, publicKeyParameters);
sm2Signer.BlockUpdate(msgByte, 0, msgByte.Length);
return sm2Signer.VerifySignature(signHex);
}
private void btnVerify_Click(object sender, EventArgs e)
{
txtResult.Text = "";
try
{
string pubk = txtPubkey.Text;
string data = txtData.Text;
string sign = txtSign.Text;
bool b = verifySign(pubk, data, sign);
if (b)
{
txtResult.Text = "验证成功";
}
else
{
txtResult.Text = "验证失败";
}
}
catch (Exception ex)
{
txtResult.Text = "验证异常:" + ex.Message;
}
}
/// <summary>
/// Base64字符串转Hex字符串↓
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
try
{
byte[] bytes = Convert.FromBase64String(txtBase64.Text); // 将base64字符串转换为byte数组
string hexString = BitConverter.ToString(bytes).Replace("-", ""); // 将byte数组转换为Hex字符串
txtHex.Text = hexString;
}
catch (Exception ex)
{
txtHex.Text = "转换异常:" + ex.Message;
}
}
private void Form1_Load(object sender, EventArgs e)
{
//string pubkeyStr = "";
//string prikeyStr = "";
//GenerateKey(out pubkeyStr, out prikeyStr);
//txtPriKey.Text = prikeyStr;
//txtPubkey.Text = pubkeyStr;
}
private void button2_Click(object sender, EventArgs e)
{
try
{
string prik = txtPriKey.Text;
string data = txtData.Text;
txtSign.Text = Sign(prik, data);
}
catch (Exception ex)
{
txtSign.Text = "加签识别:" + ex.Message;
}
}
private void button3_Click(object sender, EventArgs e)
{
string pubkeyStr = "";
string prikeyStr = "";
GenerateKey(out pubkeyStr, out prikeyStr);
txtPriKey.Text = prikeyStr;
txtPubkey.Text = pubkeyStr;
}
private void button4_Click(object sender, EventArgs e)
{
try
{
string hexString = txtHex.Text;
string base64String = HexToBase64(hexString);
txtBase64.Text = base64String;
}
catch (Exception ex)
{
txtBase64.Text = "转换异常:" + ex.Message;
}
}
private void button5_Click(object sender, EventArgs e)
{
try
{
string originalString = txtStr.Text;
byte[] bytes = System.Text.Encoding.UTF8.GetBytes(originalString);
string base64String = Convert.ToBase64String(bytes);
txtBase64.Text = base64String;
}
catch (Exception ex)
{
txtBase64.Text = "编码异常:" + ex.Message;
}
}
private void button6_Click(object sender, EventArgs e)
{
try
{
string base64String = txtBase64.Text;
byte[] bytes = Convert.FromBase64String(base64String);
string decodedString = Encoding.UTF8.GetString(bytes);
txtStr.Text = decodedString;
}
catch (Exception ex)
{
txtStr.Text = "解码异常:" + ex.Message;
}
}
}
}