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加密时使用大数分解,因此可以观察代码中是否存在极大数。

 

2.观察是否存在以下函数

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加密算法相似。

3.是否有3,17,65537之类的数字存在

 

posted @ 2022-06-23 10:15  e1ectronic  阅读(99)  评论(0)    收藏  举报