note20200611

notes about chapter 6

6.1 单项散列算法(hash)

不可逆运算。

MD5

原理

  1. 填充

填充消息使得其与448模512同余,即使本身已经满足长度也需要填充,填充方法:首先附加1个1,然后使用0填充。至少填充一位,至多填充512位(即本身已经满足的)。

  1. 添加长度

在上一步的结果后附加63位的消息长度,如果填充前消息长度大于2^64,则只使用其低64位。添加填充位和消息长度后,最终消息正好是512的倍数。

  1. 初始化变量

使用4个变量来计算消息摘要。

A=0x1234567

B=89abcdefh

C=0xhfedcba98

D=0x7654321

  1. 数据处理

  1. 输出

将ABCD的级联作为MD5的输出结果。

样例

输入的name与”www.pediy.com”拼接后md5的值。

校验函数:

1
2
3
.text:0040125C                 push    eax             ; lpString2
.text:0040125D push ecx ; lpString1
.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                                 ; /String2 = "aaa"
004015BE |. 52 push edx ; |String1 = "90E10439F996A975450C"
004015BF |. FF15 00504000 call dword ptr ds:[<&KERNEL32.lstrcmpA>] ; \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
# -*- coding:utf-8 -*-

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算法

小结

  1. 使用peid查算法类型;
  2. 判断算法类型(如使用了哪种初始化条件);
  3. 判断加密模式;

非对称加密算法

基于NP完全问题的加密算法,公钥私钥不同的加密算法。

RSA加密算法

算法原理

  1. 选取两个大素数p,q;
  2. 计算n=p*q;
  3. 由于p,q均为素数,计算n欧拉函数g(n)=(p-1)*(q-1);
  4. 选取e,是的e与g(n)互素;
  5. 求e模(p-1)(q-1)的逆元d,e为公钥,d为私钥;
  6. 加密:c = m^e mod n;解密:m = c^d mod n;

椭圆曲线密码编码

小节

这玩意太烦了,当初上课上的稀里糊涂的,现在看还是很烦。主要每个算法后面都包含很多的信安数学基础知识,以及一些算法(比如festiel网络)都是需要密码学设计的课程学习的。。。