常见加密算法整理

来源:互联网 发布:阿里云企业邮箱条件 编辑:程序博客网 时间:2024/05/17 04:00
0x1 加密算法分类
0x11 根据加密算法使用的秘钥数量,可以将加密体制分为对称密钥体制(symmetric cipher,单秘钥密码体制,秘密秘钥密码体制,对称秘钥密码体制,常规密码体制)和非对称秘钥体制
(asymmetric cipher,双秘钥密码体制,公开秘钥密码体制,非对称迷药密码体制);对称秘钥体制中某个实体一定同时具备加密和解密能力,DES,AES,IDEA,RC6采用对称秘钥;采用
非对称秘钥体制的用户拥有一对秘钥,公钥和私钥,RSA和ElGamal,椭圆曲线密码都是非对称秘钥密码算法。

在实现上对称秘钥密码体制是基于复杂的非线性变换与迭代运算实现算法安全性,而非对称秘钥密码体制一般是基于某个数学难题而实现安全性的。普遍认为非对称秘钥密码体制的安
全性没有对称秘钥密码体制的安全性高。


0x12 根据对明文信息的处理方式,可以分为分组密码(block cipher)和序列密码(stream cipher)。
分组密码:一次处理一个输入块,并产生一个对应的输出块,一个明文分组被作为一个整体来产生一个等长的密文分组,通常使用的分组时64bytes或者128bytes,DES,AES,IDEA,RC6都
是采用的分组密码
序列密码:一次只处理一个字节或一个bytes,典型的序列密码有RC4,A5,SEAL


0x13 根据是否能进行可逆的加密变换可分为单向函数密码体制和双向密码变换体制。典型的单项密码包括MD4.MD5,SHA-1,用于信息的完整性保护和鉴别


0x14 对称秘钥与飞对称秘钥体制的优缺点:
对称秘钥的加解密处理速度较快,效率较高,安全性也比较高,但是秘钥分发过程复杂,代价高,保密通信系统的开放性差,秘钥管理困难,存在数签名的困难性;非对秘钥体制中加密
算法,解密算法及公钥都是公开的,通信双方可以通过公开渠道获取到对方的公钥,使用公钥对明文加密后发送,接收方使用自己的私钥解密。因此,他的秘钥分发简单,系统秘钥量少,
便于管理,系统开放性好,可以实现数字签名,但与对称秘钥相比,它的加解密运算浮躁,速度较慢,同等的安全强度下它的秘钥位数较多。非对称秘钥密码体制可能存在“可能报文攻击”。


0x2 对称秘钥密码算法
0x21 DES
DES是一种分组长度为64位,秘钥长度为56位,输出密文为64位的具有16轮迭代的分组对称密码算法,DES由初始置换、16轮迭代和初始逆置换组成。由于DES的S-盒设计存在争议,56位的
秘钥过短,存在弱秘钥问题,且代数结构存在互补对称性,导致DES可以在一定的资源环境下被攻破
0x22    3重DES
加密C=Ek3(Dk2(EK1(M))),解密M=Dk1(Ek2(Dk3(C))),特点:将秘钥长度增加到168位,克服DES面临的穷举搜索攻击,但是处理速度较慢,且分组依然是64位,就效率和安全性而言,分组
和秘钥长度不匹配,分组应该更长。
0x23 AES
AES是一种分组长度为128位,支持128、192、256位秘钥长度的的分组对称密码算法。
0x24 IDEA(国际数据加密算法)
IDEA也是分组对称密码算法,IDEA的明文和密文分组都是64位,秘钥长度是128位。
0x25 RC6
RC6也是一种分组对称密码算法


