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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CTF-CRYPTO-ECC(1)

發(fā)布時間:2025/3/8 编程问答 41 如意码农
生活随笔 收集整理的這篇文章主要介紹了 CTF-CRYPTO-ECC(1) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

CTF—CRYPTO-ECC(1)

橢圓加密

1.簡介

橢圓曲線密碼學(Elliptic curve cryptography),簡稱 ECC,和RSA、ElGamel 算法等類似,是一種公開秘鑰加密的算法,也就是非對稱加密。ECC 被公認為在給定秘鑰長度下最安全的加密算法。ECC 依賴于解決大橢圓曲線離散對數(shù)問題的困難性。它的優(yōu)勢主要在于相對于其它方法,它可以在使用較短密鑰長度的同時保持相同的密碼強度。

2.ECC加解密

2.1密鑰生成

用戶A先選擇一條橢圓曲線

\[E_q(a, b)
\]

選擇其上的一個生成元G,假設(shè)其階為n,之后再選擇一個正整數(shù)

\[n_a
\]

將其作為密鑰,計算:

\[P_a=n_aG
\]

所以,公鑰為

\[P_a
\]

私鑰為:

\[n_a
\]
2.2加密

用戶 B 在向用戶 A 發(fā)送消息 m,這里假設(shè)消息 m 已經(jīng)被編碼為橢圓曲線上的點,其加密步驟如下

1.查詢用戶A的公鑰:

\[E_q(a,b),q,P_a,G
\]

2.在(1,q-1)的區(qū)間內(nèi)選擇隨機數(shù)k

根據(jù)A的公鑰計算

\[(x_1,y_1)=kG
\]

計算

\[(x_2,y_2)=kP_a
\]

如果為0,則從第二步重新開始

計算

\[C=m+(x_2,y_2)
\]

于是,發(fā)送給A的消息是

\[((x_1,y_1),C)
\]
2.3解密

利用私鑰計算

\[n_a(x_1,y_1)=n_akG=kP_a=(x_2,y_2)
\]

計算消息

\[m=C-(x_2,y_2)
\]

3.Pohlig-Hellman與ECC

設(shè)求解的式子為:

\[Q=l*P
\]

其中,P為我們選取的一個基點,l是我們選定的隨機數(shù),就是要求解的私鑰

首先取P的階n。可使得n*P不存在最小的正整數(shù)

設(shè)

\[n=(p_1)^{e_1}*(p_2)^{e_2}....(p_r)^{e_r}
\]

對于i屬于[1,r]

\[l_i=l\ mod\ p_i^{e_i}
\]

如果得到了這些 li 的值我們就能使用中國剩余定理進行求解得到 l 了,現(xiàn)在的問題就是求解這些

\[P_0=\frac{n}{p_i}P
\]
\[Q_0=\frac{n}{p_i}Q
\]

所以

\[Q_0=lP_0
\]
\[l_i*P=Q
\]
\[(z_0+z_1P_i+...+z_{e-1}P_i^{e-1})=Q_0
\]

\[z_0*P_0=Q_0
\]

所以

\[z_0P_0+(z_1p_i+...+z_{e-1}p_i^{e-1}P_0=Q_0)
\]
\[z_1p_i=Q_0-z_0P_0
\]

依次將zi全部算出來,然后用crt算出l

例題

[第五空間 2021]

task.py

print 'Try to solve the 3 ECC'

