ElGamal公钥密码算法的C语言实现(基于Miracl大数运算库)

实验环境

Windows 10,Visual Studio 2019,Miracl大数库

背景及原理

ElGamal公钥密码算法

密钥生成

随机产生一个大素数p及模p的一个原根g;
随机选取整数a,计算 g^a (mod⁡p)。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=C2V1(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时&#

  • 9
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值