0x3 公钥密码算法
之前的几乎所有的密码系统都是基于代替和换位,公钥密码系统是基于一种特殊的书序额函数,公钥密码体制是非对称的,他有两个秘钥,一个被秘钥拥有者保管,另外一个公开,用两个
秘钥中的任何一个秘钥加密内容后都可以使用对应的另一个秘钥解密。公钥密码体制中由公钥不能导出私钥,公钥和加密算法都是公开的,但由公钥、密文和加密算法不能得到对应的明文
和私钥。
公钥密码体制的设计是基于单陷门函数:
在知道加密秘钥的情况下,对任意明文进行加密变换是容易的,如果知道解密秘钥,对密文继续解密变换也是容易的,但是若果不知道解密秘钥,对密文继续逆变换以得到正确的明文在计
算上是不可行的。
相关应用:
1)机密性的实现
发送方使用接收方的公钥加密消息,接收方用字节的私钥解密
2)数字签名
发送方使用自己的私钥签名消息,接收方通过发送方的公钥来鉴别消息,并且发送方不能对自己的签名进行否认
3)秘钥分发和协商
发送方和接收方基于公钥系统可以在公开信道上实现大规模的秘钥分发和协商


0x31 RSA
RSA是广泛被接受且实现的通用公开秘钥密码算法,其算法是基于大整数分离问题的单陷门函数,由于算法中的某些缺陷,一般不能直接使用RSA继续加密(RSA算法是决定性算法,即对相
同的明文始终会给出相同的密文,此外它具有特殊的代数结构),用RSA加密在很多环境下是不安全的。
0x32 ElGamal
ElGamal的安全性是基于离散对数问题,机密结果具有随机性,因为密文既依赖于明文又依赖u加密过程中选择的随机数,所以,对于同一个明文,会有许多可能的密文,即该算法是非确定
性算法。
0x33 椭圆曲线(ECC)
ECC的安全性基于椭圆曲线离散对数问题的难解性,椭圆曲线离散对数问题公认为比大整数分离和有限域上的离散对数问题难解,且比基于有限域上的离散对数问题的公钥密码体制的秘钥长
度要小,算法性能要好。


0x4 小结
公钥密码算法运行在很大的代数结构之中,计算代价昂贵,相比较而言,对称密码函数一般更加有效,一次一般不用公钥密码系统来加密大量的数据,当需要加密大量数据时,一般采用的
方式是混合体制。在混合体制中一把使用公钥密码系统加密一个用于对称秘钥系统的的短期秘钥,在发送者和接受者之间建立一个共享的临时秘钥,在共享临时秘钥的控制下,采用对称密
码系统对大量数据进行加密。

0x5 散列函数和消息鉴别
密码学中的散列函数有称为hash函数,杂凑函数,它是一种单向密码体制,是一个明文到密文的不可逆映射,只有加密过程,没有解密过程。散列函数式一个可以将任意长度的消息输入压
缩为某一固定长度的消息摘要的函数,输出的消息摘要也称为散列码,该特性使它可以生产文件或其他数据的“数字指纹”,在数字完整性和数字签名领域得到广泛使用。


0X51 散列函数
散列函数h(m)相关特性:
1)h(m)算法公开,不需要秘钥
2)数据压缩功能,任意长度的输入,输出固定
3)对于给定的任意m,h(m)易于计算
4)单向性
5)具有弱抗碰撞性,对于m,寻在m'使h(m)=h(m'),计算不可行
6)具有强抗碰撞性,对于m和m',寻找h(m)=h(m')计算上不可行
散列函数的应用
1)保证数据的完整性
2)单向数据加密
3)数字签名


0x511 SHA安全散列算法
1)SHA-1
SHA-1是数字签名编撰DSS中使用的散列算法,能处理最大长度为2的64次方的输入数据,输出为160位的散列函数值,SHA-1的输出正好适合数字签名算法DSA的输入。SHA-1的处理单位是512
位的数据块,对于不满512的块进行填充。
2)其他SHA算法
SHA-256,SHA-384,SHA-512,消息摘要长度分别为256,384,512位,SHA-1和SHA-256的数据分组时512位,SHA-384,SHA-512的分组长度是1024位。
3)SHA-1,SHA-256,SHA-384,SHA-512的比较
主要区别在于填充方式、字长、初始化常数,基本函数等部分,运算结构大体相似
SHA-1的识别:常量K(5A827999,6ED9EBA1,8F1BBCDCCA62C1D6)
各算法还可以使用初始化值进行鉴别。


