ElGamal公钥密码算法的C语言实现(基于Miracl大数运算库)
实验环境
Windows 10,Visual Studio 2019,Miracl大数库
背景及原理
ElGamal公钥密码算法
密钥生成
随机产生一个大素数p及模p的一个原根g;
随机选取整数a,计算 g^a (modp)。Alice的公钥是(p,g,g^a),私钥是a。
加密过程
随机选取一个整数k,满足 1 < k < p-1 ;
注: 部分教材多出一条附加条件 (k, p-1)=1,参考多本国内外密码学知名教材,均无此条件限制,故不予采纳
计算
C 1 = g k ( m o d p ) , C 2 = m ⋅ ( g a ) k ( m o d p ) C_{1}=g^{k}(\bmod p), \quad C_{2}=m \cdot\left(g^{a}\right)^{k}(\bmod p) C1=gk(modp),C2=m⋅(ga)k(modp)
将密文 (C_1,C_2) 发送给Alice。
解密过程
计算
V = C 1 a ( m o d p ) V=C_{1}^{a}(\bmod p) V=C1a(modp)
计算
m = C 2 V − 1 ( m o d p ) m=C_{2} V^{-1}(\bmod p) m=C2V−1(modp)
Miracl大数运算库相关函数
函数原型: miracl *mirsys(int nd, int nb);
功能说明: 初始化MIRACL系统,该函数必须在调用MIRACL库函数之前先执行
函数原型: void add(big x, big y, big z);
功能说明: 两个大数相加,z=x+y
函数原型: void bigdig(int n, int b, big x);
功能说明: 产生一个指定长度的进制的随机数,该函数使用内置的随机数发生器,初始化种子调用irand()函数
函数原型: void bigrand(big w, big x);
功能说明: 使用内置的随机数发生器,产生一个小于w的大数随机数,x<w
函数原型: void copy(big x, big y);
功能说明: 将一个大数赋值给另一个大数,y=x
函数原型: int cotstr(big x, char *s);
功能说明: 将一个大数根据其进制转换成一个字符串
返回值: 字符串长度
函数原型: void decr(big x, int n, big z) ;
功能说明: 将一个大数减去一个整数, z=x-n.
函数原型: BOOL nxsafeprime (int type, int subset, big w, big p);
功能说明: 找到大于w的下一个安全素数。type为0时,满足q = (p-1)/2,type为2时,满足q = (p+1)/2;subset为1时,q模4余1,subset为3时&#