/// <summary>
/// AES对称加密和分组加密中的四种模式(ECB、CBC、CFB、OFB),这三种的区别,主要来自于密钥的长度,16位密钥=128位,24位密钥=192位,32位密钥=256位
/// 检验密钥是否有效长度【16|24|32】
/// </summary>
/// <param name="key">密钥</param>
/// <returns>bool</returns>
private static bool AesCheckKey(string key)
{
if (string.IsNullOrWhiteSpace(key))
return false;
if (.Equals(key.Length) || .Equals(key.Length) || .Equals(key.Length))
return true;
else
return false;
} #region 参数是string类型的
/// <summary>
///  AES加密 参数:string
/// </summary>
/// <param name="source">源字符串</param>
/// <param name="key">密钥</param>
/// <param name="base64">是否转64进制</param>
/// <param name="model">运算模式</param>
/// <param name="padding">填充模式</param>
/// <param name="encoding">编码类型</param>
/// <returns>加密后的字符串</returns>
public static string AesEncrypt(string source, string key, bool base64 = false, CipherMode model = CipherMode.ECB, PaddingMode padding = PaddingMode.PKCS7, Encoding encoding = null)
{
if (string.IsNullOrWhiteSpace(source)) return null;
if (!AesCheckKey(key)) return source;
if (encoding == null) encoding = Encoding.UTF8;
using (AesCryptoServiceProvider aesProvider = new AesCryptoServiceProvider())
{
aesProvider.Key = encoding.GetBytes(key);
aesProvider.Mode = model;
aesProvider.Padding = padding;
//aesProvider.KeySize = 128;
//aesProvider.BlockSize = 128;
using (ICryptoTransform cryptoTransform = aesProvider.CreateEncryptor())
{
byte[] toEncryptArray = encoding.GetBytes(source);
byte[] resultArray = cryptoTransform.TransformFinalBlock(toEncryptArray, , toEncryptArray.Length);
aesProvider.Clear();
//return Convert.ToBase64String(resultArray, 0, resultArray.Length);
return base64 ? Convert.ToBase64String(resultArray) : byteToHexString(resultArray);
}
} //RijndaelManaged rijndaelCipher = new RijndaelManaged();
//rijndaelCipher.Mode = CipherMode.ECB;
//rijndaelCipher.Padding = PaddingMode.PKCS7;
//rijndaelCipher.KeySize = 128;
//rijndaelCipher.BlockSize = 128;
//byte[] pwdBytes = System.Text.Encoding.UTF8.GetBytes(key);
//byte[] keyBytes = new byte[16];
//int len = pwdBytes.Length;
//if (len > keyBytes.Length) len = keyBytes.Length;
//System.Array.Copy(pwdBytes, keyBytes, len);
//rijndaelCipher.Key = keyBytes;
////加密初始化向量
//string iv = " ";
//byte[] ivBytes = System.Text.Encoding.UTF8.GetBytes(iv);
//rijndaelCipher.IV = new byte[16];
//ICryptoTransform transform = rijndaelCipher.CreateEncryptor();
//byte[] plainText = System.Text.Encoding.UTF8.GetBytes(source);
//byte[] cipherBytes = transform.TransformFinalBlock(plainText, 0, plainText.Length);
//return byteToHexString(cipherBytes);// Convert.ToBase64String(cipherBytes);
} /// <summary>
///  AES解密 参数:string
/// </summary>
/// <param name="source">源字符串</param>
/// <param name="key">密钥</param>
/// <param name="base64">是否转64进制</param>
/// <param name="model">运算模式</param>
/// <param name="padding">填充模式</param>
/// <param name="encoding">编码类型</param>
/// <returns>解密后的字符串</returns>
public static string AesDecrypt(string source, string key, bool base64 = false, CipherMode model = CipherMode.ECB, PaddingMode padding = PaddingMode.PKCS7, Encoding encoding = null)
{
if (string.IsNullOrWhiteSpace(source)) return null;
if (!AesCheckKey(key)) return source;
if (encoding == null) encoding = Encoding.UTF8;
using (AesCryptoServiceProvider aesProvider = new AesCryptoServiceProvider())
{
aesProvider.Key = encoding.GetBytes(key);
aesProvider.Mode = model;
aesProvider.Padding = padding;
//aesProvider.KeySize = 128;
//aesProvider.BlockSize = 128;
using (ICryptoTransform cryptoTransform = aesProvider.CreateDecryptor())
{
byte[] toEncryptArray = base64 == true ? Convert.FromBase64String(source) : stringToHexByte(source);
byte[] resultArray = cryptoTransform.TransformFinalBlock(toEncryptArray, , toEncryptArray.Length);
aesProvider.Clear();
return encoding.GetString(resultArray);
}
}
}
#endregion /// <summary>
/// 字节数组转16进制字符串
/// </summary>
/// <param name="bytes"></param>
/// <returns></returns>
public static string byteToHexString(byte[] bytes)
{
string returnStr = "";
if (bytes != null)
{
for (int i = ; i < bytes.Length; i++)
{
returnStr += bytes[i].ToString("X2");
}
}
return returnStr;
} /// <summary>
/// 将16进制字符串转换为字节数组
/// </summary>
/// <param name="hexString"></param>
/// <returns></returns>
private static byte[] stringToHexByte(string hexString)
{
hexString = hexString.Replace(" ", "");
if ((hexString.Length % ) != )
hexString += " ";
byte[] returnBytes = new byte[hexString.Length / ];
for (int i = ; i < returnBytes.Length; i++)
returnBytes[i] = Convert.ToByte(hexString.Substring(i * , ), );
return returnBytes;
} #region 参数是byte[]类型的
/// <summary>  
/// AES加密 参数:byte[] 
/// </summary>  
/// <param name="source">源字符字节组</param>
/// <param name="key">密钥</param>
/// <param name="model">运算模式</param>
/// <param name="padding">填充模式</param>
/// <param name="encoding">编码类型</param>
/// <returns>加密后的字符字节组</returns>  
public static byte[] AesEncrypt(byte[] source, string key, CipherMode model = CipherMode.ECB, PaddingMode padding = PaddingMode.PKCS7, Encoding encoding = null)
{
if (source == null) return null;
if (!AesCheckKey(key)) return source;
if (encoding == null) encoding = Encoding.UTF8;
byte[] bKey = encoding.GetBytes(key);
byte[] cryptograph = null; //加密后的密文  
Rijndael Aes = Rijndael.Create();
Aes.Key = bKey;
//开辟一块内存流  
using (MemoryStream Memory = new MemoryStream())
{
//把内存流对象包装成加密流对象  
using (CryptoStream Encryptor = new CryptoStream(Memory, Aes.CreateEncryptor(), CryptoStreamMode.Write))
{
//明文数据写入加密流  
Encryptor.Write(source, , source.Length);
Encryptor.FlushFinalBlock();
cryptograph = Memory.ToArray();
}
}
return cryptograph;
} /// <summary>  
/// AES解密 参数:byte[] 
/// </summary>  
/// <param name="source">源字符字节组</param>
/// <param name="key">密钥</param>
/// <param name="model">运算模式</param>
/// <param name="padding">填充模式</param>
/// <param name="encoding">编码类型</param>
/// <returns>解密后的字符字节组</returns>  
public static byte[] AesDecrypt(byte[] source, string key, CipherMode model = CipherMode.ECB, PaddingMode padding = PaddingMode.PKCS7, Encoding encoding = null)
{
if (source == null) return null;
if (!AesCheckKey(key)) return source;
if (encoding == null) encoding = Encoding.UTF8;
byte[] bKey = encoding.GetBytes(key);
byte[] original = null; //解密后的明文  
Rijndael Aes = Rijndael.Create();
//开辟一块内存流,存储密文  
using (MemoryStream Memory = new MemoryStream(source))
{
//把内存流对象包装成加密流对象  
using (CryptoStream Decryptor = new CryptoStream(Memory, Aes.CreateDecryptor(bKey, null), CryptoStreamMode.Read))
{
//明文存储区  
using (MemoryStream originalMemory = new MemoryStream())
{
byte[] Buffer = new byte[];
int readBytes = ;
while ((readBytes = Decryptor.Read(Buffer, , Buffer.Length)) > )
{
originalMemory.Write(Buffer, , readBytes);
}
original = originalMemory.ToArray();
}
}
}
return original;
}
#endregion /// <summary>
/// 对字符串SHA1加密
/// </summary>
/// <param name="source">源字符串</param>
/// <param name="encoding">编码类型</param>
/// <returns>加密后的十六进制字符串</returns>
public static string Sha1Encrypt(string source, Encoding encoding = null)
{
if (encoding == null) encoding = Encoding.UTF8; // 第一种方式
byte[] byteArray = encoding.GetBytes(source);
using (HashAlgorithm hashAlgorithm = new SHA1CryptoServiceProvider())
{
byteArray = hashAlgorithm.ComputeHash(byteArray);
StringBuilder stringBuilder = new StringBuilder();
foreach (byte item in byteArray)
{
stringBuilder.AppendFormat("{0:x2}", item);
}
hashAlgorithm.Clear();
return stringBuilder.ToString();
} //// 第二种方式
//using (SHA1 sha1 = SHA1.Create())
//{
// byte[] hash = sha1.ComputeHash(encoding.GetBytes(source));
// StringBuilder stringBuilder = new StringBuilder();
// for (int index = 0; index < hash.Length; ++index)
// stringBuilder.Append(hash[index].ToString("x2"));
// sha1.Clear();
// return stringBuilder.ToString();
//}
} /// <summary>
/// 对字符串MD5加密
/// </summary>
/// <param name="source">源字符串</param>
/// <param name="encoding">编码类型</param>
/// <returns>加密后的十六进制字符串</returns>
public static string Md5Encrypt(string source, Encoding encoding = null)
{
if (encoding == null) encoding = Encoding.UTF8; byte[] byteArray = encoding.GetBytes(source);
using (HashAlgorithm hashAlgorithm = new MD5CryptoServiceProvider())
{
byteArray = hashAlgorithm.ComputeHash(byteArray);
StringBuilder stringBuilder = new StringBuilder();
foreach (byte item in byteArray)
{
stringBuilder.AppendFormat("{0:x2}", item);
}
hashAlgorithm.Clear();
return stringBuilder.ToString();
}
}

