椭圆曲线加密算法于1985年提出,由于自身优点,它一出现便受到关注,现在密码学界普遍认为它将替代RSA加密算法成为通用的公钥加密算法。那么我们今天就来看看椭圆曲线加密算法是如何通过C语言来设计实现的。
一、椭圆曲线加密算法的C语言设计
1、椭圆曲线加密系统的基本结构
椭圆曲线的加解密流程如图1所示:
椭圆曲线进行加密通信的过程如下:首先选定一个适合加密的椭圆曲线Ep(a,b),并取椭圆曲线上的一点作为基点G。选择一个私有密钥k,并生成公开密钥K=kG。加密时,将明文编码到Ep(a,b)上的一点M,并产生一个随机整数r(r
计算点C1=M+rK,C2=rGo将C1、C2存入密文。解密时,从密文中读出CI、C2,计算C1-kC2,根据C1-kC2=M+rK-k( rG)=M+rK-r( kG)=M,解得的结果就是点M,即明文。
2、高精度整数的表示
加密算法几乎都是建立在高精度大整数的运算上, 而一般的程序语言都不提供大整数的结构,因此要表示上百位的高精度整数需另辟蹊径。
本文使用了LibTomMath库的高精度整数结构。LibTomMath是一个计算高精度整数的库的开源软件,由加拿大人汤姆St.丹尼斯编写,用标准C语言写了几乎所有标准的密码算法模块,并且在几乎所有的操作系统下都可执行。
LibTomMath库对高精度大整数的表示是该库最大的一个特点。在LibTomMath库中的高精度大整数表示如下:在32位机上unsigned long为32bit,用mp_digit表示这个类型:typedef unsigned_long mp_digit;实际使用了32位的28位,少用4位,因此用16进制表示一个mp_digit为0XXXXXXX,其中X为16进制数字,将这个32位bit串称为一个mp_digit单元,若干个mp_digit单元构成一个大整数,结构定义一个大整数mpint如下:
typeclef struct {
inl used,alloc,sign;
mp_digit *dp;
) mp_int;