Skip to content

Commit

Permalink
Add files via upload
Browse files Browse the repository at this point in the history
  • Loading branch information
Lokilankaaa authored Sep 8, 2020
1 parent afc2105 commit e6c483b
Showing 1 changed file with 249 additions and 0 deletions.
249 changes: 249 additions & 0 deletions 密码学/考试范围+简答by xw.txt
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)的唯一解

0 comments on commit e6c483b

Please sign in to comment.