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