RSA
一.加密原理

1.随机选取1个素数对(p,q)
2.计算公共模数M(M=p*q)
3.计算欧拉数 eular=(p-1)*(q-1)
4.生成公钥E,E的取值范围(1<E<eular)且必须是整数,E和欧拉数eular必须是互质数。
5.生成私钥D,(E*D)%eular=1,由公钥和eular生成私钥。
6.公钥加密:公式 如下,M为想要加密的数字,C是加密后的结果。
C = M^E mod M
7.私钥解密:公式如下
M =C^D mod M
1.(3,11)为互质数
2.公共模数N=3x11=33;
3.欧拉数:eular=(3-1)x(11-1)=20;
4.公钥E是整数,1<E<eular,与eular是互质数,所以E={3,7,9,11,13,17,19};取E=3。
5.私钥D=(E*D)%eular=1 ==>D=7;
6.加密数字:以2为例,C=2^3%33=8
7.私钥解密:8^7=2097152
8^7%33=2
公钥的选取:
理论上来说只要满足条件,公钥可以取任意值。但实际上在CTF比赛时通常只会选择在3(1x2+1) / /17(1x2^4+1) / / 65537(1x2^16+1)三个数中选一个,因为这三个数只需要经过2或17次乘法实现指数运算。总的来说,选择这三个数是为了提高加密的性能,节约加密的时间。
加密特征:
1.观察是否存在极大数
RSA加密时使用大数分解,因此可以观察代码中是否存在极大数。

mpz_init_set_str int mpz_init_set_str (mpz_t rop, const char *str, int base) //Initialize rop and set its value like mpz_set_str官方解释
这个函数调用了变量,字符串,进制。也就是把字符数组以base指定的数组读入rop寄存器。
mpz_pown void mpz_powm (mpz_t rop, const mpz_t base, const mpz_t exp, const mpz_t mod) //Set rop to base^exp mod mod.
这个函数取base的exp方,之后对mod取模,存入rop寄存器,与RSA加密算法相似。

浙公网安备 33010602011771号