Skip to content

Commit e6c483b

Browse files
authoredSep 8, 2020
Add files via upload
1 parent afc2105 commit e6c483b

File tree

1 file changed

+249
-0
lines changed

1 file changed

+249
-0
lines changed
 
+249
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,249 @@
1+
enigma:加密和解密过程
2+
plugboard(10组字母互换位置)->三个齿轮(外部设置message key,内部固定ring setting,计算delta,进入加delta,出去-delta)-> 反射板 -> 反向经过三个齿轮(同样加入delta计算)-> plugboard
3+
齿轮转动:每次按键先转动齿轮再输入,double step:当中间的齿轮在临转点的时候,无论第一个齿轮怎么转,第二个齿轮都会转
4+
5+
md5:填充算法,init,update,final是做什么的
6+
按照每块64字节计算,如果块大小<56 则在末尾补上0x80,0x00...共56-n个字节
7+
当n在[56,63]则在末尾补充64-n+56个字节,最后在后面补上8个字节记录message的不包括填充的总共位数
8+
typedef struct _MD5_CTX {
9+
unsigned long state[4]; /* 128位摘要 */
10+
unsigned long count[2]; /* 已处理的报文的二进制位数,最大值=2^64-1 */
11+
unsigned char data[64]; /* 64字节message块 */
12+
}
13+
init:count 归零,state设置初始值
14+
update:增加count值即报文位数,分块(64字节)计算并更新到state,多余的存在data里等待之后的填充
15+
final:为最后一块填充若小于56字节则补充道56,若大于补充完当前块并补充道下一个56字节,最后增加8字节报文长度
16+
17+
sha:填充算法,位数
18+
sha-1散列算法计算出来的hash值达160位,即20字节,比md5多了32位。
19+
sha-1也是分块计算,每块也是64字节,当最后一块不足64字节也按照md5的方式进行填充。
20+
数据块的最后一定要补上表示报文总共位数的8个字节。
21+
22+
rc4:
23+
24+
ecb:电子密码簿
25+
先对明文分组[p1,p2,....,pn],有一个统一的密钥key
26+
cj = Ek(pj)
27+
pj = Ek(cj)
28+
加密解密可并行,但同样内容的明文,密文一样
29+
30+
cbc:密文块连接模式
31+
还是先分组[p1,p2,....,pn]和一个初识向量c0,和密钥k
32+
cj = Ek(pj 亦或 cj-1)
33+
pj = Ek(cj) 亦或cj-1
34+
加密串行,解密并行
35+
36+
cfb:同上,密文偷窃
37+
分组[p1,p2,....,pn]每组8位,初始随机种子x1,和密钥k
38+
加密:cj = pj 亦或 L8(Ek(xj))
39+
xj+1 = R56(xj) || cj
40+
解密:pj = cj 亦或 L8(Ek(xj))
41+
xj+1 = R56(xj) || cj
42+
密文传输错误可恢复,因为每次亦或的串是上一次密文接到最后,因此即便有一个密文是错的,几轮迭代下来错误的密文会倍左移出去
43+
44+
密文偷窃:
45+
ecb:
46+
不一定要填充,它通过更改消息的最后两个块的处理来实现这一点。 除了最后两个块之外,所有块的处理都保持不变,
47+
但是倒数第二个块的密文的一部分被"窃取 "了,用来填充最后一个明文块。 填充的最后一块,然后像往常一样加密。
48+
cbc:
49+
要先填充
50+
51+
52+
des:流程,s_box(6位输入,4位输出过程),位的打乱,16轮循环做了什么事情
53+
是分块的每块64字节,des是处理某一个块的算法
54+
密钥部分:
55+
(1)通过key_perm_table将每个字节的最右位丢弃并打乱得到56bit
56+
(2)分成个左右各28bit两部分各循环左移,左移的位数由16轮循环轮次index来在key_rol_steps[16]确定左移位数
57+
(3)再将两部分合起来通过key_56bit_to_48bit_table[48]丢弃8位并打乱得到48位subkey,一开始set key的时候就吧16个subkey就计算好保存
58+
59+
数据部分:
60+
(1)64位明文要先通过ip[64]打乱,然后分成左右各32位,Lj-1和Rj-1,将Rj-1通过plaintext_32bit_expanded_to_48bit_table[48]拓展到48位
61+
(上述的ip和fp可以用高阶表来运作,其原理就是枚举所有的可能ip_perm[16][16][8]分成16组每组4bit共16种变化最后都输出8字节然后所有的组或起来)
62+
(2)Rj-1和当前轮次的subky亦或
63+
(3)通过sbox[8][64],sbox就是将48位分成8组6bit然后最左和最有两位组成sbox行号,中间4位组成sbox列号,进入sbox得到4位最后组合成32位,再用sbox_perm_table[32]打乱
64+
(4)最后和Lj-1亦或,Rj = 亦或的结果,Lj = Rj-1,得到密文64位
65+
66+
三重DES
67+
c = E(D(E(p,k1),k2),k3);
68+
p = D(E(D(c,k3),k2),k1);
69+
70+
aes:每一轮循环做了什么事情,几个步骤sbox。shiftrow,mixcolumn,农夫算法,乘法求逆(扩展欧几里得)
71+
有三种密钥:16字节,24字节,32字节。明文和密文都是16字节
72+
unsigned char a[4] = {0x03,0x01,0x01,0x02};
73+
a^-1 = {0x0b,0x0d,0x09,0x0e}
74+
AddRoundKey(p,k); //将明文p中16字节与k中16字节逐字节异或
75+
for(int i=1;i<=10;i++){
76+
ByteSub(p,16); //p[i] = sbox[p[i]] ,这里sbox每个元素的值各不相同 sbox[256]
77+
MixColumnInverse(p,a,0);
78+
ShiftRow(p);// 对p所指向的4*4矩阵做逐行循环左移操作,第0行: 不移动,第1行: 左移1字节,第2行: 左移2字节,第3行: 左移3字节
79+
if(i!=10) MixColumn(p,a,1);
80+
else MixColumn(p,a,0); //don't mul
81+
AddRoundKey(p,k+i*(4*4));
82+
}
83+
农夫算法x * y mod 0x11B:初始p=0,循环8次,x左移,y右移,如果y右移出一个1则p ^= x, 若x左移出一个1,则x ^= 0x11b。(同理mod 0x101 则x ^= 0x101)
84+
MixColumn(p,a,1):对p指向的数组按照一列一列排下来变成2维矩阵,把a变成 2311\1231\1123\3112 矩阵 然后对每一列左乘a做mod x^4+1乘法(乘法是mod 11b 加法是亦或)
85+
然后把每一列的结果再一行一行组成1维数组
86+
aes set key
87+
88+
rsa:证明,代码里用到的函数,openssl大数运算常用函数(加法乘法,求逆等)
89+
算法流程:
90+
1、随机选取两个不等大素数p、q
91+
2、计算n=pq
92+
3、选择一个素数e使他和(p-1)(q-1)互素
93+
4、计算e在模(p-1)(q-1)的逆元d
94+
5、(e,n)为公钥,(d,n)为私钥
95+
6、加密:c=m^e mod n,解密:m = c^d mod n
96+
97+
加密:A用B公钥加密,B用B私钥解密
98+
数字签名:先用md5计算报文摘要再用A私钥加密摘要,作为签名。B获得摘要和报文用A公钥解密签名再计算报文md5进行比对
99+
签名为什么要对m进行操作而不是对L本身进行操作,m永远是128位,而L长度很长,加密以及运输速度会有影响
100+
101+
SA作注册码
102+
(1)软件打开时显示一个机器码
103+
104+
其中机器码m'=rsa(mac, 公钥)
105+
106+
(2)软件作者: mac=rsa(m', 私钥)
107+
108+
注册码sn=(mac, 私钥)
109+
110+
(3)软件验证注册码:rsa(sn, 公钥)==mac
111+
112+
ecc:点乘法,n倍的g=0,群循环?上课的例子,加密解密源代码,签名的算法
113+
椭圆曲线在素域Z_p中的运算
114+
- 一般的线与椭圆曲线有3个交点,设为P,Q,R,有 P+Q+R = 0,P+Q=过R作平行y轴的直线与椭圆曲线交点R'
115+
- 相切的直线 P,Q两点,切于Q P+Q+Q = 0
116+
- P,Q与y轴平行: P+Q = 0
117+
- 单P与y轴平行:P+P = 0
118+
- 运算规则:
119+
- P+0=0+P = P
120+
- P = (x1,y1),Q=(x2,y2)如果有x1 = x2且y1 = y2 = 0 或x1 = x2且y1= -y2 !=0 则有P+Q = 0
121+
- 一般情况下,运算规则如下, P = (x1,y1), Q = (x2,y2),P+Q = (x3,y3)有
122+
$x_3 = k^2 - x1 - x2$
123+
$y_3 = k(x_1-x_3) - y_1$
124+
其中
125+
k = (y_2-y_1)/(x_2-x_1) \ \ \ \ P\neq Q$
126+
k = (3x_1^2+a)/(2y_1)\ \ \ \ P=Q$
127+
128+
加密:m为明文,选取椭圆曲线,基点和一个d<n(G的阶)
129+
公钥:R = dG,(R,G), 私钥:(d, G)
130+
r = (k*G) k为一个小于n的随机数
131+
s = m*(k*R) mod n
132+
密文就是r,s
133+
解密:m = s/(dr) = m*(k*R) / d*(k*G) = m*(k*d*G) / d*(k*G) = m
134+
135+
ecdsa
136+
签名:r = k*G k是随机数
137+
s = (m+r*d)/k m是明文或者hash,d是私钥
138+
验证:(m/s)*G + (r/s)*R == r 证明过程就是带入
139+
ecnr
140+
签名:r = k*G+m
141+
s = k-r*d
142+
验证:r - (s*G+r*R) == m, 证明就是带入
143+
144+
证明题:
145+
1、rsa证明:
146+
设m是明文,c是密文,c=m^e mod n,现证明m=c^d mod n
147+
因为fai(n) = fai(p*q) = fai(p) * fai(q) = (p-1)(q-1)
148+
因为ed=1 mod (p-1)(q-1)
149+
所以一定可以找到一个k使得ed = 1 + k(p-1)(q-1)成立
150+
于是c^d = m^ed = m^(1+k(q-1)(p-1)) = m * m^k(q-1)(p-1) = m * m^(fai(n))k = m * 1^k mod n
151+
152+
上面证明的前提是gcd(m,n)=1 当gcd(m,n) != 1时,则一定有gcd(m,n) = p或gcd(m,n)=q。先假设gcd(m,n) = p,则m与q一定互素,
153+
于是有
154+
m^fai(q) = 1 mod q --> m^(q-1) = 1 mod q --> m^k(q-1)(p-1) = 1 mod q
155+
--> m^k*fai(n) = 1 mod q --> m^k*fai(n) = qs + 1 --> m * m^k*fai(n) = mqs + m -->
156+
m^(fai(n)*k+1) = cpqs + m --> m^(fai(n)*k+1) = m mod n --> m^ed = m mod n
157+
158+
2、欧拉准则
159+
若方程有解y属于Zp,则x是模p的平方剩余:y^2 = x mod p
160+
设p>2是一个素数,x是一个整数,gcd(x,p)=1,则x是模p的平方剩余的充要条件是:
161+
x^((p-1)/2) = 1 (mod p)
162+
(1)必要性
163+
因为y^2 = x mod p,并且gcd(x,p)=1,所以一定有gcd(y,p)=1
164+
根据fermat小定理得:y^(p-1) = 1 (mod p)因此
165+
x^((p-1)/2) = (y^2)^((p-1)/2) = y^(p-1) = (1 mod p)
166+
(2) 充分性
167+
因为x^((p-1)/2) = 1 (mod p),且有x mod p 属于Zp,不妨设x
168+
属于Zp,而Zp={0,1,2,...,p-1}是有限域,Zp*={1,2,3,...,p-1}
169+
在模p乘法运算下是一个循环群,所以一定存在Zp*的一个生成元b,
170+
使得下式成立
171+
x=b^i mod p, 1<= i <=p-1
172+
例如: 1=4^2 mod 5; 2=3^3 mod 5; 3=2^3 mod 5;
173+
因此,1=x^((p-1)/2) = (b^i)^((p-1)/2) = (b^(p-1))^(i/2) mod p
174+
因为b的阶是p-1,即b^(p-1) mod p = 1,所以i必定是偶数,
175+
于是x模p的平方根有整数解,并且其值为正负b^(i/2)mod p。
176+
(因为b的阶是p-1,任意的b^k=1 mod p,一定有p-1整除k
177+
所以ix(p-1)/2是p-1的倍数,从而i是偶数)
178+
179+
180+
3、gcd(n,u)=an+bu
181+
gcd(n,u) = 1 --> u一定有u^-1 (mod n)
182+
1 = an+bu (mod n)
183+
1 = bu (mod n)
184+
b就是n的逆元
185+
-----------------------
186+
证明:gcd(n,u)=an+bu
187+
设n/u的商为q,余数为r,则有
188+
r = n - q*u
189+
若g(n,u) = k, 则r里也一定包含因子k,因此
190+
gcd(n,u) = gcd(u,r)
191+
由此可以求的gcd(n,u)的欧几里得算法
192+
```
193+
y=n;
194+
x=u;
195+
while(x != 0) {
196+
q = y / x;
197+
r = y % x;
198+
y = x;
199+
x = r;
200+
}
201+
```
202+
当除数x=0时,被除数y=gcd(n,u)
203+
先用数学归纳法证明上述算法中的被除数y以及除数x可以表示称
204+
yi = a1i*n + b1i*u (a)
205+
xi = a2i*n + b2i*u (b)
206+
207+
当i=0时,只要a1i=1,b1i=0,a2i=0,b2i=1则(a)(b)成立
208+
当i=j是,(a)(b)成立,则当i=j+1时,
209+
yj+1 = xj = a2j*n + b2j*u
210+
xj+1 = yj % xj = a1j*n + b1j*u - qj*(a2j*n + b2j*u)
211+
= (a1j-qj*a2j)*n + (b1j-qj*b2j)*u
212+
= a'*n + b'*u
213+
得证
214+
其中qj表示欧几里得算法第j次计算出来的商,i=j+1时,取
215+
a1j+1 = a2j, b1j+1 = b2j
216+
a2j+1 = (a1j-qj*a2j), b2j+1 = (b1j-qj*b2j)
217+
218+
4、中国剩余定理
219+
x = a1 mod m1
220+
x = a2 mod m2
221+
x = a3 mod m3
222+
当m1、m2、m3互素时,上述方程组的解x是唯一的,
223+
其值=Y mod M
224+
Y = (
225+
a1*(m2*m3)* ((m2*m3)^-1 mod m1) +
226+
a2*(m1*m3)* ((m1*m3)^-1 mod m2) +
227+
a3*(m1*m2)* ((m1*m2)^-1 mod m3)
228+
)
229+
M=m1*m2*m3
230+
先证明Y mod mi是方程组的一个解
231+
------------------------
232+
设m1,m2,m3,...mr两两互素,则以下同余方程组
233+
x = ai(mod mi), i=1,2,3,...,r (a)
234+
模M=m1m2m3...mr的唯一解为
235+
x = \sigma_{i=1}^r ai*Mi*(Mi^-1 mod mi) mod M, 其中Mi = M/mi (b)
236+
237+
(1) 先证明\sigma_{i=1}^r ai*Mi*(Mi^-1 mod mi) (c)是同余方程组(a)的一个解
238+
对于任意1<=j<=r,都有\sigma_{i=1}^r ai*Mi*(Mi^-1 mod mi) mod mj = aj
239+
240+
(2) 再证明(b)是同余方程组(a)的模M唯一解
241+
假定x1以及x2是(a)的不同解,即
242+
x1 = ai mod mi,i=1,2,3,...,r
243+
x2 = ai mod mi,i=1,2,3,...,r
244+
x1 - x2 = 0 mod mi, i=1,2,3,...,r
245+
即mi | (x1-x2), i=1,2,3,...,r
246+
又因为m1,m2,m3,....mr两两互素,所以
247+
M |(x1-x2)
248+
x1 = x2 mod M
249+
因此(b)是(a)的唯一解

0 commit comments

Comments
 (0)
Please sign in to comment.