0x512 MD5
消息摘要算法,数据填充->添加长度->初始化变量->数据处理(F、G、H、I),需要一张加法常数表T[i],i为1至64之中的值,4个长了作为特征识别:67452301h、EFCDAB89h、EFCDAB89h、98BADCFEh、
10325476h
但实际上,像KANAL这样的加密算法工具不是通过上面的这四个常数来鉴别MD5的,而是通过识别64个常量元素的表T来识别是不是MD5算法的,对于变形的MD5有3中情况:
1)改变初始时用到的4个常量
2)改变填充的方法
3)改变hash变换的处理过程


0X6 其它常见的加密算法
0x61 TEA
TEA算法是由英国剑桥大学计算机实验室的DavidJ.Wheeler和RogerM.Needham提出的一种对称分组密码算法,以加密解密速度快,实现简单著称.它采用扩散和混乱方法,对64位的明文数据块,
用128位密钥分组进行加密,产生64位的密文数据块,其循环轮数可根据加密强度需要设定.加密过程中,加法运算和减法运算用作可逆的操作.算法轮流使用异或运算和加法运算提供非线性特
性,双移位操作使密钥和数据的所有比特重复地混合,最多16轮循环就能使数据或密钥的单个比特的变化扩展到接近32比特.因此,当循环轮数达到16轮以上时,该算法具有很强的抗差分攻击能
力,128比特密钥长度可以抗击穷举搜索攻击,该算法设计者推荐算法迭代次数为32轮.算法本身非常简练,无论采用软件方式还是硬件方式,实现起来都非常容易。
0X62 QQTEA 
QQTEA算法建立在标准 TEA算法的基础上, 使用16轮的加密(这是最低限,推荐应该是32轮)。QQ在使用这个算法的时候,由于需要加密不定长的数据,所以使用了一些常规的填充办法和
交织算法


0x7 数字签名技术
数字签名就是一串数字形式的消息和某个源发实体联系的数据串,把它附加在一个消息或完整加密的消息上,以便消息的接收方能鉴别消息的内容,并证明消息只能源发于声称的发送方。
数字签名在信息安全,包括鉴别,数据完整性,抗抵赖性等方面,特别是大型网络安全通信中的秘钥分配,鉴别及电子商务系统中具有重要作用。
签名方案应满足的条件:
1)签名不可伪造
2)签名不可抵赖
3)签名不可复制
4)签名的消息不可篡改
数字签名方案有两部分组成:带有陷门的数字签名算法和验证算法。数字签名算法是一个由密钥控制的函数,  




加密安全


0x1 算法安全
0x2 密钥安全
0x21 密钥产生
0x22 密钥存储和备份
0x23 密钥终止和销毁
0x24 密钥分发协议
0x25 密钥协商协议




密钥管理


0x1 密钥的分层结构
为方便密钥的管理,可采用密钥的分级策略,将密钥分为初级密钥、密钥加密密钥,主密钥。
0x11 初级密钥
又称为数据加密密钥,包含会话密钥和文件密钥。会话密钥的生命周期一般比较短,在会话销毁时一般密钥就将被立即消除,文件密钥的生命周期相对较长,一般和文件的生命
周期相同。
0x12 密钥加密密钥
又称二级密钥,位于主密钥与初级密钥之间,用来保护初级密钥。
0x13 主密钥
密钥层次结构中的最高级密钥,用于保护二级密钥。


