常见的加密算法总结
前段时间对常见加密算法进行了整理,是个菜鸟,自己整理记录下。
对称加密
对称加密用同一个密钥对明文进行加解密,常见的有DES,3DES,AES等
一、DES算法
数据分组(64位)用秘钥(64位,其中56位有效,8位校验)行加密;
1,根据用户输入取得一个64位秘钥,然后进行等分、移位、选取和迭代形成一套16个加密秘钥,分别提供每轮运算使用;
2,对64位明文分组M进行操作,M经过初期置换IP,置换为m0,将m0分为左右各32位长,并进行16轮相同的运算(迭代),每轮运算都和相应的秘钥结合;
3,在每一轮中,密码位移位,从秘钥的56位中选出48位,通过一个扩展置换将数据右半边扩展成48位,并通过异或操作替代成新的48位,压缩至32位,并通过一个异或与左半边结合,其结果为右半边,原来的右半边称为左半边,该操作执行16次;
4,经过16轮迭代,左右部分合在一起进行一个末置换(数据整理),完成加密过程; 5,解密算法适用同样此算法。
优点:
算法公开、计算量小、加密速度快、效率高;
缺点:
1,如果双方都持有秘钥,安全无法保证;
2,秘钥安全保护成本高,管理困难;
3,可能被暴力破解
3,安全性低
适用场景:
普通数据加密
二、 3DES算法
3DES算法实际上就是对DES使用三个不同密钥加密三次的算法,是DES到AES算法的过渡算法。
优点:
1.破解难度大
2.安全型较高
缺点:
一样有密钥管理的问题
适用场景:
普通数据加密
三. AES算法
基于排列置换,采用分组密码体制,取代了原来的DES算法。
优点:
1,分组模式选择多,加密安全;
缺点:
2,同DES类似,密码管理都是问题;
应用场景:
普通数据加密
AES PHP实际应用的demo
<?php
class Aes
{
public $key = '';
public $iv = '';
public function __construct($config)
{
foreach($config as $k => $v){
$this->$k = $v;
}
}
//加密
public function aesEn($data){
return base64_encode(openssl_encrypt($data, $this->method,$this->key, OPENSSL_RAW_DATA , $this->iv));
}
//解密
public function aesDe($data){
return openssl_decrypt(base64_decode($data), $this->method, $this->key, OPENSSL_RAW_DATA, $this->iv);
}
}
$config = [
'key' => 'reter4446fdfgdfgdfg', //加密key
'iv' => md5(time(). uniqid(),true), //保证偏移量为16位
'method' => 'AES-128-CBC' //加密方式 # AES-256-CBC等
];
$obj = new Aes($config);
$res = $obj->aesEn('aaaddee44');//加密数据
echo $res;
echo '<hr>';
echo $obj->aesDe($res);//解密
AES加解密速度对比
-
AES加密的时间与被加密文件的大小正线性增长,加密1G的文件大概需要4分多钟,加密速度还是很快的
-
加密后的文件大小是原始文件大小的两倍
-
解密文件所需时间是加密时间的两倍(这个应该是加密文件是原始文件大小两倍造成的)
非对称加密
加密算法,对数据进行加解密,可逆,加密和解密用不同的密钥,常见的有RSA算法
一、RSA算法
密钥长度决定了其复杂度;欧拉函数的原理,
简单原理:
公钥加密私钥解密,私钥做签名公钥公钥解密验证;
优点:
破解难度大。
缺点:
产生密钥麻烦,分组长度太大
简单原理:
公钥加密私钥解密,私钥做签名公钥公钥解密验证;
优点:
破解难度大。
缺点:
产生密钥麻烦,分组长度太大
加密通式:
解密通式:
加解密速度对比
1.加密后的文件与原始文件的大小基本相同;
2.加密时,随着文件越来越大,RSA 算法的加密时间增加并不明显(与解密时间比);
3.解密时,随着文件越来越大,RSA 算法的解密时间与解密文件的大小呈现线性增长趋势;
4.解密的效率远低于加密效率,按照表里的时间估算,加密1G的文件需要1分钟,但是解密却需要65小时。
- 总结:
非对称加密建立通讯,对称加密用于信息传输
单向散列函数的加密算法
属于哈希算法,计算数字摘要,不可逆,有碰撞
- 一. MD5
MD5是输入不定长度信息,输出固定长度128-bits的算法。经过程序流程,生成四个32位数据,最后联合起来成为一个128-bits散列。基本方式为,求余、取余、调整长度、与链接变量进行循环运算。
一些黑客破获这种密码的方法是一种被称为“跑字典”的方法。有两种方法得到字典,一种是日常搜集的用做密码的字符串表,另一种是用排列组合方法生成的,先用MD5程序计算出这些字典项的MD5值,然后再用目标的MD5值在这个字典中检索。
MD5曾被用于文件校验,SSH等,但是在2004年,证实MD5算法无法防止碰撞攻击,因此不适用于安全性认证。
2009年,中国科学院的谢涛和冯登国仅用了220.96的碰撞算法复杂度,破解了MD5的碰撞抵抗,该攻击在普通计算机上运行只需要数秒钟。
为什么还在使用MD5?
首先必须明确的是MD5并没有破解MD5,只是找到了快速产生碰撞的方法,就是说给出一个hash,攻击者可以(在合理的时间内)(有效地)找到一个数据使得其hash等于给定的hash。但是因为哈希函数是不可逆的,所以要得到原始信息是比较困难的。利用散列函数的雪崩效应(就算微小的原始信息变化,加密后的值也会大不相同的特性。)对原始密码加盐值,即使通过彩虹表等寻找到密码明文,不知道盐值的话也就不知道原始字段,使得获得真实密码的概率大大降低。
加密过程
填充过程的n%512==448,这里的求余过程是必须进行的,如果刚好能被求余得448,也要加上512位,变为n+1%512==448
使用场景
1.登录密码保护
2.文件防止篡改
3.HTTP传输内容加密防篡改
4.数字签名(不安全)
优点:
简单、伪造难
缺点:
潜在的冲突
二、SHA散列算法
安全散列算法(英语:Secure Hash Algorithm,缩写为SHA)是一个密码散列函数家族,是FIPS所认证的安全散列算法。能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法.
正式名称为 SHA 的家族第一个成员发布于 1993年。然而人们给它取了一个非正式的名称 SHA-0 以避免与它的后继者混淆。两年之后, SHA-1,第一个 SHA 的后继者发布了。 另外还有四种变体,曾经发布以提升输出的范围和变更一些细微设计: SHA-224, SHA-256, SHA-384 和 SHA-512 (这些有时候也被称做 SHA-2):
破解
SHA0
2004年8月17日,在CRYPTO 2004的Rump会议上,王小云,冯登国、来学嘉,和于红波宣布了攻击MD5、SHA-0 和其他杂凑函数的初步结果。他们攻击SHA-0的计算复杂度是2的40次方,这意味着他们的攻击成果比Joux还有其他人所做的更好。请参见MD5 安全性。2005年二月,王小云和殷益群、于红波再度发表了对SHA-0破密的算法,可在2的39次方的计算复杂度内就找到碰撞。
SHA1
SHA-1已经不再视为可抵御有充足资金、充足计算资源的攻击者。2005年,密码分析人员发现了对SHA-1的有效攻击方法,这表明该算法可能不够安全,不能继续使用,自2010年以来,许多组织建议用SHA-2或SHA-3来替换SHA-1。Microsoft、Google以及Mozilla都宣布,它们旗下的浏览器将在2017年前停止接受使用SHA-1算法签名的SSL证书。2017年2月23日,CWI Amsterdam与Google宣布了一个成功的SHA-1碰撞攻击,发布了两份内容不同但SHA-1散列值相同的PDF文件作为概念证明。
使用场景:
1.数字签名
2.数据完整性
3.比特币,区块链
散列对比图文总结
SHA-1算法和MD5算法都是由MD4算法导出,所以这俩是近亲。
MD5、SHA-1、SHA-256比较
速度:MD5>SHA-1>SHA-256
安全性:MD5<SHA-1<<SHA-256
总结:
即使SHA-256不存在后门,它也会有被攻破的时刻。只是,时间长短的问题。正如前面说的,加密与解密就是矛与盾的关系。它们共同进步,也共同提高。