NTL实现RSA

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <NTL/ZZ.h>
NTL_CLIENT
#define BITS 256 //要求概率素数 p , q 的比特位数达 BITS bits

void KeyGeneration(ZZ&e, ZZ&d, ZZ&euler) //生成e,d
{
RandomPrime(e, 64, 10);
d = InvMod(e, euler);
}

ZZ Encryption(ZZ&e, ZZ&n, ZZ&M) //加密函数
{
return PowerMod(M, e, n);
}

ZZ Decryption(ZZ&d, ZZ&n, ZZ&C) //解密函数
{
return PowerMod(C, d, n);
}

void main()
{
ZZ p, q; //两个 BITS 比特的随机概率素数 p , q
ZZ n, e, d, euler; // n=p*q, euler=(p-1)*(q-1), e---加密密钥, d---解密密钥
int bits = BITS;
ZZ M, C;
cout << "请输入明文:" << endl;
cin >> M;
RandomPrime(p, bits, 10);
RandomPrime(q, bits, 10);
n = p * q;
euler = (p - 1)*(q - 1); //计算 n=p*q 及 欧拉函数值 euler(n)=(p-1)*(q-1)
KeyGeneration(d, e, euler); //生成密钥: d, e , d*e=1 Mod euler(n)
Encryption(e, n, M); //加密: C=M^e(Mod n)
C= Encryption(e, n, M);
cout << "密文是:" << C<<endl;
Decryption(d, n, C); //解密: M=C^d(Mod n)
ZZ M1;//用于验证M与最后通过C解密的明文是否相等
M1= Decryption(d, n, C);
if (M == M1)
cout << "RSA成功运行" << endl;
cout << endl; system("pause");

}

琢磨了好久的NTL官方文档之后,发现写起来也还挺顺手的,主要是在invmod()那里报错,一直提示inverse not defined,此时的e是GCD(e,euler)=1求的,最后直接将e换成了一个64bit的随机素数,解决了报错的问题。需要打印每一个e,d只需要加入cout即可。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!