在我们日常开发工作中,为了数据安全问题对数据加密、解密是必不可少的。加密方式有很多种如常见的AES,RSA,MD5,SAH1,SAH256,DES等,这时候假如我们有一个封装的对应加密解密工具类可以直接调用,那这样可以节省不少的开发时间。今天推荐一款实用的.NET Core加密解密工具类库:NETCore.Encrypt。
NETCore.Encrypt是.NET Core加密解密工具类库,包括AES、RSA、MD5、SHA1、DES、SHA256、SHA384、SHA512等更多功能。
????????#region?MD5
????????///?<summary>
????????///?MD5?hash
????????///?</summary>
????????///?<param?name="srcString">The?string?to?be?encrypted.</param>
????????///?<param?name="length">The?length?of?hash?result?,?default?value?is?<see?cref="MD5Length.L32"/>.</param>
????????///?<returns></returns>
????????public?static?string?Md5(string?srcString,?MD5Length?length?=?MD5Length.L32)
????????{
????????????Check.Argument.IsNotEmpty(srcString,?nameof(srcString));
????????????string?str_md5_out?=?string.Empty;
????????????using?(MD5?md5?=?MD5.Create())
????????????{
????????????????byte[]?bytes_md5_in?=?Encoding.UTF8.GetBytes(srcString);
????????????????byte[]?bytes_md5_out?=?md5.ComputeHash(bytes_md5_in);
????????????????str_md5_out?=?length?==?MD5Length.L32
??????????????????????BitConverter.ToString(bytes_md5_out)
????????????????????:?BitConverter.ToString(bytes_md5_out,?4,?8);
????????????????str_md5_out?=?str_md5_out.Replace("-",?"");
????????????????return?str_md5_out;
????????????}
????????}
????????#endregion
????????public?static?void?MD5_Test()
????????{
????????????var?srcString?=?"追逐时光者";
????????????var?hashed?=?EncryptProvider.Md5(srcString);
????????????Console.WriteLine("MD5加密结果:"?+?hashed);
????????}
????????///?<summary>
????????///?RSA?encrypt
????????///?</summary>
????????///?<param?name="publicKey">public?key</param>
????????///?<param?name="srcString">src?string</param>
????????///?<param?name="padding">rsa?encryptPadding?<see?cref="RSAEncryptionPadding"/>?RSAEncryptionPadding.Pkcs1?for?linux/mac?openssl?</param>
????????///?<param?name="isPemKey">set?key?is?pem?format,default?is?false</param>
????????///?<returns>encrypted?string</returns>
????????public?static?string?RSAEncrypt(string?publicKey,?string?srcString,?RSAEncryptionPadding?padding,?bool?isPemKey?=?false)
????????{
????????????Check.Argument.IsNotEmpty(publicKey,?nameof(publicKey));
????????????Check.Argument.IsNotEmpty(srcString,?nameof(srcString));
????????????Check.Argument.IsNotNull(padding,?nameof(padding));
????????????RSA?rsa;
????????????if?(isPemKey)
????????????{
????????????????rsa?=?RsaProvider.FromPem(publicKey);
????????????}
????????????else
????????????{
????????????????rsa?=?RSA.Create();
????????????????rsa.FromJsonString(publicKey);
????????????}
????????????using?(rsa)
????????????{
????????????????var?maxLength?=?GetMaxRsaEncryptLength(rsa,?padding);
????????????????var?rawBytes?=?Encoding.UTF8.GetBytes(srcString);
????????????????if?(rawBytes.Length?>?maxLength)
????????????????{
????????????????????throw?new?OutofMaxlengthException($"'{srcString}'?is?out?of?max?encrypt?length?{maxLength}",?maxLength,?rsa.KeySize,?padding);
????????????????}
????????????????byte[]?encryptBytes?=?rsa.Encrypt(rawBytes,?padding);
????????????????return?encryptBytes.ToHexString();
????????????}
????????}
????????
????????///?<summary>
????????///?RSA?decrypt
????????///?</summary>
????????///?<param?name="publicKey">public?key</param>
????????///?<param?name="srcString">src?string</param>
????????///?<param?name="padding">rsa?encryptPadding?<see?cref="RSAEncryptionPadding"/>?RSAEncryptionPadding.Pkcs1?for?linux/mac?openssl?</param>
????????///?<param?name="isPemKey">set?key?is?pem?format,default?is?false</param>
????????///?<returns>encrypted?string</returns>
????????public?static?string?RSADecrypt(string?privateKey,?string?srcString,?RSAEncryptionPadding?padding,?bool?isPemKey?=?false)
????????{
????????????Check.Argument.IsNotEmpty(privateKey,?nameof(privateKey));
????????????Check.Argument.IsNotEmpty(srcString,?nameof(srcString));
????????????Check.Argument.IsNotNull(padding,?nameof(padding));
????????????RSA?rsa;
????????????if?(isPemKey)
????????????{
????????????????rsa?=?RsaProvider.FromPem(privateKey);
????????????}
????????????else
????????????{
????????????????rsa?=?RSA.Create();
????????????????rsa.FromJsonString(privateKey);
????????????}
????????????using?(rsa)
????????????{
????????????????byte[]?srcBytes?=?srcString.ToBytes();
????????????????byte[]?decryptBytes?=?rsa.Decrypt(srcBytes,?padding);
????????????????return?Encoding.UTF8.GetString(decryptBytes);
????????????}
????????}
????????#region?Rsa加密&解密
????????public?static?void?Rsa_Encrypt_Decrypt_Test(RsaSize?size)
????????{
????????????var?rsaKey?=?EncryptProvider.CreateRsaKey(size);
????????????var?srcString?=?"追逐时光者";
????????????var?encrypted?=?EncryptProvider.RSAEncrypt(rsaKey.PublicKey,?srcString);
????????????Console.WriteLine("RSA加密结果:"?+?encrypted);
????????????Console.WriteLine("\r\n");
????????????var?decrypted?=?EncryptProvider.RSADecrypt(rsaKey.PrivateKey,?encrypted);
????????????Console.WriteLine("RSA解密结果:"?+?decrypted);
????????}
????????#endregion
????????///?<summary>
????????///?DES?encrypt
????????///?</summary>
????????///?<param?name="data">Raw?data?byte?array</param>
????????///?<param?name="key">Key,?requires?24?bits</param>
????????///?<param?name="vector">IV,requires?8?bits</param>
????????///?<returns>Encrypted?byte?array</returns>
????????public?static?byte[]?DESEncrypt(byte[]?data,?string?key,?string?vector)
????????{
????????????Check.Argument.IsNotEmpty(data,?nameof(data));
????????????Check.Argument.IsNotEmpty(key,?nameof(key));
????????????Check.Argument.IsEqualLength(key.Length,?24,?nameof(key));
????????????Check.Argument.IsNotEmpty(vector,?nameof(vector));
????????????Check.Argument.IsEqualLength(vector.Length,?8,?nameof(vector));
????????????return?DESEncrypt(data,?key,?CipherMode.CBC,?vector);
????????}
????????///?<summary>
????????///?DES?encrypt
????????///?</summary>
????????///?<param?name="data">Raw?data</param>
????????///?<param?name="key">Key,?requires?24?bits</param>
????????///?<param?name="cipherMode"><see?cref="CipherMode"/></param>
????????///?<param?name="paddingMode"><see?cref="PaddingMode"/>?default?is?PKCS7</param>
????????///?<param?name="vector">IV,requires?8?bits</param>
????????///?<returns>Encrypted?byte?array</returns>
????????private?static?byte[]?DESEncrypt(byte[]?data,?string?key,?CipherMode?cipherMode,?string?vector?=?"",?PaddingMode?paddingMode?=?PaddingMode.PKCS7)
????????{
????????????Check.Argument.IsNotEmpty(data,?nameof(data));
????????????Check.Argument.IsNotEmpty(key,?nameof(key));
????????????Check.Argument.IsEqualLength(key.Length,?24,?nameof(key));
????????????using?(MemoryStream?Memory?=?new?MemoryStream())
????????????{
????????????????using?(TripleDES?des?=?TripleDES.Create())
????????????????{
????????????????????byte[]?plainBytes?=?data;
????????????????????byte[]?bKey?=?new?byte[24];
????????????????????Array.Copy(Encoding.UTF8.GetBytes(key.PadRight(bKey.Length)),?bKey,?bKey.Length);
????????????????????des.Mode?=?cipherMode;
????????????????????des.Padding?=?paddingMode;
????????????????????des.Key?=?bKey;
????????????????????if?(cipherMode?==?CipherMode.CBC)
????????????????????{
????????????????????????byte[]?bVector?=?new?byte[8];
????????????????????????Array.Copy(Encoding.UTF8.GetBytes(vector.PadRight(bVector.Length)),?bVector,?bVector.Length);
????????????????????????des.IV?=?bVector;
????????????????????}
????????????????????using?(CryptoStream?cryptoStream?=?new?CryptoStream(Memory,?des.CreateEncryptor(),?CryptoStreamMode.Write))
????????????????????{
????????????????????????try
????????????????????????{
????????????????????????????cryptoStream.Write(plainBytes,?0,?plainBytes.Length);
????????????????????????????cryptoStream.FlushFinalBlock();
????????????????????????????return?Memory.ToArray();
????????????????????????}
????????????????????????catch?(Exception?ex)
????????????????????????{
????????????????????????????return?null;
????????????????????????}
????????????????????}
????????????????}
????????????}
????????}
????????
????????///?<summary>
????????///?DES?encrypt
????????///?</summary>
????????///?<param?name="data">Raw?data?byte?array</param>
????????///?<param?name="key">Key,?requires?24?bits</param>
????????///?<param?name="vector">IV,requires?8?bits</param>
????????///?<returns>Encrypted?byte?array</returns>
????????public?static?byte[]?DESDecrypt(byte[]?data,?string?key,?string?vector)
????????{
????????????Check.Argument.IsNotEmpty(data,?nameof(data));
????????????Check.Argument.IsNotEmpty(key,?nameof(key));
????????????Check.Argument.IsEqualLength(key.Length,?24,?nameof(key));
????????????Check.Argument.IsNotEmpty(vector,?nameof(vector));
????????????Check.Argument.IsEqualLength(vector.Length,?8,?nameof(vector));
????????????return?DESDecrypt(data,?key,?CipherMode.CBC,?vector);
????????}
????????///?<summary>
????????///?DES?decrypt
????????///?</summary>
????????///?<param?name="data">Encrypted?data</param>
????????///?<param?name="key">Key,?requires?24?bits</param>
????????///?<param?name="cipherMode"><see?cref="CipherMode"/></param>
????????///?<param?name="paddingMode"><see?cref="PaddingMode"/>?default?is?PKCS7</param>
????????///?<returns>Decrypted?byte?array</returns>
????????private?static?byte[]?DESDecrypt(byte[]?data,?string?key,?CipherMode?cipherMode,?string?vector?=?"",?PaddingMode?paddingMode?=?PaddingMode.PKCS7)
????????{
????????????Check.Argument.IsNotEmpty(data,?nameof(data));
????????????Check.Argument.IsNotEmpty(key,?nameof(key));
????????????Check.Argument.IsEqualLength(key.Length,?24,?nameof(key));
????????????byte[]?encryptedBytes?=?data;
????????????byte[]?bKey?=?new?byte[24];
????????????Array.Copy(Encoding.UTF8.GetBytes(key.PadRight(bKey.Length)),?bKey,?bKey.Length);
????????????using?(MemoryStream?Memory?=?new?MemoryStream(encryptedBytes))
????????????{
????????????????using?(TripleDES?des?=?TripleDES.Create())
????????????????{
????????????????????des.Mode?=?cipherMode;
????????????????????des.Padding?=?paddingMode;
????????????????????des.Key?=?bKey;
????????????????????if?(cipherMode?==?CipherMode.CBC)
????????????????????{
????????????????????????byte[]?bVector?=?new?byte[8];
????????????????????????Array.Copy(Encoding.UTF8.GetBytes(vector.PadRight(bVector.Length)),?bVector,?bVector.Length);
????????????????????????des.IV?=?bVector;
????????????????????}
????????????????????using?(CryptoStream?cryptoStream?=?new?CryptoStream(Memory,?des.CreateDecryptor(),?CryptoStreamMode.Read))
????????????????????{
????????????????????????try
????????????????????????{
????????????????????????????byte[]?tmp?=?new?byte[encryptedBytes.Length];
????????????????????????????int?len?=?cryptoStream.Read(tmp,?0,?encryptedBytes.Length);
????????????????????????????byte[]?ret?=?new?byte[len];
????????????????????????????Array.Copy(tmp,?0,?ret,?0,?len);
????????????????????????????return?ret;
????????????????????????}
????????????????????????catch
????????????????????????{
????????????????????????????return?null;
????????????????????????}
????????????????????}
????????????????}
????????????}
????????}
????????#region?DES加密&解密
????????public?static?void?DES_Encrypt_Decrypt_Test()
????????{
????????????var?srcString?=?"TEST?DES?Encrypt?Decrypt";
????????????string?key?=?EncryptProvider.CreateDesKey();
????????????string?iv?=?EncryptProvider.CreateDesIv();
????????????var?srsDatas?=?Encoding.UTF8.GetBytes(srcString);
????????????var?encrypted?=?EncryptProvider.DESEncrypt(srsDatas,?key,?iv);
????????????Console.WriteLine("DES加密结果:"?+?encrypted);?
????????????
????????????Console.WriteLine("\r\n");
????????????var?decrypted?=?EncryptProvider.DESDecrypt(encrypted,?key,?iv);
????????????var?decryptedStr?=?Encoding.UTF8.GetString(decrypted);
????????????Console.WriteLine("DES解密结果:"?+?decryptedStr);
????????}
????????#endregion
????????///?<summary>
????????///?AES?encrypt?(?no?IV)
????????///?</summary>
????????///?<param?name="data">Raw?data</param>
????????///?<param?name="key">Key,?requires?32?bits</param>
????????///?<returns>Encrypted?string</returns>
????????public?static?string?AESEncrypt(string?data,?string?key)
????????{
????????????Check.Argument.IsNotEmpty(data,?nameof(data));
????????????Check.Argument.IsNotEmpty(key,?nameof(key));
????????????Check.Argument.IsEqualLength(key.Length,?32,?nameof(key));
????????????using?(MemoryStream?memory?=?new?MemoryStream())
????????????{
????????????????using?(Aes?aes?=?Aes.Create())
????????????????{
????????????????????byte[]?plainBytes?=?Encoding.UTF8.GetBytes(data);
????????????????????byte[]?bKey?=?new?byte[32];
????????????????????Array.Copy(Encoding.UTF8.GetBytes(key.PadRight(bKey.Length)),?bKey,?bKey.Length);
????????????????????aes.Mode?=?CipherMode.ECB;
????????????????????aes.Padding?=?PaddingMode.PKCS7;
????????????????????aes.KeySize?=?256;
????????????????????aes.Key?=?bKey;
????????????????????using?(CryptoStream?cryptoStream?=?new?CryptoStream(memory,?aes.CreateEncryptor(),?CryptoStreamMode.Write))
????????????????????{
????????????????????????try
????????????????????????{
????????????????????????????cryptoStream.Write(plainBytes,?0,?plainBytes.Length);
????????????????????????????cryptoStream.FlushFinalBlock();
????????????????????????????return?Convert.ToBase64String(memory.ToArray());
????????????????????????}
????????????????????????catch?(Exception?ex)
????????????????????????{
????????????????????????????return?null;
????????????????????????}
????????????????????}
????????????????}
????????????}
????????}
????????
????????///?<summary>
????????///?AES?decrypt(?no?IV)
????????///?</summary>
????????///?<param?name="data">Encrypted?data</param>
????????///?<param?name="key">Key,?requires?32?bits</param>
????????///?<returns>Decrypted?string</returns>
????????public?static?string?AESDecrypt(string?data,?string?key)
????????{
????????????Check.Argument.IsNotEmpty(data,?nameof(data));
????????????Check.Argument.IsNotEmpty(key,?nameof(key));
????????????Check.Argument.IsEqualLength(key.Length,?32,?nameof(key));
????????????byte[]?encryptedBytes?=?Convert.FromBase64String(data);
????????????byte[]?bKey?=?new?byte[32];
????????????Array.Copy(Encoding.UTF8.GetBytes(key.PadRight(bKey.Length)),?bKey,?bKey.Length);
????????????try
????????????{
????????????????byte[]?decryptedData?=?null;?//?decrypted?data
????????????????using?(MemoryStream?memory?=?new?MemoryStream(encryptedBytes))
????????????????{
????????????????????using?(Aes?aes?=?Aes.Create())
????????????????????{
????????????????????????aes.Mode?=?CipherMode.ECB;
????????????????????????aes.Padding?=?PaddingMode.PKCS7;
????????????????????????aes.KeySize?=?256;
????????????????????????aes.Key?=?bKey;
????????????????????????using?(CryptoStream?decryptor?=?new?CryptoStream(memory,?aes.CreateDecryptor(),?CryptoStreamMode.Read))
????????????????????????{
????????????????????????????using?(MemoryStream?tempMemory?=?new?MemoryStream())
????????????????????????????{
????????????????????????????????byte[]?buffer?=?new?byte[1024];
????????????????????????????????Int32?readBytes?=?0;
????????????????????????????????while?((readBytes?=?decryptor.Read(buffer,?0,?buffer.Length))?>?0)
????????????????????????????????{
????????????????????????????????????tempMemory.Write(buffer,?0,?readBytes);
????????????????????????????????}
????????????????????????????????decryptedData?=?tempMemory.ToArray();
????????????????????????????????return?Encoding.UTF8.GetString(decryptedData);
????????????????????????????}
????????????????????????}
????????????????????}
????????????????}
????????????}
????????????catch
????????????{
????????????????return?null;
????????????}
????????}
????????#region?AES加密&解密
????????public?static?void?Aes_Encrypt_Decrypt_Test()
????????{
????????????var?aesKey?=?EncryptProvider.CreateAesKey();
????????????var?key?=?aesKey.Key;
????????????var?srcString?=?"追逐时光者";
????????????var?encrypted?=?EncryptProvider.AESEncrypt(srcString,?key);
????????????Console.WriteLine("AES加密结果:"?+?encrypted);
????????????Console.WriteLine("\r\n");
????????????var?decrypted?=?EncryptProvider.AESDecrypt(encrypted,?key);
????????????Console.WriteLine("AES解密结果:"?+?decrypted);
????????}
????????#endregion
更多项目实用功能和特性欢迎前往项目开源地址查看👀,别忘了给项目一个Star支持💖。
https://github.com/myloveCc/NETCore.Encrypt
该项目已收录到C#/.NET/.NET Core优秀项目和框架精选中,关注优秀项目和框架精选能让你及时了解C#、.NET和.NET Core领域的最新动态和最佳实践,提高开发工作效率和质量。坑已挖,欢迎大家踊跃提交PR推荐或自荐(让优秀的项目和框架不被埋没🤞
)。
https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.md