废话不多说,分享自己写的3des和SM4加解密过程,由于情景不同,各位需注意各自的加密模式,对齐方式,以及字节转化(十六进制还是base64),如果有帮到您,请随意打赏!
/// <summary>
///3DES加密
/// </summary>
/// <param name="originalValue">加密数据</param>
/// <param name="key">24位字符的密钥字符串</param>
/// <param name="IV">8位字符的初始化向量字符串</param>
/// <returns></returns>
public static string DESEncrypt(string originalValue, string key)
{
SymmetricAlgorithm sa;
ICryptoTransform ct;
MemoryStream ms;
CryptoStream cs;
byte[] byt;
sa = new TripleDESCryptoServiceProvider();
sa.Key = Encoding.UTF8.GetBytes(key);
sa.IV = Encoding.UTF8.GetBytes("00000000");
sa.Mode = CipherMode.ECB;
sa.Padding = PaddingMode.None;
ct = sa.CreateEncryptor();
byt = Encoding.UTF8.GetBytes(originalValue);
ms = new MemoryStream();
cs = new CryptoStream(ms, ct, CryptoStreamMode.Write);
cs.Write(byt, 0, byt.Length);
cs.FlushFinalBlock();
cs.Close();
return Convert.ToBase64String(ms.ToArray());
}
/// <summary>
/// 3DES解密
/// </summary>
/// <param name="data">解密数据</param>
/// <param name="key">24位字符的密钥字符串(需要和加密时相同)</param>
/// <param name="iv">8位字符的初始化向量字符串(需要和加密时相同)</param>
/// <returns></returns>
public static string DESDecrypst(string data, string key)
{
SymmetricAlgorithm mCSP = new TripleDESCryptoServiceProvider();
mCSP.Key = Encoding.UTF8.GetBytes(key);
mCSP.IV = Encoding.UTF8.GetBytes("00000000");
mCSP.Mode = CipherMode.ECB;
mCSP.Padding = PaddingMode.PKCS7;
ICryptoTransform ct;
MemoryStream ms;
CryptoStream cs;
byte[] byt;
ct = mCSP.CreateDecryptor(mCSP.Key, mCSP.IV);
byt = Convert.FromBase64String(data);
ms = new MemoryStream();
cs = new CryptoStream(ms, ct, CryptoStreamMode.Write);
cs.Write(byt, 0, byt.Length);
cs.FlushFinalBlock();
cs.Close();
return Encoding.UTF8.GetString(ms.ToArray());
}
using Org.BouncyCastle.Utilities.Encoders;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Text;
namespace CCGW
{
class SM4Utils
{
public string secretKey = "";
public string iv = "";
public bool hexString = false;
///ECB模式加密
public string Encrypt_ECB(string plainText)
{
SM4_Context ctx = new SM4_Context();
ctx.isPadding = false;
ctx.mode = SM4.SM4_ENCRYPT;
byte[] keyBytes;
if (hexString)
{
keyBytes = Hex.Decode(secretKey);
}
else
{
keyBytes = byteTool.strToHexByte(secretKey);
}
SM4 sm4 = new SM4();
sm4.sm4_setkey_enc(ctx, keyBytes);
byte[] encrypted = sm4.sm4_crypt_ecb(ctx, byteTool.strToHexByte(plainText));
string cipherText = byteTool.byteToHexStr(encrypted);
return cipherText;
}
///ECB模式解密
public string Decrypt_ECB(string cipherText)
{
SM4_Con