AES加密方式中关于PKCS5Padding与PKCS7Padding的区别

在PKCS5Padding中,明确定义Block的大小是8位,而在PKCS7Padding定义中,对于块的大小是不确定的,可以在1-255之间(块长度超出255的尚待研究),填充值的算法都是一样的:

value=k - (l mod k) ,K=块大小,l=数据长度,如果l=8, 则需要填充额外的8个byte的8

在.net中,例如TripleDESCryptoServiceProvider ,默认BlockSize=64bits=8bytes,所以在这种情况下在PKCS5Padding=PKCS7Padding。

如果在C#中自己定义了一个不是64bits的加密块大小,同时使用PKCS7Padding,那么在java中使用JDK标准的PKCS5Padding就不能解密了。

NET中各种加密解密方法的更多相关文章

  1. 2019-2-20C#开发中常用加密解密方法解析

    C#开发中常用加密解密方法解析 一.MD5加密算法 我想这是大家都常听过的算法,可能也用的比较多.那么什么是MD5算法呢?MD5全称是 message-digest algorithm 5[|ˈmes ...

  2. C#开发中常用加密解密方法解析

    一.MD5加密算法 我想这是大家都常听过的算法,可能也用的比较多.那么什么是MD5算法呢?MD5全称是message-digest algorithm 5,简单的说就是单向的加密,即是说无法根据密文推 ...

  3. PHP7.2中AES加密解密方法mcrypt_module_open()替换方案 Function mcrypt_get_block_size() is deprecated

    直接粘代码,该类是基于微信公众号消息加密解密所提供的PHP DEMO改造而来,目前使用于彬彬大学APP接口token校验中. php的mcrypt 扩展已经过时了大约10年,并且用起来很复杂.因此它被 ...

  4. C#开发中常用的加密解密方法

    转载自:https://www.cnblogs.com/bj981/p/11203711.html C#开发中常用的加密解密方法 相信很多人在开发过程中经常会遇到需要对一些重要的信息进行加密处理,今天 ...

  5. .Net中的加密解密

    返回博客列表 转 .Net中的加密解密 李朝强 发布时间: 2015/11/23 12:55 阅读: 33 收藏: 3 点赞: 0 评论: 0 在一些比较重要的应用场景中,通过网络传递数据需要进行加密 ...

  6. ASP.NET常用加密解密方法

    ASP.NET常用加密解密方法 一.MD5加密解密 1.加密 C# 代码           public static string ToMd5(string clearString)        ...

  7. ios常见加密解密方法

    在其他平台中经常会计算MD5值,在iOS平台中也提供了该方法,首先需要导入头文件 #import <CommonCrypto/CommonDigest.h> 方法CC_MD5可以获取MD5 ...

  8. C#/IOS/Android通用加密解密方法

    原文:C#/IOS/Android通用加密解密方法 公司在做移动端ios/android,服务器提供接口使用的.net,用到加密解密这一块,也在网上找了一些方法,有些是.net加密了android解密 ...

  9. OpenSSL 中 RSA 加密解密实现源代码分析

    1.RSA 公钥和私钥的组成.以及加密和解密的公式: 2.模指数运算: 先做指数运算,再做模运算.如 5^3 mod 7 = 125 mod 7 = 6 3.RSA加密算法流程: 选择一对不同的.而且 ...

