note20200611
发表于更新于
字数总计:1k阅读时长:4分钟 中国
notes about chapter 6
6.1 单项散列算法(hash)
不可逆运算。
MD5
原理
- 填充
填充消息使得其与448模512同余,即使本身已经满足长度也需要填充,填充方法:首先附加1个1,然后使用0填充。至少填充一位,至多填充512位(即本身已经满足的)。
- 添加长度
在上一步的结果后附加63位的消息长度,如果填充前消息长度大于2^64,则只使用其低64位。添加填充位和消息长度后,最终消息正好是512的倍数。
- 初始化变量
使用4个变量来计算消息摘要。
A=0x1234567
B=89abcdefh
C=0xhfedcba98
D=0x7654321
- 数据处理
- 输出
将ABCD的级联作为MD5的输出结果。
样例
输入的name与”www.pediy.com”拼接后md5的值。
校验函数:
1 2 3
| .text:0040125C push eax .text:0040125D push ecx .text:0040125E call ds:lstrcmpA
|
SHA1
标志
标准SHA1初始化标志:
1 2 3 4 5 6 7 8 9 10
| .text:00401011 mov [edx+4], eax .text:00401014 mov [edx], eax .text:00401016 mov dword ptr [edx+8], 67452301h .text:0040101D mov dword ptr [edx+0Ch], 0EFCDAB89h .text:00401024 mov dword ptr [edx+10h], 98BADCFEh .text:0040102B mov dword ptr [edx+14h], 10325476h .text:00401032 mov dword ptr [edx+18h], 0C3D2E1F0h .text:00401039 pop edi .text:0040103A retn .text:0040103A sub_401000 endp
|
样例
比较函数:
1 2 3
| 004015BD |. 51 push ecx 004015BE |. 52 push edx 004015BF |. FF15 00504000 call dword ptr ds:[<&KERNEL32.lstrcmpA>]
|
对称加密算法
RC4算法
原理
RC4生产密钥流(伪随机数),与明文进行异或运算,解密时与密文进行异或运算。密钥流分为两部分:KSA,PRGA。
RC4首先使用KSA完成对大小256字节的数组S的初始化以及替换,在替换时使用密钥。密钥长度为5-16字节,即40-128位,也可以更长,通常不超过256字节。先使用0-255初始化数组s,然后使用密钥进行替换,伪代码如下:
1 2 3 4 5 6
| for i in range(0,256): s[i]=i j=0 for i in range(0,256): j=(j+s[i]+key[i mod keylength]) mod 256 swap(s[i],s[j])
|
数组s完成初始化以后,不再使用输入的密钥。密钥流生成时从s[0]到s[255]。对每个s[i],根据当前的s的值,将s[i]与s中的另一个字节置换。在s[255]完成转换后,操作重复执行,伪代码如下:
1 2 3 4 5 6 7
| i,j=0 while(明文未结束): i=(i+1) mod 256 j=(j+s[i]) mod 256 swap(s[i],s[j]) t=(s[i]+s[j]) mod 256 k=s[t]
|
简单实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
|
S=[] key="abcdef" keylength=len(key) child_key=[] plaintext="hello who are you" ciphertext=[]
def KSA(): for i in range(256): S.append(i)
j=0 for i in range(256): j=(j+S[i]+ord(key[i%keylength]))%256 S[j],S[i]=S[i],S[j]
def PRGA(): i=0 j=0 for m in plaintext: i=(i+1)%256 j=(j+S[i])%256 S[i],S[j]=S[j],S[i] t=(S[i]+S[j])%256 k=S[t] child_key.append(k)
def encrypt(): print("加密:",end="") for (m,n) in zip(plaintext,child_key): ciphertext.append(ord(m)^n) for i in ciphertext: print(i,end=",") print()
def decrypt(): print("解密:",end="") for (m,n) in zip(ciphertext,child_key): print(chr(m^n),end="") print()
KSA() PRGA() print("子密钥流:",child_key) encrypt() decrypt()
|
TEA算法
IDEA算法
小结
- 使用peid查算法类型;
- 判断算法类型(如使用了哪种初始化条件);
- 判断加密模式;
非对称加密算法
基于NP完全问题的加密算法,公钥私钥不同的加密算法。
RSA加密算法
算法原理
- 选取两个大素数p,q;
- 计算n=p*q;
- 由于p,q均为素数,计算n欧拉函数g(n)=(p-1)*(q-1);
- 选取e,是的e与g(n)互素;
- 求e模(p-1)(q-1)的逆元d,e为公钥,d为私钥;
- 加密:c = m^e mod n;解密:m = c^d mod n;
椭圆曲线密码编码
小节
这玩意太烦了,当初上课上的稀里糊涂的,现在看还是很烦。主要每个算法后面都包含很多的信安数学基础知识,以及一些算法(比如festiel网络)都是需要密码学设计的课程学习的。。。