使用者a先選擇一條橢圓曲線eq(a,b),然後選擇其上的乙個生成元g,假設其階為n,之後再選擇乙個正整數na作為金鑰,計算pa=na*g。其中eq(a,b),q,g都會被公開。公鑰為pa。私鑰為na。
使用者b在向使用者a傳送訊息m,這裡假設訊息m已經被編碼為橢圓曲線上的點,其加密步驟如下:
1,查詢使用者a的公鑰eq(a,b),q,pa,g。
2,在(1,q-1) 的區間內選擇隨機數k 。
3,根據a的公鑰計算點(x1,y1)=kg。
4,計算點(x2,y2)=kpa。
5,如果為o,則從第二步重新開始。計算c=m+(x2,y2)
6,將((x1,y1),c)((x1,y1),c) 傳送給a。
解密步驟如下:
1,利用私鑰計算點na(x1,y1)=nakg=kpa=(x2,y2)na(x1,y1)。
2,計算訊息m=c−(x2,y2)。
1,橢圓曲線中計算g = p + q
p(x1,y1)
q(x2,y2)
對於 (y2)= (mod q)
g(x3,y3)
其中 x3 =(mod q)
y3 =(mod q)
其中 m = (y2-y1)[(x2-x1)(-1)]mod q #p != q
m = (3*(x12)+a)[(2y1)(-1)]mod q # p=q
其中 x-1 為x模q的逆元
例如 q = 23, x = 4 那麼 6便是它的乙個逆元 因為 46 = 24 =1mod2。
已知橢圓曲線加密ep(a,b)引數為:
p = 15424654874903
a = 16546484
b = 4548674875
g(6478678675,5636379357093)
私鑰為k = 546768
求公鑰k(x,y)
這裡知道原理後編寫指令碼求取公鑰:
gx =
6478678675
gy =
5636379357093
a =16546484
b =4548674875
p =15424654874903
k =546768
x = gx
y = gy
defpower
(x,y,mod)
: r =
1while
( y )
:if y &1:
r =(r * x)
% mod
x =(x * x)
% mod
y >>=1
return r
for i in
range
(k-1):
if(x==gx)
and(y == gy)
: m =((
(3*gx*gx)
+a)*power(
2*gy,p-
2,p))%p
else
: m =
((y-gy)
*power(x-gx,p-
2,p))%p
xr =
(m*m-gx-x)
%p yr =
(m*(x-xr)
-y)%p
x = xr
y = yr
print
(xr,yr,x+y)
密碼演算法之ElGamal初探
1,選取大素數p 採用miller和rabin素數測試快速得到 g屬於zp是乙個本原元,公開p和g。這裡zp 指的是p的素數域 即比p小的與它互素的數的集合 求一素數最小生成元的 temp input 請輸入素數p p int temp p need list range 1 p c 存放某一元的集...
ECC演算法介紹
ecc elliptic curves cryptography 加密演算法是一種公鑰加密演算法,與主流的rsa演算法相比,ecc演算法可以使用較短的金鑰達到相同的安全程度。近年來,人們對ecc的認識已經不再處於研究階段,開始逐步進入實際應用,如國家密碼管理局頒布的sm2演算法就是基於ecc演算法的...
現代密碼學之橢圓曲線ECC
橢圓曲線乘法 橢圓曲線結合 elgamal cryptosystem計算例子展示 手算帶步驟 判斷乙個橢圓曲線上有幾個點 reference ecc是由victor miller and neal koblitz1985引入的。對於dsa,rsa,我們需要很大的金鑰長度,而ecc只需要特別餓小的金鑰...