以下是ELGamal加解密的python实现
p=int(input("请输入素数p:"))
g=int(input("请输入生成元g:"))
x=int(input("请输入私钥x∈(1,p-1):"))
y=(g**x) % p
print("公钥为(" + str(y) +','+ str(g) +','+ str(p) + ')'+'\n'+"私钥为:"+str(x))
k=int(input("请输入随机数k∈(1,p-1):"))
m=int(input("请输入明文m:"))
# 加密函数
def encrypt(m):
c1=(g**k)%p
c2=(m*(y**k))%p
return (c1,c2)
#分数模运算
def calculateMod(numerator, denominator, p):
numerator_mod_p = (numerator % p + p) % p # 处理负数情况
denominator_mod_p = (denominator % p + p) % p
# 计算逆元
denominator_inverse = 1
for i in range(1, p):
# 判断i是否为分母的逆元
if (denominator_mod_p * i) % p == 1:
denominator_inverse = i
break
result = (numerator_mod_p * denominator_inverse) % p
return result
c1,c2=encrypt(m) #获得密文
#解密函数
def decrypt(c1,c2):
plaintext=calculateMod(c2,c1**x,p)
return plaintext
print("密文为:"+str(encrypt(m)))
print("解密后的明文为:"+str(decrypt(c1,c2)))
下图是运行及结果

======================================================================================
下面是ECC椭圆曲线的加解密实现(C++)
#include <vector>
#include <iostream>
#include <cmath>
using namespace std;
class ellipse //定义椭圆类
{
public:
int a; //椭圆的长半轴
int b; //椭圆的短半轴
int p; //椭圆所在的有限域Fp
ellipse(int u, int i, int o) //构造函数
{
a = u;
b = i;
p = o;
};
int count = 0; //记录点的个数,初始化为0
typedef struct point //定义点的数据结构
{
int x = 0;
int y = 0;
}Point;
Point P[100]; //储存100个点
void showPoint(); //显示点的函数
};
void ellipse::showPoint() //显示点的函数定义
{
for (int x = 0; x < p; x++) //遍历Fp域中的x值
{
int temp = (x * x * x + a * x + b) % p; //计算y的平方根的值
for (int y = 0; y <= p; y++) //遍历Fp域中的y值
{
if ((y * y - temp) % p == 0) //如果y满足椭圆方程
{
P[count].x = x; //记录点的x坐标
P[count].y = y; //记录点的y坐标
count++; //点的个数加1
}
}
}
//输出点的坐标
for (int j = 0; j < count; j++)
{
cout << "(" << P[j].x << "," << P[j].y << ")";
}
}
// 计算最大公约数
int get_gcd(int a, int b) {
if (b == 0)
return a;
return get_gcd(b, a % b);
}
//分数模运算
int calculateMod(int numerator, int denominator, int p) {
int numeratorModP = (numerator % p + p) % p; // 处理负数情况
int denominatorModP = (denominator % p + p) % p;
// 计算逆元
int denominatorInverse = 1;
for (int i = 1; i < p; ++i)
{//判断i是否为分母的逆元
if ((denominatorModP * i) % p == 1) {
denominatorInverse = i;
break;
}
}
int result = (numeratorModP * denominatorInverse) % p;
return result;
}
// 计算P+Q函数
vector<int> calculate_p_q(int x1, int y1, int x2, int y2, int a, int b, int p) {
int flag = 1; //标记PQ是否同号,1为同号,-1为异号
int member; //PQ的分子
int denominator; //PQ的分母
if (x1 == x2 && y1 == y2) { //P、Q重合,则P+Q=3P
member = 3 * (x1 * x1) + a;
denominator = 2 * y1;
}
else { //P、Q不重合
member = y2 - y1;
denominator = x2 - x1;
}
//将分子和分母化为最简
int gcd_value = get_gcd(member, denominator);
member = member / gcd_value;
denominator = denominator / gcd_value;
// 计算x3,y3
int x3 = calculateMod(member * member - x1 * denominator * denominator - x2 * denominator * denominator, denominator * denominator, p);
int y3 = calculateMod(member * (x1 - x3) - denominator * y1, denominator, p);
vector<int> result; //定义一个向量用于返回值
result.push_back(x3); //将x3的值添加到result中
result.push_back(y3); //将y3的值添加到result中
return result; //返回result
}
// 计算nP函数
vector<int> calculate_np(int x, int y, int n, int a, int b, int p) {
// 记录P的坐标
int x_old = x;
int y_old = y;
vector<int> result; // 用于返回P的值
for (int i = 0; i < n - 1; i++) {
// 调用calculate_p_q()函数计算P+P的值
vector<int> P_add_P = calculate_p_q(x_old, y_old, x_old, y_old, a, b, p);
// 更新P的坐标值为P+P
x_old = P_add_P[0];
y_old = P_add_P[1];
}
// 将P的新坐标添加到result中
result.push_back(x_old);
result.push_back(y_old);
return result;
}
vector<int> encrypt(int g1,int g2,int d,int a,int b,int p)
{
//加密过程
vector<int> publickey = calculate_np(g1, g2, d, a, b, p);//计算公钥
cout << "公钥为:" << '(' << publickey[0] << ',' << publickey[1] << ')' << endl;
int k;
cout << "请输入随机数k:";
cin >> k;
vector<int> kY = calculate_np(publickey[0], publickey[1], k, a, b, p);
vector<int> c1, c2;//密文
c1 = calculate_np(g1, g2, k, a, b, p);//计算c1
int x, y;
cout << "请输入明文x, y:";
cin >> x >> y;
c2 = calculate_p_q(x, y, kY[0], kY[1], a, b, p);//计算c2
//储存密文
vector<int> result;
result.push_back(c1[0]); result.push_back(c1[1]); result.push_back(c2[0]); result.push_back(c2[1]);
return result;
}
//解密过程
vector<int> decrypt(vector<int> c,int d,int a,int b,int p)
{
vector<int> dc1 = calculate_np(c[0], c[1], d, a, b, p);
dc1[1] = -dc1[1]; // -dc1
vector<int> result;
result = calculate_p_q(c[2],c[3],dc1[0],dc1[1], a, b, p);
return result;
}
int main()
{
int a, b, p;
cout << "请输入a,b,p:";//生成元
cin >> a >> b >> p;
ellipse A(a, b, p);
cout << "椭圆曲线上的点集为:";
A.showPoint();
int g1, g2;
cout << endl << "请输入生成元:";
cin >> g1 >> g2;
int d;//私钥
cout << "请输入私钥d:";
cin >> d;
//加密过程
vector<int> c= encrypt(g1, g2, d, a, b, p);
cout << "密文为:" << endl;
cout << '(' << c[0] << ',' << c[1] << ')';
cout << '(' << c[2] << ',' << c[3] << ')';
//解密过程
vector<int>m= decrypt(c,d, a, b, p);
cout <<endl <<"明文为:" << endl;
cout << '(' << m[0] << ',' << m[1] << ')';
}
下图是运行及结果
