1.Working with Fields
这里的主要目的是算乘法逆元d
我们有RSA中算乘法逆元的基础这里就很快了,找到“e”和“phi”就是题目中的“g”和"N"
# Diffie-Hellman算法
import gmpy2
p=991
N=991
g=209
d=gmpy2.invert(g, N)
print(d)
#569
2.Generators of Groups
这里算的是原根
在一个模数为p的剩余系中,如果存在一个整数g,它的幂可以生成整个剩余系,那么g就被称为p的一个原根。
简单的来说就是,如果g是原根,对于这个剩余系中的元素a(0=<a<=p-1),都可以以的形式表示出来
如何求原根?
常用的有两种方法:原根判别法和试除法。(对于一些已知的特殊模数,如素数和Carmichael数,可以直接查表得知)
素数原根表 - LzyRapx - 博客园 (cnblogs.com)
如果p的原根存在的话,那么原根一定是唯一的,其个数为 其中为欧拉函数
# 原根
from sympy.ntheory import is_primitive_root
p = 28151
g = 2
while not is_primitive_root(g, p):
g += 1
print(g)
# # 7
3.Computing Public Values
(没截数字)
算A,有公式按公式写就可(pow()也是RSA讲过的内容,不懂的可以翻一下)
g=2
p=2410312426921032588552076022197566074856950548502459942654116941958108831682612228890093858261341614673227141477904012196503648957050582631942730706805009223062734745341073406696246014589361659774041027169249453200378729434170325843778659198143763193776859869524088940195577346119843545301547043747207749969763750084308926339295559968882457872412993810129130294592999947926365264059284647209730384947211681434464714438488520940127459844288859336526896320919633919
a=972107443837033796245864316200458246846904598488981605856765890478853088246897345487328491037710219222038930943365848626194109830309179393018216763327572120124760140018038673999837643377590434413866611132403979547150659053897355593394492586978400044375465657296027592948349589216415363722668361328689588996541370097559090335137676411595949335857341797148926151694299575970292809805314431447043469447485957669949989090202320234337890323293401862304986599884732815
print(pow(g,a,p))
# 1806857697840726523322586721820911358489420128129248078673933653533930681676181753849411715714173604352323556558783759252661061186320274214883104886050164368129191719707402291577330485499513522368289395359523901406138025022522412429238971591272160519144672389532393673832265070057319485399793101182682177465364396277424717543434017666343807276970864475830391776403957550678362368319776566025118492062196941451265638054400177248572271342548616103967411990437357924
4.Computing Shared Secrets
目的为了算g^{a*b} mod p
要么算要么算
题目有A和b还有p,直接用第一种就可以
p=2410312426921032588552076022197566074856950548502459942654116941958108831682612228890093858261341614673227141477904012196503648957050582631942730706805009223062734745341073406696246014589361659774041027169249453200378729434170325843778659198143763193776859869524088940195577346119843545301547043747207749969763750084308926339295559968882457872412993810129130294592999947926365264059284647209730384947211681434464714438488520940127459844288859336526896320919633919
g = 2
A=70249943217595468278554541264975482909289174351516133994495821400710625291840101960595720462672604202133493023241393916394629829526272643847352371534839862030410331485087487331809285533195024369287293217083414424096866925845838641840923193480821332056735592483730921055532222505605661664236182285229504265881752580410194731633895345823963910901731715743835775619780738974844840425579683385344491015955892106904647602049559477279345982530488299847663103078045601
b= 12019233252903990344598522535774963020395770409445296724034378433497976840167805970589960962221948290951873387728102115996831454482299243226839490999713763440412177965861508773420532266484619126710566414914227560103715336696193210379850575047730388378348266180934946139100479831339835896583443691529372703954589071507717917136906770122077739814262298488662138085608736103418601750861698417340264213867753834679359191427098195887112064503104510489610448294420720
B= 518386956790041579928056815914221837599234551655144585133414727838977145777213383018096662516814302583841858901021822273505120728451788412967971809038854090670743265187138208169355155411883063541881209288967735684152473260687799664130956969450297407027926009182761627800181901721840557870828019840218548188487260441829333603432714023447029942863076979487889569452186257333512355724725941390498966546682790608125613166744820307691068563387354936732643569654017172
print(pow(A,b,p))
# 1174130740413820656533832746034841985877302086316388380165984436672307692443711310285014138545204369495478725102882673427892104539120952393788961051992901649694063179853598311473820341215879965343136351436410522850717408445802043003164658348006577408558693502220285700893404674592567626297571222027902631157072143330043118418467094237965591198440803970726604537807146703763571606861448354607502654664700390453794493176794678917352634029713320615865940720837909466