from secret import flag
from Crypto.Util.number import *
assert(flag[:5]=='flag{')
flag = flag[5:-1]
num1 = bytes_to_long(flag[:7])
num2 = bytes_to_long(flag[7:14])
num3 = bytes_to_long(flag[14:]) def ECC1(num):
p = 146808027458411567
A = 46056180
B = 2316783294673
E = EllipticCurve(GF(p),[A,B])
P = E.random_point()
Q = num*P
print E
print 'P:',P
print 'Q:',Q def ECC2(num):
p = 1256438680873352167711863680253958927079458741172412327087203
#import random
#A = random.randrange(389718923781273978681723687163812)
#B = random.randrange(816378675675716537126387613131232121431231)
A = 377999945830334462584412960368612
B = 604811648267717218711247799143415167229480
E = EllipticCurve(GF(p),[A,B])
P = E.random_point()
Q = num*P
print E
print 'P:',P
print 'Q:',Q
factors, exponents = zip(*factor(E.order()))
primes = [factors[i] ^ exponents[i] for i in range(len(factors))][:-1]
print primes
dlogs = []
for fac in primes:
t = int(int(P.order()) / int(fac))
dlog = discrete_log(t*Q,t*P,operation="+")
dlogs += [dlog]
print("factor: "+str(fac)+", Discrete Log: "+str(dlog)) #calculates discrete logarithm for each prime order
print num
print crt(dlogs,primes) def ECC3(num):
p = 0xd3ceec4c84af8fa5f3e9af91e00cabacaaaecec3da619400e29a25abececfdc9bd678e2708a58acb1bd15370acc39c596807dab6229dca11fd3a217510258d1b
A = 0x95fc77eb3119991a0022168c83eee7178e6c3eeaf75e0fdf1853b8ef4cb97a9058c271ee193b8b27938a07052f918c35eccb027b0b168b4e2566b247b91dc07
B = 0x926b0e42376d112ca971569a8d3b3eda12172dfb4929aea13da7f10fb81f3b96bf1e28b4a396a1fcf38d80b463582e45d06a548e0dc0d567fc668bd119c346b2
E = EllipticCurve(GF(p),[A,B])
P = E.random_point()
Q = num*P
print E
print 'P:',P
print 'Q:',Q ECC1(num1)
print '=============='
ECC2(num2)
print '=============='
ECC3(num3)

這題第一個部分就是簡單的離散對數(shù)法就可以解決,第二部分需要用到Pohlig-Hellman,順便提一下,dlog = discrete_log(t * Q, t * P,operation = "+")這句代碼中,dlog = discrete_log()可以自動換域,所以可以使用CRT

關(guān)于這個離散對數(shù)的問題,可以詳見

https://xz.aliyun.com/t/13919?time__1311=GqmxnD2D9A0QKGNDQieBK4YvxAKPrw7YLbD

EXP

