橢圓曲線加密演算法的C語言設計和實現

2021-08-19 15:16:23 字數 2716 閱讀 2562

橢圓曲線加密演算法於2023年提出,由於自身優點,它一出現便受到關注,現在密碼學界普遍認為它將替代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為0******x,其中x為16進製制數字,將這個32位bit串稱為乙個mp_digit單元,若干個mp_digit單元構成乙個大整數,結構定義乙個大整數mpint如下:

typeclef struct

則q=mp.

return q;

5、明文的嵌入和恢復

明文資訊如何嵌入到橢圓曲線上也是橢圓曲線加密演算法的關鍵之一。橢圓曲線乙個點由x座標和y座標組成,因而乙個點就是由兩個數組成的數對,並且這兩個數都要在橢圓曲線的有限域上。本文採用如下方法進行明文編碼:

取一段明文作為橢圓曲線上點的x座標,然後按照橢圓曲線方程yz=x3+ax+b (modp)計算y座標的值,取明文的長度由有限域決定。若有限域長為192bit串,則取明文比特長應在1-191bit之間。由於本

系統高精度整數結構上處理的特點,需在取得的明文塊後加結束標誌字元char(255),所以當有限域比特長為192位時,所取的最大明文塊為22字元長。

由於本系統上的運算都是基於位元位的,且採用高精度整數結構,明文位元串和高精度整數之間需要乙個轉換過程。

(1)加密明文位元串的轉換

mp_digit只用28位元,乙個單元最多可存放三個半位元組。

實現將明文檔案的二進位制位元串轉換成mp_int數a的函式,主要迴圈部分說明如下:

//chlong為要存人的字元陣列長

for (j=o;j把7個字元放人mp_int的兩個單元中

明文恢復時,採用和上面相反的過程將mp_int數轉換成明文的二迸制位元串。

(2)密文的儲存結構

在檔案加密儲存中,需解決密文存入磁碟後如何讀入和區分每次加密的密文段的問題。本文是如下處理的:

儲存時先存*mp->dp的最高8位,再依次往下存後面3個8位。依據*mp->dp的特點,最高8位為0000***x,因此,可將255作為乙個密文段的結束標誌,把前一密文段和後一密文段區分開。這樣在密文檔案中,密文的訪問結構為:

用變數i記數,利用fgetc每次讀取乙個字元,當第i個字元是255,且i%4=0時截止。這時所讀的這段字元即為一次儲存的密文段。讀出密文段後,用相應的方法把密文段位元串轉換成mp_int型數。

二、橢圓曲線加密演算法的c語言實現

檔案加密、解密處理都是根據有限域大小分段進行的。加密時無論明文檔案的表現形式和內容如何,都將其組成成分看作是二進位制數字檔案。

檔案加密時,每次取一段二進位制明文,並在末尾附加乙個明文結束標誌字元char(255),以避免二進位制的明文讀入mpjnt數後出現高位位元位是0,導致出錯。取得明文後,產生乙個隨機整數r(r《有限域p),計算點c1=m+rk、c2=rg,將點c1、c2座標依次存入密文檔案。

檔案解密時,按前述方法讀入密文。根據c1-dc2=m+rk-k (rg)=m+rk-r(kg)=m計算c1-dc2(d為私鑰),得到明文點座標mx,myo其中兩點減的計算為p-q=p+(-q),其中-q=(x,-y),-y=p-y;計算c1-dc2完畢後按前面所述取解密文的方法取出解密字元,去掉最末的乙個char(255)符,存入解密文中,完成解密。

為驗證系統的檔案加密、解密功能,我們對文字檔案、bmp、word、excel等檔案進行了加密和解密測試。驗證結果表明,所給定的明文檔案經系統加密後,再對密文解密所得的解密文與原明文相比完全一致,沒有乙個位元的偏差,很好的實現了橢圓曲線加密演算法的功能。

小知識之橢圓曲線加密演算法

橢圓曲線加密演算法指的是由韋爾斯特拉斯(weierstrass)方程 y2+a1xy+a3y=x3+a2x2+a4x+a6 所確定的平面曲線。若f是乙個域,ai ∈f,i=1,2,…,6。滿足式1的數偶(x,y)稱為f域上的橢圓曲線e的點。f域可以式有理數域,還可以式有限域gf(pr)。橢圓曲線通常用e表示。除了曲線e的所有點外,尚需加上乙個叫做無窮遠點的特殊o。

橢圓曲線ECC加密演算法入門介紹

前言 同rsa ron rivest,adi shamir,len adleman三位天才的名字 一樣,ecc elliptic curves cryptography,橢圓曲線密碼編碼學 也屬於公開金鑰演算法。目前,國內詳細介紹ecc的公開文獻並不多 反正我沒有找到 有一些簡介,也是泛泛而談,看完...

對稱加密演算法和非對稱加密演算法的區別

1.對稱加密演算法加密和解密使用的金鑰的是相同的,也就是只有乙個金鑰,而非對稱加密演算法有兩個金鑰,也就是加密和解密所使用的金鑰是不同的 2.各自演算法不同 3.對稱加密演算法加密速度快 相對的 非對稱演算法,金鑰成對生成,公鑰對外發布,但是對大資料的加解密速度比對稱演算法慢。4.還有就是安全性不同...

c語言實現idea加密演算法

idea 資料加密演算法及實現 idea 對稱資料加密演算法,是我寫的第乙個關於加解密方面的演算法,在大學宿舍里弄了差不多將近二十個小時終於搞懂了。剛開始受到了 不良 資料的誤導走了很長時間的彎路,後來在圖書館看到了正確的介紹才終於把這個演算法給弄出來了。1 簡介idea,即國際資料加密演算法 是旅...