随机推荐

  1. RookeyFrame 删除 线下添加的model

    环境:在model层已经添加了Crm_Cm_ContactInfo2 这个类,这个类现在已经添加到了数据库的,使用之前的方法(在前面的文章有提到该类) 删除步骤: 1.Sys_Module表 的字段 ...

  2. 使用apache 的 ab命令压力测试nginx服务器

    nginx压力测试方法: #ab命令 #安装ab #Centos系统 yum install apr-util #Ubuntu系统 sudo apt-get install apache2-utils ...

  3. 《挑战30天C++入门极限》C++运算符重载函数基础及其值返回状态

        C++运算符重载函数基础及其值返回状态 运算符重载是C++的重要组成部分,它可以让程序更加的简单易懂,简单的运算符使用可以使复杂函数的理解更直观. 对于普通对象来说我们很自然的会频繁使用算数运 ...

  4. Hadoop 机架(集群拓扑)设置

    本文通过MetaWeblog自动发布,原文及更新链接:https://extendswind.top/posts/technical/hadoop_rack_awareness Hadoop会通过集群 ...

  5. P2502 [HAOI2006]旅行——暴力和并查集的完美结合

    P2502 [HAOI2006]旅行 一定要看清题目数据范围再决定用什么算法,我只看着是一个蓝题就想到了记录最短路径+最小生成树,但是我被绕进去了: 看到只有5000的边,我们完全可以枚举最小边和最大 ...

  6. Pytest权威教程22-优质集成实践

    目录 优质集成实践 使用pip安装包 Python测试发现的约定 选择测试布局结构/导入规则 在应用程序代码外测试 测试作为应用程序代码的一部分 tox 返回: Pytest权威教程 优质集成实践 使 ...

  7. PHP无法使用curl_init()函数

    主要针对在Ubuntu16.04搭建CRMEB环境时,监测环境会出现一个curl_init问题,这时只需执行如下命令即可解决: sudo apt-get install php-curl

  8. ubuntu之路——day9.1 深度学习超参数的调优

    参数重要性: 第一阶:α即learning rate 第二阶:momentum中的β,hidden units的数量,mini-batch的大小 第三阶:hidden layers的数量,learni ...

  9. 【json/regex】将简单对象生成的json文进行内部排序后再输出

    有这样一个实体类: package com.hy; public class Emp { private int id; private int age; private String name; p ...

  10. STAR原则

    所谓STAR原则,即Situation(情景).Task(任务).Action(行动)和Result(结果)四个英文单词的首字母组合.STAR原则是结构化面试当中非常重要的一个理论.S指的是situa ...