常见加密算法简析
- 格式:pdf
- 大小:181.58 KB
- 文档页数:6
常见加密算法简析
1、对称加密算法(AES、DES、3DES)
对称加密算法是指加密和解密采⽤相同的密钥,是可逆的(即可解密)。
AES加密算法是密码学中的⾼级加密标准,采⽤的是对称分组密码体制,密钥长度的最少⽀持为128。AES加密算法是美国联邦政府采⽤的
区块加密标准,这个标准⽤来替代原先的DES,已经被多⽅分析且⼴为全世界使⽤。
AES数学原理详解:
优点:加密速度快
缺点:密钥的传递和保存是⼀个问题,参与加密和解密的双⽅使⽤的密钥是⼀样的,这样密钥就很容易泄露。
2、⾮对称加密算法(RSA、DSA、ECC)
⾮对称加密算法是指加密和解密采⽤不同的密钥(公钥和私钥),因此⾮对称加密也叫公钥加密,是可逆的(即可解密)。公钥密码体制根
据其所依据的难题⼀般分为三类:⼤素数分解问题类、问题类、椭圆曲线类。
RSA加密算法是基于⼀个⼗分简单的数论事实:将两个⼤素数相乘⼗分容易,但是想要对其乘积进⾏因式分解极其困难,因此可以将乘积公
开作为加密密钥。虽然RSA的安全性⼀直未能得到理论上的证明,但它经历了各种攻击⾄今未被完全攻破。
优点:加密和解密的密钥不⼀致,公钥是可以公开的,只需保证私钥不被泄露即可,这样就密钥的传递变的简单很多,从⽽降低了被破解的
⼏率。
缺点:加密速度慢
RSA加密算法既可以⽤来做数据加密,也可以⽤来数字签名。
--数据加密过程:发送者⽤公钥加密,接收者⽤私钥解密(只有拥有私钥的接收者才能解读加密的内容)
--数字签名过程:甲⽅⽤私钥加密,⼄⽅⽤公钥解密(⼄⽅解密成功说明就是甲⽅加的密,甲⽅就不可以抵赖)
详细数学原理见
ECC加密算法是基于椭圆曲线上计算问题()的算法。ECC算法的数学理论⾮常深奥和复杂,在⼯程应⽤中⽐较难于实现,但它的单位安全
强度相对较⾼。
⽤国际上公认的对于ECC算法最有效的攻击⽅法--Pollard rho⽅法去破译和攻击ECC算法,它的破译或求解难度基本上是指数级的。正是由
于和算法这⼀明显不同,使得ECC算法的单位安全强度⾼于RSA算法,也就是说,要达到同样的安全强度,ECC算法所需的长度远⽐RSA
算法低。有研究表⽰160位的椭圆密钥与1024位的RSA密钥安全性相同。在私钥的加密解密速度上,ECC算法⽐RSA、DSA速度更快。存
储空间占⽤更⼩。
扩展阅读:
3、线性散列算法算法(MD5、SHA1、HMAC)
MD5全称是Message-Digest Algorithm 5(信息摘要算法5),单向的算法不可逆(被MD5加密的数据不能被解密)。MD5加密后的数据长
度要⽐加密数据⼩的多,且长度固定,且加密后的串是唯⼀的。
适⽤场景:常⽤在不可还原的密码存储、信息完整性校验等。
信息完整性校验:典型的应⽤是对⼀段信息产⽣信息摘要,以防⽌被篡改。如果再有⼀个第三⽅的认证机构,⽤MD5还可以防⽌⽂件作者
的“抵赖”,这就是所谓的数字签名应⽤。
SHA-1 与 MD5 的⽐较
SHA-1摘要⽐MD5摘要长32 位,所以SHA-1对强⾏攻击有更⼤的强度,⽐MD5更安全。使⽤强⾏技术,产⽣任何⼀个使其摘要等于给定报
摘要的难度对MD5是2^128数量级的操作,⽽对SHA-1则是2^160数量级的操作。
在相同的硬件上,SHA-1 的运⾏速度⽐ MD5 慢。
4、混合加密
由于以上加密算法都有各⾃的缺点(RSA加密速度慢、AES密钥存储问题、MD5加密不可逆),因此实际应⽤时常将⼏种加密算法混合使
⽤。
例如:RSA+AES:采⽤RSA加密AES的密钥,采⽤AES对数据进⾏加密,这样集成了两种加密算法的优点,既保证了数据加密的速度,⼜实现了安全⽅便的密
钥管理。
那么,采⽤多少位的密钥合适呢?⼀般来讲密钥长度越长,安全性越⾼,但是加密速度越慢。所以密钥长度也要合理的选择,⼀般RSA建议
采⽤1024位的数字,AES建议采⽤128位即可。
5、Base64
严格意义讲,Base64并不能算是⼀种加密算法,⽽是⼀种编码格式,是⽹络上最常见的⽤于传输8bid字节代码的编码⽅式之⼀。
Base64编码可⽤于在HTTP环境下传递较长的标识信息,Base编码不仅不仅⽐较简单,同时也据有不可读性(编码的数据不会被⾁眼直接
看到)。
C#实现:
using System;
using System.Text;
using System.Security.Cryptography;
using System.IO;
namespace EnDeCode1
{
///
/// 加密解密⼯具类
/// 作者博客:https://www.cnblogs.com/tuyile006/
///
public class EncodeHelper
{
#region MD5
///
/// MD5哈希加密
///
/// 原始string数据
/// 加密后的数据
public static string MD5(string scr)
{
MD5 md5 = new MD5CryptoServiceProvider();
byte[] palindata = Encoding.Default.GetBytes(scr);//将要加密的字符串转换为字节数组
byte[] encryptdata = md5.ComputeHash(palindata);//将字符串加密后也转换为字符数组
return Convert.ToBase64String(encryptdata);//将加密后的字节数组转换为加密字符串
}
#endregion
#region SHA1
///
/// SHA1哈希加密
///
/// 原始string数据
/// 加密后的数据
public static string SHA1(string scr)
{
SHA1 sha1 = new SHA1CryptoServiceProvider();
byte[] palindata = Encoding.Default.GetBytes(scr);//将要加密的字符串转换为字节数组
byte[] encryptdata = sha1.ComputeHash(palindata);//将字符串加密后也转换为字符数组
return Convert.ToBase64String(encryptdata);//将加密后的字节数组转换为加密字符串
}
#endregion
#region RSA
///
/// RSA加密
///
/// 原始string数据
///
public static string RSA(string scr)
{
CspParameters csp = new CspParameters(); //密钥容器知识参见https://docs.microsoft.com/zh-cn/dotnet/standard/security/how-to-store-asymmetric-keys-in-a-k
ey-container
//在Web中配置参见https://docs.microsoft.com/zh-cn/previous-versions/aspnet/yxw286t2%28v%3dvs.100%29
csp.KeyContainerName = "tuyile006.cnblogs.com";//密匙容器的名称,保持加密解密⼀致才能解密成功
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(csp))
{
byte[] plaindata = Encoding.Default.GetBytes(scr);//将要加密的字符串转换为字节数组
byte[] encryptdata = rsa.Encrypt(plaindata, false);//将加密后的字节数据转换为新的加密字节数组
return Convert.ToBase64String(encryptdata);//将加密后的字节数组转换为字符串
}
}
/// /// RSA解密
///
/// 密⽂
///
public static string RSADecrypt(string scr)
{
try
{
CspParameters csp = new CspParameters();
csp.KeyContainerName = "tuyile006.cnblogs.com";//密匙容器的名称,保持加密解密⼀致才能解密成功
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(csp))
{
byte[] bytes = Convert.FromBase64String(scr); //加密时⽤了Base64,则解密时对应的也要⽤Base64解码
byte[] DecryptBytes = rsa.Decrypt(bytes, false);
return Encoding.Default.GetString(DecryptBytes);
}
}
catch (Exception)
{
return string.Empty;
}
}
///
/// 返回RSA公匙
///
///
public static string GetRSAPublicKey()
{
CspParameters csp = new CspParameters();
csp.KeyContainerName = "tuyile006.cnblogs.com";//密匙容器的名称,保持加密解密⼀致才能解密成功
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(csp))
{
return rsa.ToXmlString(false);
}
}
#endregion
#region DES
const string DesIV_64 = "xiaoy><@";//定义默认加密密钥 8个字节
///
/// 按指定键值进⾏DES加密
///
/// 要加密字符
/// ⾃定义键值 ASCII编码 必须⼤于或等于8个字符
///
public static string DES(string strContent, string strKey)
{
if (string.IsNullOrEmpty(strContent)) return string.Empty;
if (strKey.Length > 8) strKey = strKey.Substring(0, 8);
DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();
byte[] byKey = Encoding.ASCII.GetBytes(strKey);
byte[] byIV = Encoding.ASCII.GetBytes(DesIV_64);