常见加密算法简析

  • 格式: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);