from Crypto.Util.number import *
from sage.all import *
# Part1
from Crypto.Util.number import *
p = 146808027458411567
a = 46056180
b = 2316783294673
E = EllipticCurve(GF(p),(a,b))
P = E(119851377153561800,50725039619018388)
Q = E(22306318711744209,111808951703508717)
num1 = discrete_log(Q,P,operation = '+')
# Part2
p = 1256438680873352167711863680253958927079458741172412327087203
a = 377999945830334462584412960368612
b = 604811648267717218711247799143415167229480
E = EllipticCurve(GF(p),[a,b])
P = E(550637390822762334900354060650869238926454800955557622817950,700751312208881169841494663466728684704743091638451132521079)
Q = E(1152079922659509908913443110457333432642379532625238229329830,819973744403969324837069647827669815566569448190043645544592)
# Q = k * P
n = E.order()
def Pohlig_Hellman(n,P,Q):
factors, exponents = zip(*factor(n))
primes = [factors[i] ^ exponents[i] for i in range(len(factors))][:-1]
print(primes)
dlogs = []
for fac in primes:
t = int(int(P.order()) // int(fac))
dlog = discrete_log(t*Q,t*P,operation="+")
dlogs += [dlog]
print("factor: "+str(fac)+", Discrete Log: "+str(dlog)) #calculates discrete logarithm for each prime order
num2 = crt(dlogs,primes)
return num2
num2 = Pohlig_Hellman(n,P,Q)
# Part3
p = 0xd3ceec4c84af8fa5f3e9af91e00cabacaaaecec3da619400e29a25abececfdc9bd678e2708a58acb1bd15370acc39c596807dab6229dca11fd3a217510258d1b
A = 0x95fc77eb3119991a0022168c83eee7178e6c3eeaf75e0fdf1853b8ef4cb97a9058c271ee193b8b27938a07052f918c35eccb027b0b168b4e2566b247b91dc07
B = 0x926b0e42376d112ca971569a8d3b3eda12172dfb4929aea13da7f10fb81f3b96bf1e28b4a396a1fcf38d80b463582e45d06a548e0dc0d567fc668bd119c346b2
E = EllipticCurve(GF(p),[A,B])
P = E(10121571443191913072732572831490534620810835306892634555532657696255506898960536955568544782337611042739846570602400973952350443413585203452769205144937861,8425218582467077730409837945083571362745388328043930511865174847436798990397124804357982565055918658197831123970115905304092351218676660067914209199149610)
Q = E(964864009142237137341389653756165935542611153576641370639729304570649749004810980672415306977194223081235401355646820597987366171212332294914445469010927,5162185780511783278449342529269970453734248460302908455520831950343371147566682530583160574217543701164101226640565768860451999819324219344705421407572537)
def SmartAttack(P,Q,p):
E = P.curve()
Eqp = EllipticCurve(Qp(p, 2), [ ZZ(t) + randint(0,p)*p for t in E.a_invariants() ])
P_Qps = Eqp.lift_x(ZZ(P.xy()[0]), all=True)
for P_Qp in P_Qps:
if GF(p)(P_Qp.xy()[1]) == P.xy()[1]:
break
Q_Qps = Eqp.lift_x(ZZ(Q.xy()[0]), all=True)
for Q_Qp in Q_Qps:
if GF(p)(Q_Qp.xy()[1]) == Q.xy()[1]:
break
p_times_P = p*P_Qp
p_times_Q = p*Q_Qp
x_P,y_P = p_times_P.xy()
x_Q,y_Q = p_times_Q.xy()
phi_P = -(x_P/y_P)
phi_Q = -(x_Q/y_Q)
k = phi_Q/phi_P
return ZZ(k)
num3 = SmartAttack(P, Q, p)
print(b'NSSCTF{' + long_to_bytes(num1) + long_to_bytes(num2) + long_to_bytes(num3) + b'}')

總結(jié)

以上是生活随笔為你收集整理的CTF-CRYPTO-ECC(1)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 国产av一区精品 | 国产网站免费观看 | 日日夜夜艹 | 成人免费视频网站在线看 | 制服丝袜在线播放 | 久久天 | 不卡影院一区二区 | 毛片无码一区二区三区a片视频 | 狠狠gao | 亚洲av无码精品色午夜 | 好色综合 | 日韩av不卡一区 | 日日日干干干 | 秘密的基地 | 色吧久久 | 欧美情侣性视频 | 日日摸天天爽天天爽视频 | 影音先锋在线观看视频 | 爱逼综合网 | 欧美亚洲三级 | 91视频精选 | 97视频免费在线观看 | 免费国产一区二区 | √8天堂资源地址中文在线 欧美精品在线一区二区 | 国产男女猛烈无遮挡免费观看网站 | 一区二区欧美日韩 | av动态 | 亚洲AV无码成人精品区明星换面 | 免费裸体视频女性 | 韩国三级hd中文字幕的背景音乐 | 91精品国产闺蜜国产在线闺蜜 | www.日本在线视频 | 久久久久久久伊人 | 国产亚洲成av人片在线观看桃 | 东北少妇露脸无套对白 | 特种兵之深入敌后 | 天天摸天天看 | 国产精品国产精品国产专区不片 | 亚洲精品aaaa | 领导揉我胸亲奶揉下面 | 伊人色爱 | 中文字幕av专区 | 国产黄色大片视频 | 最近最新mv字幕观看 | 91九色国产在线 | 国产青草视频 | 青青成人网 | 日韩精品一区二区亚洲av | 亚洲图色av | 制服丝袜天堂网 | caoporen超碰 | 精品午夜一区二区三区在线观看 | xfplay5566色资源网站 | 亚洲人 女学生 打屁股 得到 | 国产又黄又骚 | av天天有 | 毛片在线免费观看网址 | 日韩精品人妻一区 | 国产精选毛片 | 国产污视频 | 少妇一区二区三区 | 亚洲狠狠爱 | 无码任你躁久久久久久久 | 狼人久久| 日韩毛片一区二区三区 | 嫩草影院懂你的 | missav在线| 中文字幕一区二区三 | 久久久久久久久久成人 | 韩国短剧在线观看 | 露脸啪啪清纯大学生美女 | 男男做爰猛烈叫床爽爽小说 | 欧美一区二区高清 | 久久亚洲国产精品 | 波多野结衣视频免费看 | 亚洲深夜视频 | 日韩最新在线 | 人妻 丝袜美腿 中文字幕 | 狠狠操夜夜爽 | 国产精品欧美在线 | 神马电影久久 | 亚洲天堂精品一区 | 一道本在线播放 | 国产91免费看 | 午夜精产品一区二区在线观看的 | 国产午夜视频在线 | 97在线观看视频免费 | 99精品无码一区二区 | 成人黄色一区二区三区 | 领导揉我胸亲奶揉下面 | 网站黄色在线观看 | 91蜜桃在线 | 白白色在线观看 | av色资源 | 亚洲 欧美 精品 | 热久久精品免费视频 | 深夜影院在线观看 | 亚洲福利视频网 | 欧美黑人一区二区三区 |