总结一下计算机中的数学相关内容,便于后续调用
[0] 目录
-
[模乘]
- [1-1-1 蒙哥马利算法]
[1] MATH
[1-1] 模乘
[1-1-1] 蒙哥马利算法
蒙哥马利算法能够提高类似模幂运算的速度而实现的,主要是因为蒙哥马利算法巧妙地避免了大量模运算(除法),极大地降低了运算时间,下面介绍如何减少x*y mod N的模运算数目。
首先,蒙哥马利算法引入了REDC函数,该函数以大数T,模数N,模数N的逆元的负数N'和整数R(如果N为素数,R一般选取\(2^{n\_bit}\),这样就可以在整除前提下用移位运算代替除法运算,也就是将下面代码第三行的整除运算换成移位运算)作为输入,在不使用模运算的情况下输出\(TR^{-1} mod N\)。该函数减少了模运算的数目,同时将T的蒙哥马利形式恢复成了普通形式。该函数的低效版python实现如下:
1 | def REDC(R, N, N_inverse, T): |
可以看到m的预计算使得t处于(0,2N)之间,我们可以用一次比较和一次减法代替模运算。如果想要进一步提升效率,可以将m提出这个函数放入查找表中,进一步减少模运算的数目。
接下来介绍大数T的蒙哥马利形式:假设我们有模数N,大整数T。其实T的蒙哥马利形式\(\overline{T}\)就是TR.其中 R ,且R与模数N互素,这样我们可以通过REDC函数来恢复T mod N。
假设我们有模数N,大数a和大数b,蒙哥马利模乘就是:先将a和b转化为蒙哥马利形式,然后计算\(\overline{a} * \overline{b}\),也就是\(a*b*R^2\),最后求解\(\overline{c} = REDC(\overline{a} * \overline{b})\)即可求得乘积c的蒙哥马利形式。我们可以将\(\overline{c}\)再丢进REDC函数即可获得c,也可以用\(\overline{c}\)进行之后的运算。
到目前为止,除了预计算m和求R的模逆元需要几次模运算外,所有运算均不涉及模运算,还保证了所有乘法运算都维持在modN的量级进行。
1 | def extended_gcd(a, b): |
[1] Stream Cipher
[1-1] RC4
[1-1-1] 基本原理
加密: 明文与 keystream 异或得到密文
密文: 密文与 keystream 异或得到明文
keystream 与明文等长
由于 RC4 采取逐位异或的加密方式,只要我们知道了密文和key,只需要放到 cyberchef 里再加密一次就能得到原文
[1-1-2] 生成密钥流(keystream)
RC4 的密钥流生成由两部分组成:
KSA(the Key-Scheduling Algorithm)
PRGA(the Pseudo-Random Generation Algorithm)
KSA: 利用key生成S盒 1
2
3
4
5
6
7
8
9
10
11
12
13int i = 0;
int j = 0;
char T[SBOX_LEN] = {0};
for (i = 0; i < SBOX_LEN; i++) {
Sbox[i] = i;
T[i] = key[ i % key_length ];
}
for (i = 0; i < SBOX_LEN; i++) {
j = (j + Sbox[i] + T[i]) % SBOX_LEN;
swap(&Sbox[i], &Sbox[j]);
}
PRGA: 利用S盒生成密钥流 1
2
3
4
5
6
7
8
9
10
11int i = 0;
int j = 0;
int t = 0;
for (int k = 0; k < data_len; k++) {
i = (i + 1) % SBOX_LEN;
j = (j + Sbox[i]) % SBOX_LEN;
swap(&Sbox[i], &Sbox[j]);
t = (Sbox[i] + Sbox[j]) % SBOX_LEN;
puc_key_stream[k] = Sbox[t];
}
[1-1-3] 完整代码
1 |
|
[2] Block Cipher
[2-1] Tea/xTea/xxTea
[2-1-1] Tea decrypt
1 |
|