前面古典的那些要会算 熵和完善保密性要会证明 aes要会算 des要知道结构和原理 rsa要会算 会用中国剩余定理解 素性检测会用米勒拉斌和那个s什么的算 md5和sha1要知道迭代结构 dh和elgamal也要知道原理+会算 离散对数会用shanks算
古典密码
代换/置换密码
仿射密码
https://baike.baidu.com/item/仿射密码
维吉尼亚密码:多表代换
https://www.wikiwand.com/zh-hans/维吉尼亚密码
为了生成密码,需要使用表格法。这一表格包括了26行字母表,每一行都由前一行向左偏移一位得到。具体使用哪一行字母表进行编译是基于密钥进行的,在过程中会不断地变换。
例如,假设明文为:
ATTACKATDAWN
选择某一关键词并重复而得到密钥,如关键词为LEMON时,密钥为:
LEMONLEMONLE
对于明文的第一个字母A,对应密钥的第一个字母L,于是使用表格中L行字母表进行加密,得到密文第一个字母L。类似地,明文第二个字母为T,在表格中使用对应的E行进行加密,得到密文第二个字母X。以此类推,可以得到:
明文:ATTACKATDAWN
密钥:LEMONLEMONLE
密文:LXFOPVEFRNHR
解密的过程则与加密相反。例如:根据密钥第一个字母L所对应的L行字母表,发现密文第一个字母L位于A列,因而明文第一个字母为A。密钥第二个字母E对应E行字母表,而密文第二个字母X位于此行T列,因而明文第二个字母为T。以此类推便可得到明文。
希尔密码
https://www.wikiwand.com/zh-hans/希尔密码
每个字母当作26进制数字:A=0, B=1, C=2… 一串字母当成n维向量,跟一个n×n的矩阵相乘,再将得出的结果模26。
流密码和线性反馈移位寄存器
https://blog.csdn.net/qq_31825569/article/details/79697458
香农理论
完善保密性
https://blog.csdn.net/POTASSIUM711/article/details/89415233
就是密文和明文的独立性
P
[
X
∣
Y
]
=
P
[
X
]
P[X|Y]=P[X]
P[X∣Y]=P[X]
信息量和熵
https://blog.csdn.net/POTASSIUM711/article/details/89415233
消除不确定性所需的信息量-不确定性的量度
I
(
X
=
x
i
)
=
−
l
o
g
2
P
(
x
i
)
I(X=x_i)=-log_2P(x_i)
I(X=xi)=−log2P(xi)
联合信息量
I
(
x
i
y
j
)
=
−
l
o
g
2
P
(
x
i
y
j
)
I(x_iy_j)=-log_2P(x_iy_j)
I(xiyj)=−log2P(xiyj)
独立时
=
I
(
x
i
)
+
I
(
y
i
)
=I(x_i)+I(y_i)
=I(xi)+I(yi)
条件自信息量
I
(
x
i
∣
y
j
)
=
−
l
o
g
2
P
(
x
i
∣
y
j
)
=
P
(
x
i
y
j
)
P
(
y
j
)
I(x_i|y_j)=-log_2P(x_i|y_j)=\frac{P(x_iy_j)}{P(y_j)}
I(xi∣yj)=−log2P(xi∣yj)=P(yj)P(xiyj)
互信息量
I
(
x
i
;
y
j
)
=
I
(
x
i
)
−
I
(
x
i
∣
y
j
)
I(x_i;y_j)=I(x_i)-I(x_i|y_j)
I(xi;yj)=I(xi)−I(xi∣yj)衡量相关性
熵
H
(
X
)
=
E
(
I
(
X
)
)
H(X)=E(I(X))
H(X)=E(I(X))
联合熵
H
(
X
Y
)
=
E
(
I
(
x
y
)
)
=
−
∑
∑
P
(
x
y
)
l
o
g
2
P
(
x
y
)
H(XY)=E(I(xy))=-\sum\sum P(xy)log_2P(xy)
H(XY)=E(I(xy))=−∑∑P(xy)log2P(xy)
条件熵
H
(
X
∣
Y
)
=
E
(
I
(
X
∣
Y
)
)
=
−
∑
∑
P
(
x
y
)
l
o
g
2
P
(
x
∣
y
)
H(X|Y)=E(I(X|Y))=-\sum\sum P(xy)log_2P(x|y)
H(X∣Y)=E(I(X∣Y))=−∑∑P(xy)log2P(x∣y)
平均互信息量
I
(
x
;
y
)
=
E
(
I
(
x
;
y
)
)
=
H
(
X
)
+
H
(
Y
)
−
H
(
X
Y
)
I(x;y)=E(I(x;y))=H(X)+H(Y)-H(XY)
I(x;y)=E(I(x;y))=H(X)+H(Y)−H(XY)
唯一解距离
https://wenku.baidu.com/view/a38a0638376baf1ffc4fad42.html
n
=
l
o
g
2
∣
K
∣
R
L
l
o
g
2
∣
P
∣
n=\frac{log_2|K|}{R_Llog_2|P|}
n=RLlog2∣P∣log2∣K∣
乘积,幂等,迭代.
分组密码
SPN基本
https://blog.csdn.net/POTASSIUM711/article/details/89917445
Feistel cipher
https://www.wikiwand.com/zh-hans/费斯妥密码
令 F {\displaystyle {\rm {F}}} F为轮函数,并令 K 0 , K 1 , … K n {\displaystyle K_{0},K_{1},\ldots K{n}} K0,K1,…Kn分别为轮 0 , 1 , … , n {\displaystyle 0,1,\ldots ,n} 0,1,…,n的子密钥。
基本操作如下:
将明文块拆分为两个等长的块, ( L 0 , R 0 ) (L_0, R_0) (L0,R0)
对每轮 i = 0 , 1 , … , n {\displaystyle i=0,1,\dots ,n} i=0,1,…,n,计算
L
i
+
1
=
R
i
 
