ECC椭圆曲线加密
ECC椭圆曲线加密椭圆曲线加密是非对称加密的一种与RSA一样是基于单陷门的加密方式利用的是离散对数问题。首先需要知道什么是椭圆曲线椭圆曲线的表示方法是什么再就是加密和解密方式。ECC椭圆曲线表示方法表达式y2 x3 a x b其中要求 4 a3- 27 b2! 0大致图像如下而在椭圆曲线上定义了两种运算一种是点加另一种是点倍。1. 点加点加就是两个点加的运算但这里的加是椭圆曲线上定义的加法并非正常使用的 112 .举个例子在椭圆曲线上取两个不同的点 A和B 连接两个点并做直线交于椭圆曲线上一点根据交点得到关于x轴对称的点即为两个点的点加结果 AB 。2. 点倍点倍类似于点加选取椭圆曲线上的一个点A作关于点的切线交椭圆曲线上的另一点交点关于x轴堆成得到的点即为 2A。由于图象是连续的点是无穷多个所以需要将椭圆曲线定义在有限域上使点的数量为有限个。由于椭圆曲线是在有限域上所以可以通过这条特征结合离散对数对数据进行加密。加密1. 定义一个椭圆曲线 Ep(a,b) 并选取一个基点 PEp(a,b) p 为有限域 mod p a和b为曲线中的参数a和b。基点 P 就是点倍的首个点。2. 选取大数 k 作为私钥并生成公钥 Qk*P私钥 k 在现实中是很大的。3. 选取随机数 r 并根据明文 M 生成密文 Cr 是随机数M 是明文将其转为数字一般作为 x 坐标带入到椭圆曲线 E 中求出对应的 y然后得到 M 在椭圆曲线中的明文点 m ( xM, yM)。C 是密文一个点对为 ( r P , m r Q ) 其中 Ep(a,b) 、P、Q 为公开的k 为私钥保密。解密解密直接根据加密得到的密文进行分析m r Q m r k P // Q k Pr P 已知要得到明文 M 就需要得到 m点的 x坐标而求 m 就需要知道 k m r k P - r P k m // 但 k 未知所以需要知道 kk 求出来了m点就好求了m点求出来了就能得到 M ( M 为 m 的 x坐标 )。但是由于单陷门问题求 k 很困难所以就有了 ECC椭圆曲线加密。不想看文字的可以看 B站博主 可厉害的土豆 的视频。没有基础的话初学很艰难理解了之后多看多练就慢慢的会了。附上一道例题这是加密代码# 来自[HGAME_2022_week4]ECCfromCrypto.Util.numberimportgetPrimefromlibnumimports2nfromsecretimportflag pgetPrime(256)agetPrime(256)bgetPrime(256)EEllipticCurve(GF(p),[a,b])mE.random_point()GE.random_point()kgetPrime(256)Kk*G rgetPrime(256)c1mr*K c2r*G cipher_lefts2n(flag[:len(flag)//2])*m[0]cipher_rights2n(flag[len(flag)//2:])*m[1]print(fp {p})print(fa {a})print(fb {b})print(fk {k})print(fE {E})print(fc1 {c1})print(fc2 {c2})print(fcipher_left {cipher_left})print(fcipher_right {cipher_right}) p 74997021559434065975272431626618720725838473091721936616560359000648651891507 a 61739043730332859978236469007948666997510544212362386629062032094925353519657 b 87821782818477817609882526316479721490919815013668096771992360002467657827319 k 93653874272176107584459982058527081604083871182797816204772644509623271061231 E Elliptic Curve defined by y^2 x^3 61739043730332859978236469007948666997510544212362386629062032094925353519657*x 12824761259043751634610094689861000765081341921946160155432001001819005935812 over Finite Field of size 74997021559434065975272431626618720725838473091721936616560359000648651891507 c1 (14455613666211899576018835165132438102011988264607146511938249744871964946084 : 25506582570581289714612640493258299813803157561796247330693768146763035791942 : 1) c2 (37554871162619456709183509122673929636457622251880199235054734523782483869931 : 71392055540616736539267960989304287083629288530398474590782366384873814477806 : 1) cipher_left 68208062402162616009217039034331142786282678107650228761709584478779998734710 cipher_right 27453988545002384546706933590432585006240439443312571008791835203660152890619 题目是入门级的看懂加解密过程就能解。由于 k 已经给出来了所以直接解密就行了。c1 - c2 * k m下面是解密脚本需要在 sage 环境下。fromsage.allimport*fromCrypto.Util.numberimportlong_to_bytes p74997021559434065975272431626618720725838473091721936616560359000648651891507a61739043730332859978236469007948666997510544212362386629062032094925353519657b87821782818477817609882526316479721490919815013668096771992360002467657827319k93653874272176107584459982058527081604083871182797816204772644509623271061231EEllipticCurve(GF(p),[a,b])c1E([14455613666211899576018835165132438102011988264607146511938249744871964946084,25506582570581289714612640493258299813803157561796247330693768146763035791942])c2E([37554871162619456709183509122673929636457622251880199235054734523782483869931,71392055540616736539267960989304287083629288530398474590782366384873814477806])cipher_left68208062402162616009217039034331142786282678107650228761709584478779998734710cipher_right27453988545002384546706933590432585006240439443312571008791835203660152890619# 解密mc1-k*c2 clcipher_left//m[0]crcipher_right//m[1]cmlong_to_bytes(int(cl))long_to_bytes(int(cr))print(m)print(cl)print(cr)print(cm) (57824879640955326550732559538097319221644125075532201058220628014917816573008 : 54475275866179647254036565579467398677511796158866832907668620448532510526757 : 1) 493033149237009446036260 127480900256551022095393917 bhgame{Ecc$is!sOHaRd} 最后直接解出明文hgame{Ecc$is!sOHaRd}相关资料来自 B站博主 可厉害的土豆 视频截图以上内容均为个人理解如果内容有误或不清楚的地方请指正谢谢