椭圆曲线上的加密算法——MV算法的具体实现
密码学实验课老师要求我们使用大数运算库实现椭圆曲线上的MV算法。最开始老师要求很笼统,什么多余的要求也没说,之前我们做过一个小数MV算法的实现,直观感觉就是把程序中的数据类型改一改,调一调就行了…越往后做才发现大模数下的椭圆曲线算法没有想象的那么简单
1.椭圆曲线概述
这部分先鸽了
推荐大家阅读椭圆曲线密码学原理分析这篇博客,写的非常详尽,里面也有椭圆曲线在密码学的应用
2.MV算法流程
MV算法全称是Menezes-Vanstone公钥密码体制,顾名思义,是由Menezes和Vanstone两人提出的应该没有人关心吧
MV算法是ElGamal 公钥加密算法的变种,大概就是ElGamal 在椭圆曲线上的一种表现形式,两者的核心是一样的。
我们学校使用的这本密码学课本对MV的具体实现做作了详细的描述具体的算法实现因为临近期末,鸽了。。
3.miracl库下的椭圆曲线方程常用函数
此处参考了博客miracl库下椭圆曲线方程常用函数使用入门
1)椭圆曲线方程初始化
void ecurve_init(big A,big B,big p,type);
其中A,B,P为椭圆曲线
y
2
=
x
3
+
a
x
+
b
y^2=x^3+ax+b
y2=x3+ax+b??(其中
4
a
2
+
27
b
≠
0
4a^2+27b\neq0
4a2+27b?=0??)
2)初始化点
epoint* epoint_init()
当定义
e
p
o
i
n
t
epoint
epoint?后?需要使用这个函数初始化
3)点乘
void ecurve_mult(big k,epoint* G,epoint *P)
返回值为
P
=
k
G
P=kG
P=kG?(
P
,
G
为
椭
圆
曲
线
上
的
点
P,G为椭圆曲线上的点
P,G为椭圆曲线上的点?)?
4)点的加法
void ecurve_add(epoint* P,epoint* Q)
返回值为
Q
=
P
+
Q
(
椭
圆
曲
线
上
的
加
法
运
算
)
Q=P+Q(椭圆曲线上的加法运算)
Q=P+Q(椭圆曲线上的加法运算)
5)点的减法
void ecurve_sub(epoint *P,epoint *Q)
返回值为
Q
=
Q
?
P
(
椭
圆
曲
线
上
的
运
算
)
Q=Q-P(椭圆曲线上的运算)
Q=Q?P(椭圆曲线上的运算)
6)比较椭圆曲线上两点是否相同
bool epoint_comp(epoint *P,epoint *Q)
比较
P
P
P?和
Q
Q
Q?是否相同,相同返回
t
r
u
e
true
true?,否则为
f
a
l
s
e
false
false
7)释放点内存
void epoint_free(epoint *p)
8)设置点坐标,若属于当前方程则返回True,不满足当前方程返回False
bool epoint_set(big x,big y,lsb,epoint *p)
l
s
b
lsb
lsb作为
y
y
y的最低有效位我也不知道是啥,我填0
9)从
e
p
o
i
n
t
epoint
epoint结构体中取出点坐标赋给给x、y
int epoint_get(epoint *p,big x,big y)
10)是否为无穷远点
bool point_at_infinity(epoint *p)
4.MV算法实现具体代码
先鸽了
|