{\displaystyle L_{i+1}=R_{i}\,}
Li+1=Ri
R
i
+
1
=
(
L
i
⊕
F
)
(
R
i
,
K
i
)
.
{\displaystyle R_{i+1}=(L_{i}\oplus {\rm {F)(R_{i},K_{i}).}}}
Ri+1=(Li⊕F)(Ri,Ki).
则密文为
(
R
n
+
1
,
L
n
+
1
)
{\displaystyle (R_{n+1},L_{n+1})}
(Rn+1,Ln+1)。
解密密文
(
R
n
+
1
,
L
n
+
1
)
{\displaystyle (R_{n+1},L_{n+1})}
(Rn+1,Ln+1)则通过计算
i
=
n
,
n
−
1
,
…
,
0
{\displaystyle i=n,n-1,\ldots ,0}
i=n,n−1,…,0
R
i
=
L
i
+
1
 
{\displaystyle R_{i}=L_{i+1}\,}
Ri=Li+1
L
i
=
R
i
+
1
⊕
F
(
L
i
+
1
,
K
i
)
.
{\displaystyle L_{i}=R_{i+1}\oplus \operatorname {F} (L_{i+1},K_{i}).}
Li=Ri+1⊕F(Li+1,Ki).
则
(
L
0
,
R
0
)
{\displaystyle (L_{0},R_{0})}
(L0,R0)就是明文。
与代换-置换网络相比,Feistel模型的一个优点是轮函数
F
{\displaystyle \operatorname {F} }
F不必是可逆的。
图显示了加密和解密的过程。注意解密时子密钥顺序反转,这是加密和解密之间的唯一区别。
What is the diffrence between Feistel networks and SPN?
In a Feistel networks (from the German IBM cryptographer Horst Feistel), the input is divided into two blocks (L0 and R0) which interact with each other. Main example is DES.
In a SPN (Substitution Permutation Network), the input is divided into multiple small blocks, applied to a S-box (substitution), then the bits positions are mixed (permutation). The key addition may occur before or after these two operations.
差分分析
https://www.wikiwand.com/zh-hans/差分密码分析
差分密码分析通常是选择明文攻击,意思是攻击者可以自行选取一部分明文并取得相应密文。不过,一些扩展也能让此方法用在已知明文攻击,甚至是唯密文攻击上。差分分析的基本方法,是运用若干对有着常量差异的明文;差异可以用数种方法定义,最常见的是逻辑异或(XOR)。然后,攻击者计算相应密文的差异,尝试找出差异分布的统计特征。明文差异和密文差异所组成的差异对被称为差分,其统计性质由加密所使用的S盒决定。也就是说,对于S盒子S,攻击者分析差分(ΔX, ΔY),其中ΔY = S(X ⊕ ΔX) ⊕ S(X)(⊕表示异或)。在初等攻击中,攻击者希望某个密文差异出现的频率非常高,这样就能将加密和随机过程区分开来。更复杂的变体攻击能做到比穷举更快地破解出密钥。
最基本的差分密码分析密钥破解形式中,攻击者首先取得大量明文对的密文,并假设差分在至少r − 1轮后有效,r即加密算法的总轮数。攻击者在倒数第二轮与最后一轮之间差异固定的假设下,去推测可能的轮密钥。如果轮密钥比较短,那么只需举可能的轮密钥,直到最后一轮运算结果和差异的密文对一致即可。当一个轮密钥看起来明显比其他密钥常出现时,其会被假设是正确的轮密钥。
线性分析
https://wenku.baidu.com/view/c162821ca8114431b90dd870.html
DES:Feistel cipher
https://www.wikiwand.com/zh-hans/資料加密標準
http://www.alonemonkey.com/2016/05/25/aes-and-des/
AES:SPN
https://www.wikiwand.com/zh/高级加密标准
https://blog.csdn.net/qq_28205153/article/details/55798628
操作模式
ECB、CBC、CFB、OFB
https://blog.csdn.net/zp17764507932/article/details/73610466
https://www.cnblogs.com/starwolf/p/3365834.html
CTR
https://www.wikiwand.com/zh-hans/分组密码工作模式
CCM
http://file.scirp.org/pdf/14-2.25.pdf
这还是看批批踢.
多项式域的求逆
HASH
https://www.wikiwand.com/zh-hans/散列函數
- 快速:给定M,很容易计算h
- 单向:给定h,根据H(M)=h无法计算出M
- 防碰撞:给定M,要找到另一条消息M’并满足H(M)=H(M’)困难或找到任意两个具有相同散列值的不同消息困难
- 单向性(原像稳固性)
给定消息摘要y,找到x使得h(x)=y困难 - 第二原像稳固性
给定消息x∈X,找到一个x’∈X且x’≠x,使得h(x)=h(x’)困难 - 碰撞稳固性
对于任意的x,x’∈X,找到x≠x’且h(x)=h(x’)的二元组(x,x’)困难
生日攻击
https://www.wikiwand.com/zh-hans/生日攻击
MD5
https://www.wikiwand.com/zh-hans/MD5
MD5是输入不定长度信息,输出固定长度128-bits的演算法。经过程序流程,生成四个32位数据,最后联合起来成为一个128-bits散列。基本方式为,求馀、取馀、调整长度、与链接变量进行循环运算。得出结果。
F ( X , Y , Z ) = ( X ∧ Y ) ∨ ( ¬ X ∧ Z ) G ( X , Y , Z ) = ( X ∧ Z ) ∨ ( Y ∧ ¬ Z ) H ( X , Y , Z ) = X ⊕ Y ⊕ Z I ( X , Y , Z ) = Y ⊕ ( X ∨ ¬ Z ) ⊕ , ∧ , ∨ , ¬ 是 X O R , A N D , O R , N O T 的 符 号 。 F(X,Y,Z) = (X\wedge{Y}) \vee (\neg{X} \wedge{Z})\\ G(X,Y,Z) = (X\wedge{Z}) \vee (Y \wedge \neg{Z})\\ H(X,Y,Z) = X \oplus Y \oplus Z\\ I(X,Y,Z) = Y \oplus (X \vee \neg{Z})\\ \oplus, \wedge, \vee, \neg 是 XOR, AND, OR , NOT 的符号。 F(X,Y,Z)=(X∧Y)∨(¬X∧Z)G(X,Y,Z)=(X∧Z)∨(Y∧¬Z)H(X,Y,Z)=X⊕Y⊕ZI(X,Y,Z)=Y⊕(X∨¬Z)⊕,∧,∨,¬是XOR,AND,OR,NOT的符号。
SHA
https://www.wikiwand.com/zh-hans/SHA家族
SHA1:
https://www.wikiwand.com/zh-hans/SHA-1
https://www.cnblogs.com/FlyingBread/archive/2007/01/02/610206.html
看看就行.
HMAC
https://baike.baidu.com/item/hmac
HMAC是密钥相关的哈希运算消息认证码,HMAC运算利用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要作为输出。
CBC MAC
https://blog.csdn.net/weixin_38664664/article/details/78016243
公钥密码
https://www.wikiwand.com/zh/公开密钥加密
它需要兩個密钥,一個是公開密鑰,另一個是私有密鑰;一個用作加密,另一個則用作解密。使用其中一個密钥把明文加密后所得的密文,只能用相對應的另一個密钥才能解密得到原本的明文;甚至連最初用來加密的密鑰也不能用作解密。由於加密和解密需要兩個不同的密鑰,故被稱為非對稱加密;不同於加密和解密都使用同一個密鑰的對稱加密。雖然兩個密鑰在数学上相关,但如果知道了其中一个,并不能憑此计算出另外一个;因此其中一个可以公开,称为公钥,任意向外發佈;不公开的密钥为私钥,必須由用戶自行嚴格秘密保管,絕不透過任何途徑向任何人提供,也不會透露給被信任的要通訊的另一方。
DF-HRM
https://www.wikiwand.com/zh-hans/迪菲-赫爾曼密鑰交換
ElGama
https://www.wikiwand.com/zh/ElGamal加密算法
https://www.jianshu.com/p/cd36ae7dca47
https://my.oschina.net/u/1382972/blog/330630
RSA
https://www.wikiwand.com/zh/RSA加密演算法
https://juejin.im/post/5a76d7e3f265da4e752770a3
椭圆曲线算法
https://zhuanlan.zhihu.com/p/26029199 ←质量超高!!!
数字签名思想
https://www.wikiwand.com/zh-hans/數位簽章
ElGamal签名
https://blog.mythsman.com/2015/10/07/3/
DSA
https://zhuanlan.zhihu.com/p/33195438
数学基础
[待续]
多项式求逆元
多项式的乘法逆元原理和整数乘法逆元求法原理一致,只是此时操作的是多项式而已。
方法一:实现多项式的加减乘除
方法二:利用整数(二进制位)来模拟多项式的加减乘除。此方法也是最巧妙最简单最合适的方法。
比如:
x
8
+
x
4
+
x
3
+
x
+
1
x^8+x^4+x^3+x+1
x8+x4+x3+x+1 用二进制来描述:100011011 可以当做整数283来存储。
然后用欧几里得扩展算法:
a
x
≡
1
(
m
o
d
y
)
a
=
x
−
1
a
x
+
b
y
=
1
ax\equiv 1\pmod y\\ a=x^{-1}\\ ax+by=1\\
ax≡1(mody)a=x−1ax+by=1
AES列混合
https://blog.csdn.net/u012429555/article/details/78526100
在AES算法中,需要模多项式m(x)=x8+x4+x^3+x+1。列混合即是用一个常矩阵乘以第二步变换后的矩阵,以达到矩阵中每一个元素都是该元素原所在列所有元素的加权和。
[待续…]
整数域求逆
a ⋅ a φ ( b ) − 1 ≡ 1 ( m o d b ) a\cdot a^{\varphi (b)-1}\equiv 1\pmod b a⋅aφ(b)−1≡1(modb)
Shanks算法
时间-存储折中算法
SHANKS(G,n,α,β)
m=
for i = 0 to m-1 {
计算α(mi)
}
对m个有序对(i, αmi)基于αmi大小进行排序,
得到列表L1
for j = 0 to m - 1 {
计算βα-j
}
对m个有序对(j, βα-j)基于βα-j大小进行排序,
得到列表L2
找到(i,y)∈L1且(j,y)∈L2
i
n
d
α
β
=
(
m
i
+
j
)
m
o
d
n
ind_α β=(mi+j) mod\ n
indαβ=(mi+j)mod n
素性演算
根据费马小定理:如果p是素数,
1
≤
a
≤
p
−
1
1\leq a\leq p-1
1≤a≤p−1,那么
a
(
n
−
1
)
≡
1
(
m
o
d
p
)
。
a^{(n-1)}\equiv 1{\pmod {p}}。
a(n−1)≡1(modp)。
如果我们想知道n是否是素数,我们在中间选取a,看看上面等式是否成立。如果对于数值a等式不成立,那么n是合数。如果有很多的a能够使等式成立,那么我们可以说n可能是素数,或者伪素数。
在我们检验过程中,有可能我们选取的a都能让等式成立,然而n却是合数。这时等式
a
(
n
−
1
)
≡
1
(
m
o
d
n
)
a^{(n-1)}\equiv 1{\pmod {n}}
a(n−1)≡1(modn)
被称为Fermat liar。如果我们选取满足下面等式的a
a
(
n
−
1
)
≡
̸
1
(
m
o
d
n
)
a^{(n-1)}\equiv \not 1{\pmod {n}}
a(n−1)≢1(modn)
那么a也就是对于n的合数判定的Fermat witness。
快速模幂运算
求 a b ( m o d x ) a^b\pmod x ab(modx)
- 约掉b
- 化为二进制算.
RSA中的中国剩余定理
https://blog.csdn.net/mrpre/article/details/79671263