forked from QSCTech/zju-icicles
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
afc2105
commit e6c483b
Showing
1 changed file
with
249 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,249 @@ | ||
enigma:加密和解密过程 | ||
plugboard(10组字母互换位置)->三个齿轮(外部设置message key,内部固定ring setting,计算delta,进入加delta,出去-delta)-> 反射板 -> 反向经过三个齿轮(同样加入delta计算)-> plugboard | ||
齿轮转动:每次按键先转动齿轮再输入,double step:当中间的齿轮在临转点的时候,无论第一个齿轮怎么转,第二个齿轮都会转 | ||
|
||
md5:填充算法,init,update,final是做什么的 | ||
按照每块64字节计算,如果块大小<56 则在末尾补上0x80,0x00...共56-n个字节 | ||
当n在[56,63]则在末尾补充64-n+56个字节,最后在后面补上8个字节记录message的不包括填充的总共位数 | ||
typedef struct _MD5_CTX { | ||
unsigned long state[4]; /* 128位摘要 */ | ||
unsigned long count[2]; /* 已处理的报文的二进制位数,最大值=2^64-1 */ | ||
unsigned char data[64]; /* 64字节message块 */ | ||
} | ||
init:count 归零,state设置初始值 | ||
update:增加count值即报文位数,分块(64字节)计算并更新到state,多余的存在data里等待之后的填充 | ||
final:为最后一块填充若小于56字节则补充道56,若大于补充完当前块并补充道下一个56字节,最后增加8字节报文长度 | ||
|
||
sha:填充算法,位数 | ||
sha-1散列算法计算出来的hash值达160位,即20字节,比md5多了32位。 | ||
sha-1也是分块计算,每块也是64字节,当最后一块不足64字节也按照md5的方式进行填充。 | ||
数据块的最后一定要补上表示报文总共位数的8个字节。 | ||
|
||
rc4: | ||
|
||
ecb:电子密码簿 | ||
先对明文分组[p1,p2,....,pn],有一个统一的密钥key | ||
cj = Ek(pj) | ||
pj = Ek(cj) | ||
加密解密可并行,但同样内容的明文,密文一样 | ||
|
||
cbc:密文块连接模式 | ||
还是先分组[p1,p2,....,pn]和一个初识向量c0,和密钥k | ||
cj = Ek(pj 亦或 cj-1) | ||
pj = Ek(cj) 亦或cj-1 | ||
加密串行,解密并行 | ||
|
||
cfb:同上,密文偷窃 | ||
分组[p1,p2,....,pn]每组8位,初始随机种子x1,和密钥k | ||
加密:cj = pj 亦或 L8(Ek(xj)) | ||
xj+1 = R56(xj) || cj | ||
解密:pj = cj 亦或 L8(Ek(xj)) | ||
xj+1 = R56(xj) || cj | ||
密文传输错误可恢复,因为每次亦或的串是上一次密文接到最后,因此即便有一个密文是错的,几轮迭代下来错误的密文会倍左移出去 | ||
|
||
密文偷窃: | ||
ecb: | ||
不一定要填充,它通过更改消息的最后两个块的处理来实现这一点。 除了最后两个块之外,所有块的处理都保持不变, | ||
但是倒数第二个块的密文的一部分被"窃取 "了,用来填充最后一个明文块。 填充的最后一块,然后像往常一样加密。 | ||
cbc: | ||
要先填充 | ||
|
||
|
||
des:流程,s_box(6位输入,4位输出过程),位的打乱,16轮循环做了什么事情 | ||
是分块的每块64字节,des是处理某一个块的算法 | ||
密钥部分: | ||
(1)通过key_perm_table将每个字节的最右位丢弃并打乱得到56bit | ||
(2)分成个左右各28bit两部分各循环左移,左移的位数由16轮循环轮次index来在key_rol_steps[16]确定左移位数 | ||
(3)再将两部分合起来通过key_56bit_to_48bit_table[48]丢弃8位并打乱得到48位subkey,一开始set key的时候就吧16个subkey就计算好保存 | ||
|
||
数据部分: | ||
(1)64位明文要先通过ip[64]打乱,然后分成左右各32位,Lj-1和Rj-1,将Rj-1通过plaintext_32bit_expanded_to_48bit_table[48]拓展到48位 | ||
(上述的ip和fp可以用高阶表来运作,其原理就是枚举所有的可能ip_perm[16][16][8]分成16组每组4bit共16种变化最后都输出8字节然后所有的组或起来) | ||
(2)Rj-1和当前轮次的subky亦或 | ||
(3)通过sbox[8][64],sbox就是将48位分成8组6bit然后最左和最有两位组成sbox行号,中间4位组成sbox列号,进入sbox得到4位最后组合成32位,再用sbox_perm_table[32]打乱 | ||
(4)最后和Lj-1亦或,Rj = 亦或的结果,Lj = Rj-1,得到密文64位 | ||
|
||
三重DES | ||
c = E(D(E(p,k1),k2),k3); | ||
p = D(E(D(c,k3),k2),k1); | ||
|
||
aes:每一轮循环做了什么事情,几个步骤sbox。shiftrow,mixcolumn,农夫算法,乘法求逆(扩展欧几里得) | ||
有三种密钥:16字节,24字节,32字节。明文和密文都是16字节 | ||
unsigned char a[4] = {0x03,0x01,0x01,0x02}; | ||
a^-1 = {0x0b,0x0d,0x09,0x0e} | ||
AddRoundKey(p,k); //将明文p中16字节与k中16字节逐字节异或 | ||
for(int i=1;i<=10;i++){ | ||
ByteSub(p,16); //p[i] = sbox[p[i]] ,这里sbox每个元素的值各不相同 sbox[256] | ||
MixColumnInverse(p,a,0); | ||
ShiftRow(p);// 对p所指向的4*4矩阵做逐行循环左移操作,第0行: 不移动,第1行: 左移1字节,第2行: 左移2字节,第3行: 左移3字节 | ||
if(i!=10) MixColumn(p,a,1); | ||
else MixColumn(p,a,0); //don't mul | ||
AddRoundKey(p,k+i*(4*4)); | ||
} | ||
农夫算法x * y mod 0x11B:初始p=0,循环8次,x左移,y右移,如果y右移出一个1则p ^= x, 若x左移出一个1,则x ^= 0x11b。(同理mod 0x101 则x ^= 0x101) | ||
MixColumn(p,a,1):对p指向的数组按照一列一列排下来变成2维矩阵,把a变成 2311\1231\1123\3112 矩阵 然后对每一列左乘a做mod x^4+1乘法(乘法是mod 11b 加法是亦或) | ||
然后把每一列的结果再一行一行组成1维数组 | ||
aes set key | ||
|
||
rsa:证明,代码里用到的函数,openssl大数运算常用函数(加法乘法,求逆等) | ||
算法流程: | ||
1、随机选取两个不等大素数p、q | ||
2、计算n=pq | ||
3、选择一个素数e使他和(p-1)(q-1)互素 | ||
4、计算e在模(p-1)(q-1)的逆元d | ||
5、(e,n)为公钥,(d,n)为私钥 | ||
6、加密:c=m^e mod n,解密:m = c^d mod n | ||
|
||
加密:A用B公钥加密,B用B私钥解密 | ||
数字签名:先用md5计算报文摘要再用A私钥加密摘要,作为签名。B获得摘要和报文用A公钥解密签名再计算报文md5进行比对 | ||
签名为什么要对m进行操作而不是对L本身进行操作,m永远是128位,而L长度很长,加密以及运输速度会有影响 | ||
|
||
SA作注册码 | ||
(1)软件打开时显示一个机器码 | ||
|
||
其中机器码m'=rsa(mac, 公钥) | ||
|
||
(2)软件作者: mac=rsa(m', 私钥) | ||
|
||
注册码sn=(mac, 私钥) | ||
|
||
(3)软件验证注册码:rsa(sn, 公钥)==mac | ||
|
||
ecc:点乘法,n倍的g=0,群循环?上课的例子,加密解密源代码,签名的算法 | ||
椭圆曲线在素域Z_p中的运算 | ||
- 一般的线与椭圆曲线有3个交点,设为P,Q,R,有 P+Q+R = 0,P+Q=过R作平行y轴的直线与椭圆曲线交点R' | ||
- 相切的直线 P,Q两点,切于Q P+Q+Q = 0 | ||
- P,Q与y轴平行: P+Q = 0 | ||
- 单P与y轴平行:P+P = 0 | ||
- 运算规则: | ||
- P+0=0+P = P | ||
- P = (x1,y1),Q=(x2,y2)如果有x1 = x2且y1 = y2 = 0 或x1 = x2且y1= -y2 !=0 则有P+Q = 0 | ||
- 一般情况下,运算规则如下, P = (x1,y1), Q = (x2,y2),P+Q = (x3,y3)有 | ||
$x_3 = k^2 - x1 - x2$ | ||
$y_3 = k(x_1-x_3) - y_1$ | ||
其中 | ||
k = (y_2-y_1)/(x_2-x_1) \ \ \ \ P\neq Q$ | ||
k = (3x_1^2+a)/(2y_1)\ \ \ \ P=Q$ | ||
|
||
加密:m为明文,选取椭圆曲线,基点和一个d<n(G的阶) | ||
公钥:R = dG,(R,G), 私钥:(d, G) | ||
r = (k*G) k为一个小于n的随机数 | ||
s = m*(k*R) mod n | ||
密文就是r,s | ||
解密:m = s/(dr) = m*(k*R) / d*(k*G) = m*(k*d*G) / d*(k*G) = m | ||
|
||
ecdsa | ||
签名:r = k*G k是随机数 | ||
s = (m+r*d)/k m是明文或者hash,d是私钥 | ||
验证:(m/s)*G + (r/s)*R == r 证明过程就是带入 | ||
ecnr | ||
签名:r = k*G+m | ||
s = k-r*d | ||
验证:r - (s*G+r*R) == m, 证明就是带入 | ||
|
||
证明题: | ||
1、rsa证明: | ||
设m是明文,c是密文,c=m^e mod n,现证明m=c^d mod n | ||
因为fai(n) = fai(p*q) = fai(p) * fai(q) = (p-1)(q-1) | ||
因为ed=1 mod (p-1)(q-1) | ||
所以一定可以找到一个k使得ed = 1 + k(p-1)(q-1)成立 | ||
于是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 | ||
|
||
上面证明的前提是gcd(m,n)=1 当gcd(m,n) != 1时,则一定有gcd(m,n) = p或gcd(m,n)=q。先假设gcd(m,n) = p,则m与q一定互素, | ||
于是有 | ||
m^fai(q) = 1 mod q --> m^(q-1) = 1 mod q --> m^k(q-1)(p-1) = 1 mod q | ||
--> m^k*fai(n) = 1 mod q --> m^k*fai(n) = qs + 1 --> m * m^k*fai(n) = mqs + m --> | ||
m^(fai(n)*k+1) = cpqs + m --> m^(fai(n)*k+1) = m mod n --> m^ed = m mod n | ||
|
||
2、欧拉准则 | ||
若方程有解y属于Zp,则x是模p的平方剩余:y^2 = x mod p | ||
设p>2是一个素数,x是一个整数,gcd(x,p)=1,则x是模p的平方剩余的充要条件是: | ||
x^((p-1)/2) = 1 (mod p) | ||
(1)必要性 | ||
因为y^2 = x mod p,并且gcd(x,p)=1,所以一定有gcd(y,p)=1 | ||
根据fermat小定理得:y^(p-1) = 1 (mod p)因此 | ||
x^((p-1)/2) = (y^2)^((p-1)/2) = y^(p-1) = (1 mod p) | ||
(2) 充分性 | ||
因为x^((p-1)/2) = 1 (mod p),且有x mod p 属于Zp,不妨设x | ||
属于Zp,而Zp={0,1,2,...,p-1}是有限域,Zp*={1,2,3,...,p-1} | ||
在模p乘法运算下是一个循环群,所以一定存在Zp*的一个生成元b, | ||
使得下式成立 | ||
x=b^i mod p, 1<= i <=p-1 | ||
例如: 1=4^2 mod 5; 2=3^3 mod 5; 3=2^3 mod 5; | ||
因此,1=x^((p-1)/2) = (b^i)^((p-1)/2) = (b^(p-1))^(i/2) mod p | ||
因为b的阶是p-1,即b^(p-1) mod p = 1,所以i必定是偶数, | ||
于是x模p的平方根有整数解,并且其值为正负b^(i/2)mod p。 | ||
(因为b的阶是p-1,任意的b^k=1 mod p,一定有p-1整除k | ||
所以ix(p-1)/2是p-1的倍数,从而i是偶数) | ||
|
||
|
||
3、gcd(n,u)=an+bu | ||
gcd(n,u) = 1 --> u一定有u^-1 (mod n) | ||
1 = an+bu (mod n) | ||
1 = bu (mod n) | ||
b就是n的逆元 | ||
----------------------- | ||
证明:gcd(n,u)=an+bu | ||
设n/u的商为q,余数为r,则有 | ||
r = n - q*u | ||
若g(n,u) = k, 则r里也一定包含因子k,因此 | ||
gcd(n,u) = gcd(u,r) | ||
由此可以求的gcd(n,u)的欧几里得算法 | ||
``` | ||
y=n; | ||
x=u; | ||
while(x != 0) { | ||
q = y / x; | ||
r = y % x; | ||
y = x; | ||
x = r; | ||
} | ||
``` | ||
当除数x=0时,被除数y=gcd(n,u) | ||
先用数学归纳法证明上述算法中的被除数y以及除数x可以表示称 | ||
yi = a1i*n + b1i*u (a) | ||
xi = a2i*n + b2i*u (b) | ||
|
||
当i=0时,只要a1i=1,b1i=0,a2i=0,b2i=1则(a)(b)成立 | ||
当i=j是,(a)(b)成立,则当i=j+1时, | ||
yj+1 = xj = a2j*n + b2j*u | ||
xj+1 = yj % xj = a1j*n + b1j*u - qj*(a2j*n + b2j*u) | ||
= (a1j-qj*a2j)*n + (b1j-qj*b2j)*u | ||
= a'*n + b'*u | ||
得证 | ||
其中qj表示欧几里得算法第j次计算出来的商,i=j+1时,取 | ||
a1j+1 = a2j, b1j+1 = b2j | ||
a2j+1 = (a1j-qj*a2j), b2j+1 = (b1j-qj*b2j) | ||
|
||
4、中国剩余定理 | ||
x = a1 mod m1 | ||
x = a2 mod m2 | ||
x = a3 mod m3 | ||
当m1、m2、m3互素时,上述方程组的解x是唯一的, | ||
其值=Y mod M | ||
Y = ( | ||
a1*(m2*m3)* ((m2*m3)^-1 mod m1) + | ||
a2*(m1*m3)* ((m1*m3)^-1 mod m2) + | ||
a3*(m1*m2)* ((m1*m2)^-1 mod m3) | ||
) | ||
M=m1*m2*m3 | ||
先证明Y mod mi是方程组的一个解 | ||
------------------------ | ||
设m1,m2,m3,...mr两两互素,则以下同余方程组 | ||
x = ai(mod mi), i=1,2,3,...,r (a) | ||
模M=m1m2m3...mr的唯一解为 | ||
x = \sigma_{i=1}^r ai*Mi*(Mi^-1 mod mi) mod M, 其中Mi = M/mi (b) | ||
|
||
(1) 先证明\sigma_{i=1}^r ai*Mi*(Mi^-1 mod mi) (c)是同余方程组(a)的一个解 | ||
对于任意1<=j<=r,都有\sigma_{i=1}^r ai*Mi*(Mi^-1 mod mi) mod mj = aj | ||
|
||
(2) 再证明(b)是同余方程组(a)的模M唯一解 | ||
假定x1以及x2是(a)的不同解,即 | ||
x1 = ai mod mi,i=1,2,3,...,r | ||
x2 = ai mod mi,i=1,2,3,...,r | ||
x1 - x2 = 0 mod mi, i=1,2,3,...,r | ||
即mi | (x1-x2), i=1,2,3,...,r | ||
又因为m1,m2,m3,....mr两两互素,所以 | ||
M |(x1-x2) | ||
x1 = x2 mod M | ||
因此(b)是(a)的唯一解 |