日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 综合教程 >内容正文

综合教程

ECC椭圆曲线加密算法—加解密(SageMath实现)

發(fā)布時(shí)間:2023/12/13 综合教程 35 生活家
生活随笔 收集整理的這篇文章主要介紹了 ECC椭圆曲线加密算法—加解密(SageMath实现) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

簡(jiǎn)介

ECC橢圓曲線加密,它的安全性基于橢圓曲線上的離散對(duì)數(shù)問(wèn)題。

比特幣和目前的二代居民身份證都采用了ECC作為加密算法。

ECC橢圓曲線函數(shù)為:

[y^{2}=x^{3}+ax+b (mod p)
]

ECC算法如下:

橢圓曲線Ep(a,b)(p為模數(shù)),基點(diǎn)(生成元)G(x,y),G點(diǎn)的階數(shù)n,私鑰k,公鑰K(x,y),隨機(jī)整數(shù)r,明文為一點(diǎn)m(x,y),密文為兩點(diǎn)c1(x,y)和c2(x,y)
(其中基點(diǎn)G,明文m,密文c1、c2都是橢圓曲線E上的點(diǎn))
選擇私鑰k(k<n)
得到公鑰K = k*G
選擇隨機(jī)整數(shù)r(r<n)
加密:
c1 = m+r*K
c2 = r*G
解密:
m = c1-k*c2(= c1-r*K)

關(guān)于橢圓曲線的更多知識(shí),可以參考Kalafinaian師傅的文章:https://www.cnblogs.com/Kalafinaian/p/7392505.html

SageMath可以直接計(jì)算橢圓曲線加法和橢圓曲線乘法。

橢圓曲線運(yùn)算(SageMath):

點(diǎn)u(x,y),整數(shù)a,點(diǎn)v(x,y),點(diǎn)w(x,y)
a_inv = inverse_mod(a,p) #a_inv是a關(guān)于模p的乘法逆元a_inv
v = a*u
u = v*a_inv
w = u+v

加解密腳本

SageMath加密腳本:

'''
加密
橢圓曲線選取時(shí),模數(shù)p應(yīng)是一個(gè)大質(zhì)數(shù)
常用的有幾個(gè)公開(kāi)的橢圓曲線,如Secp256k1、Secp256r1等
'''
p = 115792089210356248762697446949407573530086143415290314195533631308867097853951
a = 115792089210356248762697446949407573530086143415290314195533631308867097853948
b = 41058363725152142129326129780047268409114441015993725554835256314039467401291
E = EllipticCurve(GF(p),[a,b]) #建立橢圓曲線E
G = E(101981543389703054444906888236965100227902100585263327233246492901054535785571,105947302391877180514060433855403037184838385483621546199124860815209826713886) #選擇一點(diǎn)作為生成元
n = G.order() #G的階數(shù)
k = 78772200542717449282831156601030024198219944170436309154595818823706214492400
K = k*G
r = 3546765
m = E(80764032034929976879602863302323059647882062252124869895215418422992624743795,4964654783828069942602279691168356721024126126864424301508238062949726916347) #取E上一點(diǎn)m作為明文
c1 = m+r*K
c2 = r*G
print(c1)
print(c2)

SageMath解密腳本:

'''解密'''
p = 115792089210356248762697446949407573530086143415290314195533631308867097853951
a = 115792089210356248762697446949407573530086143415290314195533631308867097853948
b = 41058363725152142129326129780047268409114441015993725554835256314039467401291
k = 78772200542717449282831156601030024198219944170436309154595818823706214492400
E = EllipticCurve(GF(p),[a,b]) #建立橢圓曲線E
c1 = E(55527726590533087179712343802771216661752045890626636388680526348340802301667,99976146729305231192119179111453136971828647307627310904093286590128902629941)
c2 = E(85460365972589567444123006081329559170090723413178386022601904195400422637884,58249081362527056631776731740177334121295518073095154119886890634279528757192)
m = c1-k*c2
print(m)

其他

使用Crypto.PublicKey.ECC生成ECC密鑰:

from Crypto.PublicKey import ECC

#生成ECC密鑰
key = ECC.generate(curve='NIST P-256') #使用橢圓曲線NIST P-256

#輸出密鑰(包括私鑰k,基點(diǎn)G)
print(key)

#公鑰(point_x,point_y是基點(diǎn)G的坐標(biāo))
print(key.public_key())

#橢圓曲線
print(key.curve)

#私鑰k
print(key.d)

#導(dǎo)出為pem密鑰文件
print(key.export_key(format='PEM'))

#導(dǎo)入密鑰文件
key = ECC.import_key(f.read())

通過(guò)fastecdsa.Curve可以查到公開(kāi)橢圓曲線的參數(shù)

import fastecdsa.curve as curve

#P-384的a
curve.P384.a

#P-384的b
curve.P384.b

#P-384的p
curve.P384.p

幾種公開(kāi)橢圓曲線參數(shù):

#NIST P-256(Secp256r1)
#p =2^224(2^32 ? 1) + 2^192 + 2^96 ? 1
p = 115792089210356248762697446949407573530086143415290314195533631308867097853951
a =115792089210356248762697446949407573530086143415290314195533631308867097853948
b =41058363725152142129326129780047268409114441015993725554835256314039467401291

#Secp256k1(比特幣使用)
#p = 2^256 ? 2^32 ? 2^9 ? 2^8 ? 2^7 ? 2^6 ? 2^4 ? 1 = 2^256 – 2^32 – 977 
p = 115792089237316195423570985008687907853269984665640564039457584007908834671663
a = 0
b = 7

#NIST P-384
#p = 2^384 – 2^128 – 2^96 + 2^32 – 1
p = 39402006196394479212279040100143613805079739270465446667948293404245721771496870329047266088258938001861606973112319
a = -3
b = 27580193559959705877849011840389048093056905856361568521428707301988689241309860865136260764883745107765439761230575

#NIST P-521
p = 6864797660130609714981900799081393217269435300143305409394463459185543183397656052122559640661454554977296311391480858037121987999716643812574028291115057151
a = -3
b = 1093849038073734274511112390766805569936207598951683748994586394495953116150735016013708737573759623248592132296706313309438452531591012912142327488478985984

SageMath取橢圓曲線上隨機(jī)一點(diǎn):

E = EllipticCurve(GF(p),[a,b])
E.random_point() #取橢圓曲線E上隨機(jī)一點(diǎn)

sagemath計(jì)算橢圓曲線上的離散對(duì)數(shù)問(wèn)題(數(shù)據(jù)量不能太大)

a = 1234577
b = 3213242
p = 7654319
E = EllipticCurve(GF(p),[a,b])
G = E(5234568, 2287747) #生成元
#k = 1584718
K = E(2366653, 1424308) #公鑰

#求解私鑰,自動(dòng)選擇bsgs或Pohlig Hellman算法
discrete_log(K,G,operation='+')

#求解私鑰,Pollard rho算法
discrete_log_rho(K,G,operation='+')

#求解私鑰,Pollard Lambda算法,能夠確定所求值在某一小范圍時(shí)效率較高
discrete_log_lambda(K,G,(1500000,2000000),operation='+')

使用openssl查看ECC的pem密鑰文件信息

#查看ECC私鑰信息
openssl ec -in p384-key.pem -text -noout

#查看ECC公鑰信息
openssl ec -pubin -in public.pem -text -noout

總結(jié)

以上是生活随笔為你收集整理的ECC椭圆曲线加密算法—加解密(SageMath实现)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。