0x2 密钥的存储和备份
0x21 主密钥的存储
主密钥的安全性要求最高,生存周期最长,需要采用最安全的存储方式,由于主密钥是最高层的密钥,一次它是以明文形式存储的(当然也可以设计一组变换函数和对应的逆变换函数,
对密钥进行变换后存储,使用时进行相应的逆变换),一次要求存储器不到物理上是安全的,逻辑上也应该是安全的,因此一般将主密钥存储到专用的密码装置中。
0x22 密钥加密密钥的存储
可以以明文方式采用与主密钥相同的存储方式,也可以使用主密钥加密后存储,一般建议使用后者的处理方式,以减少明文形式的密钥数量,方便密钥的管理。
0x23 初级密钥的存储
会话密钥保存在工作存储器中,文件密钥使用密钥加密密钥加密后保存,一般为防止文件密钥被损坏带来的损失,会对文件密钥进行备份


QQ密钥管理
QQ通讯一直使用相同的加密算法TEA(分组对称密码算法,密码为128位,分组为64位,对应的密文分组长度为64位),但是密钥协商协议却变换比较频繁。标准的TEA算法建议使用64轮的
迭代,最好不要低于32轮,但是TX应该是为了加速,所以只使用了16轮的迭代。反正也无所谓,QQ聊天记录呀什么的如果攻击者真想破解总是能的,知识成本和时间的问题,加一下密,不
至于说明文传输,使用wireshark抓下来直接就可以看,加密就达到目标了。

QQ2011的会话密钥协商
1)利用QQ密码,经过某种密钥生成算法,生成TEA的解密密钥,使用该密钥解密服务端发送来的LoginVerify报文,机密后得到一个新的密码,这里取名为“verify_key”,
2)服务器对客户端Login Verify报文的响应,这个报文需要verify_key作为密钥进行解密,得出一个新的密钥-verify_reply_key(客户端生成的),
3)客户端接收到服务器的Login Verify Reply报文后,会使用verify_reply_key加密数据发送到服务器,而这里面又包含了一个key – get_info_key 
4)客户端使用get_info_key解密该报文,得到会话KEY – session key。使用会话密钥进行通讯。


QQ2012本地聊天记录MGS2.0.db解密
本地聊天记录采用的是TEA的加密算法,整个解密过程最核心的还是MGS数据段解密时,TEA算法的KEY,在聊天记录解密时KEY作为解密函数的参数,可以直接从内存中获得,而这个KEY则是
在登陆QQ时,由服务器返回的,具体位置在QQ登陆时,密码验证正确以后,服务器会返回命令号为0828的报文,报文解密后,即可看到解密聊天记录所使用的KEY了


passwd(client)-> TEA_key(client) -> verify_key(sever) -> verify_reply_key(client) -> get_info_key(server) -> session_key(server)


关于TEA_key秘钥的生成算法
老版本的QQ:MD5(MD5(QQ_PWD)),改进:加入salt(qq号),MD5(MD5(QQ_PWD + QQ_NUM))


PC版QQ
QQ中本地文件加密和通讯数据加密主要使用了TEA算法,可能某些本地文件的加密还使用了DES,在最新版本的QQ中,本地聊天记录等文件的解密秘钥是服务端传来的,由于没分析过QQ通讯
协议,只是看了别人的分析报告,据说qq2012在登录成功后,服务端会返回一个command为0828的报文,解密后里面就是查看聊天记录的密钥,即密钥没有保存在本地,是动态从服务端获取
的,因此安全性还算是比较高的。

QQ好友列表




SQLCipher是一个开源的库,它使用256位的AES算法来加密sqlite数据库,


PC版和手机版的区别还是蛮大的,主要是手机上各种资源的限制,加解密需要多考虑性能问题。




手机QQ
QQ也使用了sqlite,但是没有使用SQLCiher来加密,没找到相关的API(如SQLiteDatabase.loadLibs(this),SQLiteDatabase.openOrCreateDatabase),PC版的是使用TEA加密的,

微信
微信聊天记录
好友列表
微信的聊天记录等存储在本地的sqlite数据库中,使用SQLCipher进行加密


QQ浏览器
本地文件加密算法使用的DES,好像没有使用TEA


QZone
使用sqlite,但是没有使用sqlcipher,使用了TEA,DES,