前言
1.总感觉不去分析加密算法流程而直接判断加密算法有点不可靠,所以这篇打算结合加密算法和反汇编代码分析
2.加密算法种类繁多,暂时打算只针对每种加密模式分析一种加密算法,233
对称加密算法
对称加密算法特征
对称加密算法的加密密钥和解密密钥完全相同,其安全性主要依赖于两个因素:
1.加密算法足够强,基于密文本身去解密信息不可能,至少在有限时间内不可能
2.加密的安全性依赖于密钥的秘密性,而不是算法的保密性
和非对称加密算法比较
非对称加密算法(如摘要算法)是不可逆的,目的是对信息的一致性和完整性进行验证
对称加密算法是可逆的,目的是保护隐私信息不被泄露
AES加密算法
算法描述
AES算法根据密钥的长度分为以下三种
AES | 密钥长度(Nk个32位双字) | 分组长度(Nb个32位双字) | 轮数(Nr) |
---|---|---|---|
AES-128 | 4 | 4 | 10 |
AES-192 | 6 | 4 | 12 |
AES-256 | 8 | 4 | 14 |
从安全性来看,AES-256安全性最高
从性能来看,AES-128性能最高
加密流程
加密流程大致为
轮函数又由4部分组成
void SubBytes(); //字节代替
void ShiftRows(); //行移位
void MixColumns(); //列混淆
void AddRoundKey(); //加轮密钥
SubBytes()函数
也就是将输入的密文(处理成16位,相当于一个4x4的矩阵)在一个S-box中进行替换
反汇编代码中跟踪出来的操作如下
可见S-box在004082DC到004083DB处共256字节,这可以作为判断程序是否为AES加密以及编写注册机的参考位置
shiftRows()函数
行移位函数
MixColumns()函数
列混淆函数,可以看作是输入矩阵和一个修补矩阵相乘
AddRoundKey()函数
加轮密钥函数,其操作是将状态中的函数和轮密钥通过简单的异或运算相加,这也是唯一一个需要用到密钥的地方
小小结
虽然看起来每次运算量都很大,但是如果将除最后一轮运算以外的轮次合并,不难发现
总的来说,每一轮运算也只是四次查表和3次异或运算而已
下面进行实列分析
AES反汇编实列分析
首先,先是aes函数的初始化等操作的函数的查看
extern BOOL aes_init(aes *,int,int,char *,char *);
extern void aes_getreg(aes *,char *);
extern mr_unsign32 aes_encrypt(aes *,char *);
extern mr_unsign32 aes_decrypt(aes *,char *);
extern void aes_reset(aes *,int,char *);
extern void aes_end(aes *);
由上面的加密算法分析可知,写出注册机最重要的是
1.通过加密轮次确定加密的函数是哪种AES加密(至于判断是否为AES加密可以通过分析软件或者反汇编代码是否频繁查表替换操作以及对输入密钥是否有长度要求或者对其进行了密钥扩展操作)
2.AES加密使用的是哪种模式
代码
之所以判断call 004012F0处为MD5初始化是因为跟进后可见
在之前文章说过这是判断MD5加密的特征之一
然后由MD5加密的特性可知,会产生一个128位的散列
再由AES_init函数(压栈顺序和对应参数顺序相反),可以跟踪到AES密钥,得到
和原代码szkey数组一致
分析结束
小结
1.AES加密最重要的特征还是它的S-box,反汇编代码中很明显,而且容易定位
2.没有根据代码加密轮数判断属于哪种AES加密是由于需要到处跟进,有点混乱
3.写这种博客工作量还是挺大的233,所以很慢
4.都看到这里了不给个三连吗?0.0