You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
93 lines
2.5 KiB
93 lines
2.5 KiB
using System.Text;
|
|
using System.Text.RegularExpressions;
|
|
|
|
namespace Tiobon.Core.Common.Helper.SM;
|
|
|
|
public class SM4Helper
|
|
{
|
|
public String secretKey = "1234567890123456";// 16位
|
|
public String iv = "";
|
|
public bool hexString = false;
|
|
|
|
private SByte[] Byte2SByte(byte[] myByte)
|
|
{
|
|
sbyte[] mySByte = new sbyte[myByte.Length];
|
|
|
|
for (int i = 0; i < myByte.Length; i++)
|
|
{
|
|
if (myByte[i] > 127)
|
|
mySByte[i] = (sbyte)(myByte[i] - 256);
|
|
else
|
|
mySByte[i] = (sbyte)myByte[i];
|
|
}
|
|
|
|
return mySByte;
|
|
}
|
|
private byte[] SByte2Byte(sbyte[] orig)
|
|
{
|
|
byte[] arr = new byte[orig.Length];
|
|
Buffer.BlockCopy(orig, 0, arr, 0, orig.Length);
|
|
|
|
return arr;
|
|
}
|
|
|
|
public String Encrypt_ECB(String plainText)
|
|
{
|
|
SM4_Context ctx = new SM4_Context();
|
|
ctx.isPadding = true;
|
|
ctx.mode = SM4.SM4_ENCRYPT;
|
|
|
|
SByte[] keyBytes;
|
|
if (hexString)
|
|
{
|
|
keyBytes = null;// Hex.Decode(secretKey);
|
|
}
|
|
else
|
|
{
|
|
|
|
keyBytes = Byte2SByte(Encoding.UTF8.GetBytes(secretKey));
|
|
}
|
|
|
|
SM4 sm4 = new SM4();
|
|
sm4.sm4_setkey_enc(ctx, keyBytes);
|
|
SByte[] bytes = Byte2SByte(Encoding.UTF8.GetBytes(plainText));
|
|
SByte[] encrypted = sm4.sm4_crypt_ecb(ctx, bytes);
|
|
|
|
//String cipherText = Encoding.UTF8.GetString(Hex.Encode(SByte2Byte(encrypted)));
|
|
String cipherText = new Base64Encoder().GetEncoded(SByte2Byte(encrypted));
|
|
|
|
if ((cipherText != null) && (cipherText.Trim().Length > 0))
|
|
{
|
|
var matchCol = Regex.Matches(cipherText, "\\s*|\t|\r|\n", RegexOptions.Multiline);
|
|
for (int i = matchCol.Count - 1; i >= 0; i--)
|
|
{
|
|
Match item = matchCol[i];
|
|
cipherText.Remove(item.Index, item.Length);
|
|
}
|
|
}
|
|
return cipherText;
|
|
}
|
|
|
|
public String Decrypt_ECB(String cipherText)
|
|
{
|
|
SM4_Context ctx = new SM4_Context();
|
|
ctx.isPadding = true;
|
|
ctx.mode = SM4.SM4_DECRYPT;
|
|
|
|
SByte[] keyBytes;
|
|
if (hexString)
|
|
{
|
|
keyBytes = null;// Hex.Decode(secretKey);
|
|
}
|
|
else
|
|
{
|
|
keyBytes = Byte2SByte(Encoding.UTF8.GetBytes(secretKey));
|
|
}
|
|
|
|
SM4 sm4 = new SM4();
|
|
sm4.sm4_setkey_dec(ctx, keyBytes);
|
|
SByte[] decrypted = sm4.sm4_crypt_ecb(ctx, Byte2SByte(new Base64Decoder().GetDecoded(cipherText)));
|
|
return Encoding.UTF8.GetString(SByte2Byte(decrypted));
|
|
}
|
|
|
|
}
|
|
|