密码第十周

题目

NSSctf ez_enc

得到一个文件,打开可以看到一串A和B,
可以考虑培根密码,
https://www.qqxiuzi.cn/bianma/peigenmima.php
结果不对劲
也可以转二进制
A—>0
B—>1

def binary_to_text(binary_str):#二进制转字符串
    binary_str = binary_str.replace(' ', '').replace('0x', '').replace('\t', '').replace('\n', '')
    return ''.join(chr(int(binary_str[i * 8:i * 8 + 8], 2)) for i in range(len(binary_str) // 8))

file = open("D:\桌面\ez_enc", "rb").read().decode()
binaryValue = file.replace('A', '0').replace('B', '1')
hexValue = binary_to_text(binaryValue)
print(hexValue)

CTFshow_愚人杯 easybase

一串十六进制数
base16—>base32—>base64

CTFshow_愚人杯 大牛的密码

题目

from Crypto.Util.number import *
from flag import flag
from Crypto.Util.Padding import pad
from random import *
def s_box(a):
    box=[i for i in range(a)]
    shuffle(box) # 随机打乱box
    return box
BLOCK=16 #分块时的块长度
flag=pad(flag,BLOCK) #填充
S_BOX=s_box(len(flag)) #盒子长度=flag长度,flag中的每一个字符对应盒子中的每一个元素
m=[i for i in flag]
def swap(a,b): #交换
    tmp = a
    a = b
    b = tmp
def encrypt1(m):
    enc=[m[i:i+BLOCK] for i in range(0,len(m),BLOCK)]
    for i in enc:
        for j in range(BLOCK):
            aa=j*7%BLOCK
            swap(i[j],i[aa])
def encrypt2(m): #将明文列表中的元素按照S_BOX中的顺序重新排列
    for i in range(16):
        m=[m[i] for i in S_BOX]
    return m
encrypt1(m) # encrypto1没用
c=encrypt2(m)
print(S_BOX)
print(c)
'''
[9, 31, 32, 38, 20, 1, 22, 4, 8, 2, 11, 21, 7, 18, 46, 23, 34, 3, 19, 12, 45, 30, 27, 37, 5, 47, 28, 36, 0, 43, 39, 10, 29, 14, 40, 24, 33, 16, 17, 6, 42, 15, 26, 41, 44, 25, 35, 13]
[99, 111, 102, 11, 107, 49, 11, 53, 121, 48, 114, 117, 11, 95, 112, 95, 109, 115, 11, 95, 101, 95, 119, 117, 79, 123, 111, 48, 110, 95, 121, 116, 121, 125, 116, 11, 119, 11, 97, 67, 11, 11, 11, 11, 11, 99, 110, 104]
'''

主要是通过s_box查表进行了一次加密,解密也就是逆着查表回来。

exp

s_box = [9, 31, 32, 38, 20, 1, 22, 4, 8, 2, 11, 21, 7, 18, 46, 23, 34, 3, 19, 12, 45, 30, 27, 37, 5, 47, 28, 36, 0, 43, 39, 10, 29, 14, 40, 24, 33, 16, 17, 6, 42, 15, 26, 41, 44, 25, 35, 13]
c = [99, 111, 102, 11, 107, 49, 11, 53, 121, 48, 114, 117, 11, 95, 112, 95, 109, 115, 11, 95, 101, 95, 119, 117, 79, 123, 111, 48, 110, 95, 121, 116, 121, 125, 116, 11, 119, 11, 97, 67, 11, 11, 11, 11, 11, 99, 110, 104]

# enumerate()函数遍历c列表中的所有元素,并将其赋值给m列表中s_box[j]位置上
for i in range(16):
    m = [0] * len(s_box)
    for j, v in enumerate(c): 
        m[s_box[j]] = v
    c = m

print(bytes(m))

CTFshow_愚人杯 Comedy

import gmpy2, libnum
from secret import flag1, flag2

m = libnum.s2n(flag1)
assert m.bit_length() < 200  # 确保m<200
B = gmpy2.next_prime(libnum.s2n(flag2)) #B是比m大的下一个素数
A = (2022 - 2023 * m) % B
leak = pow(2, 2023, B)
print(A)
print(leak)
# 493275281479560936332761096886786925792234184811353209227551802099268192839677496844153534128991899414803550843408607188612593757622064753867565869035222715177143938385039508273050267347710495512806264863554858016145161165422812554800693811328453743229819656381224407015421235005940088439590887928051969351426291843586132741521121351667152673680122929827805479163871436776753859965413192837591532468372
# 238829196127128263156194898141748280130190920343265228257398802867203846004703877952990524473329125233083096275276064071930416561616135910190674099345267027039386328203653489152769309498199556401574021633071022874689081585677578010276529507102304828451681000682208089162940529052283763507244593173690786957816545746540436261888398732172965945762569416702401859253725696471593023885944262561159982327952

由题可得
A = ( 2022 − 2023 ∗ m ) m o d B A=(2022-2023*m) mod B A=(20222023m)modB
l e a k = 2 2023 m o d B leak=2^{2023} mod B leak=22023modB

Coppersmith算法


已知p高位,低位缺失,则采用coppersmith攻击。

截图源自
这道题的官方wp

exp

#sage
from Crypto.Util.number import *

A=493275281479560936332761096886786925792234184811353209227551802099268192839677496844153534128991899414803550843408607188612593757622064753867565869035222715177143938385039508273050267347710495512806264863554858016145161165422812554800693811328453743229819656381224407015421235005940088439590887928051969351426291843586132741521121351667152673680122929827805479163871436776753859965413192837591532468372
leak=238829196127128263156194898141748280130190920343265228257398802867203846004703877952990524473329125233083096275276064071930416561616135910190674099345267027039386328203653489152769309498199556401574021633071022874689081585677578010276529507102304828451681000682208089162940529052283763507244593173690786957816545746540436261888398732172965945762569416702401859253725696471593023885944262561159982327952

# A+2023*m-2022 = 0 % B
KB = pow(2,2023)-leak

PR.<m> = PolynomialRing(Zmod(KB))    #构建了一个模KB下的一元多项式环
f = A+2023*m-2022    #定义一元多项式f
f = f.monic()    #将f化为首项系数为1的最高次项的单项式,这样才能在多项式环中使用LLL算法找小根。
m = int(f.small_roots(X=2^200, beta=0.4)[0])
flag1 = long_to_bytes(m)

flag2 = gcd(A+2023*m-2022, KB)
flag2 = long_to_bytes(flag2)
flag=flag1+flag2
print(flag) 

关于small_roots函数(找多项式方程的小根)

X:一个整数,表示多项式的未知数 m 的最大位数,也就是说 m 的二进制位数不超过 X。
beta:一个浮点数,用于控制搜索多项式的根的范围。这个值越小,搜索的范围就越小,但可能会错过正确的解;这个值越大,搜索的范围就越大,但可能会找到多个解。

多项式环(PolynomialRing)中的小根算法(small_roots):

小根:绝对值最小的根

假设有一个模数为n的多项式f(x),且知道其次数为d,小根算法的目标就是在范围[0, B]中查找满足 f ( x ) ≡ 0 m o d n f(x)≡{0} mod n f(x)0modn的整数x,并返回最小的满足条件的x。

一个基于Coppersmith攻击的Sage脚本,用于解决小指数RSA加密的问题:

def coppersmith_attack(n, e, c, beta):
    """
    使用Coppersmith攻击来解决小指数RSA加密的问题
    """
    # 定义多项式环
    R.<x> = PolynomialRing(Zmod(n))

    # 定义多项式f(x),确保首项系数为1
    f = x**e - c

    # 计算多项式f(x)在x = 0时的值
    alpha = int(f(0))

    # 计算多项式f(x)在x = 0时的导数
    df = f.derivative()

    # 计算多项式g(x)
    g = df.monic()

    # 使用LLL算法找到g(x)的小根
    X = g.small_roots(beta)

    # 检查根是否存在
    if len(X) == 0:
        raise ValueError("没有找到小根")

    # 计算解密后的明文m
    m = pow(alpha, -1, n)
    for x in X:
        # 求解x + alpha * m的e次方模n的余数
        candidate = pow(x + alpha * m, e, n)

        # 检查是否解密成功
        if candidate == c:
            return x + alpha * m

    raise ValueError("解密失败")

CTFshow_愚人杯 easy_xor

题目

from Crypto.Util.number import *
from secret import flag

assert len(flag[8:-1])==23 # 根据这个断言可得flag长度,flag{......},(23+9)*8=256bit
m = bytes_to_long(flag)
p = getPrime(1024)
q = getPrime(1024)
n = p*q
e = 65537
c1 = m^p # 异或
c2 = pow(m,e,n)
print(f'c1 = {c1}')
print(f'c2 = {c2}')
print(f'n = {n}')
'''
c1 = 151198307301713399973545627808177783191262282577048906899567665485020342464366268384613589477129150406859219553325982275344405383612415523342568367197935454935162234419239807109194526080836070453102172720442102673200212658553214847476648456720629906051324248179394810385918370092764118401652990951968387233220
c2 = 7894512574379281106340582833782408137686355961537832816105517328532111343730615739255485918919146012721446905489729048235088965936700563973759759039693443386542070451737445467143517377017890468837697907596398070608179281207203217576205857817411996178441661371846647602166663752324880657668362355493701482869858528298247422875427747085642627978367348931707497113936723122393282697211257939351221141536029828744507560524637999804394951722319070365576391442828074457050403771353328835153787572457070779602728359333021922987279454923820866436212282592764768470608545881718922440010751845730974331917142224339664090863915
n = 20873587976264698212013861921447267548758723109929620330136081844796427967720295581580927324390713931549639540337285515365487607593546367886570408812338077846317206794057714877394609181224434104303259411081376607299962306250984285173463537669954845497211859940191392861121877814873939865829555350848523691546006073264112091406848179785659505299775196062799482197712761744192962658799557108701192680225134300686608396391566674966897700511638643429161735764600752699251493599533703928135311599575989253347234975026924804433742500175666009324057320386262109587593814197687132304704244158862263859846356497849518103755981
'''

从出题脚本中我们已经得到了flag的长度,c1的加密是一个异或操作,所以可以得知最后的结果只影响了低位,p的高位不变。那么这个问题就变成了已知p高位的低位缺失问题(p高位泄露)。恢复p,利用XOR的可逆性,得到flag

XOR—>p高位泄露

exp

#sage
from Crypto.Util.number import *
c1 =151198307301713399973545627808177783191262282577048906899567665485020342464366268384613589477129150406859219553325982275344405383612415523342568367197935454935162234419239807109194526080836070453102172720442102673200212658553214847476648456720629906051324248179394810385918370092764118401652990951968387233220
c2 =7894512574379281106340582833782408137686355961537832816105517328532111343730615739255485918919146012721446905489729048235088965936700563973759759039693443386542070451737445467143517377017890468837697907596398070608179281207203217576205857817411996178441661371846647602166663752324880657668362355493701482869858528298247422875427747085642627978367348931707497113936723122393282697211257939351221141536029828744507560524637999804394951722319070365576391442828074457050403771353328835153787572457070779602728359333021922987279454923820866436212282592764768470608545881718922440010751845730974331917142224339664090863915
n =20873587976264698212013861921447267548758723109929620330136081844796427967720295581580927324390713931549639540337285515365487607593546367886570408812338077846317206794057714877394609181224434104303259411081376607299962306250984285173463537669954845497211859940191392861121877814873939865829555350848523691546006073264112091406848179785659505299775196062799482197712761744192962658799557108701192680225134300686608396391566674966897700511638643429161735764600752699251493599533703928135311599575989253347234975026924804433742500175666009324057320386262109587593814197687132304704244158862263859846356497849518103755981

#分离出p的高位
kbits = 256 
c3 = c1>>kbits # 右移,舍去低位
pbits = 1024 
c4 = c3<<kbits # 左移,低位补0

x0 = f.small_roots(X=2^kbits, beta=0.4)[0]
p=c4+x0  #恢复p

m = c1.__xor__(int(p)) # 异或运算的可逆性

flag = long_to_bytes(m)
print(flag)

[HZNUCTF 2023 final]一步到喂

from Crypto.Util.number import *
from secret import flag,x,y
p=getPrime(512)
q=getPrime(512)
n=p*q
e=x
assert 1293023064232431070902426583269468463*pow(x,2)==105279230912868770223946474836383391725923*pow(y,2)+1293023064232431070902426583269468463
m=bytes_to_long(flag)
c=pow(m,e,n)
print(p,q)
print(c)
#9850212100620338486478343799784951721581757936621772924971218807300819701941457605399099898870264241518769370682330612103782092302148525012450902351701339
#10749429992014823019923966246896511618886613763258781706004694804949547801668777655988055847885755337127548775758133804022361510427909703124161450470578543
#66847321508502017574023222490247591875197038421108556106531660421662626233521063441647157067220450229816184622038471812597874582613385516838920632450015292570673816423432903604941781889308906893966588610214614726388822851471695742453496232748358301888465563812947038856742838097152549971517159475947566599664

满足等式
1293023064232431070902426583269468463 ∗ x 2 = 105279230912868770223946474836383391725923 ∗ y 2 + 1293023064232431070902426583269468463 1293023064232431070902426583269468463*x^2 = 105279230912868770223946474836383391725923*y^2 + 1293023064232431070902426583269468463 1293023064232431070902426583269468463x2=105279230912868770223946474836383391725923y2+1293023064232431070902426583269468463

pell(佩尔)方程

exp
求解佩尔方程

#判断b是否为a的整数倍,如果不是,会影响计算精度
a = 1293023064232431070902426583269468463
b = 105279230912868770223946474836383391725923
print(b//a*a == b)

import gmpy2
from math import ceil,floor,sqrt

#求解Pell方程中的最小整数解
def pell_minimum_solution(n):
    a = []
    m = floor(sqrt(n))
    sq = sqrt(n)
    a.append(m)
    b = m
    c = 1
    i = 1
    while a[i-1] != 2 * a[0]:
        c = (n - b * b) / c
        tmp = (sq + b) / c
        a.append(floor(tmp))
        i += 1
        b = a[i-1] * c - b
    p = 1
    q = 0
    for j in range(i-2,-1,-1):
        t = p
        p = q + p * a[j]
        q = t
    if (i-1) % 2 == 0:
        x0 = p
        y0 = q
    else:
        x0 = 2 * p ** 2 + 1
        y0 = 2 * p * q
    return x0,y0

print(pell_minimum_solution(b//a))

让聪明的gpt解释一下这个算法

普通RSA解密

from gmpy2 import *
from Crypto.Util.number import *

x,y = 706458746417678962043621845971467865659328419354757470370053791959400836343459667183452696881749102272803495561977766862981211957547107314899837090421877848369768126470488899783907413049018564965473411482320934865623338739674557285559179500448017722749519381238449907463225595410791751764554609076679816077991393296019025846726102143252917723127850421484059625048891687413514675773883846965460650321320194376953023128886680992904874680874592398084000621265936352579085146973168432725924933271736161246147210167219273151533549827720768127049, 2475817283208353655376575253824978610318795084158266693908795228437881838494879684898106300899685369783448887135772502375256424485378197701618246093404377305042144695942832777562138071372439272074221303824090898475856064751103068366460943484199764781203337540043797645872932430695841756685875430274803587032466826238694472049259595749567628655789857218392048459841779867350496912185026568130525427572795745011809179300697763422087575586151631990884275732162078972870311906763206309891911795517651173639547353468670434655436993030736217980
c = 66847321508502017574023222490247591875197038421108556106531660421662626233521063441647157067220450229816184622038471812597874582613385516838920632450015292570673816423432903604941781889308906893966588610214614726388822851471695742453496232748358301888465563812947038856742838097152549971517159475947566599664
p = 10749429992014823019923966246896511618886613763258781706004694804949547801668777655988055847885755337127548775758133804022361510427909703124161450470578543
q = 9850212100620338486478343799784951721581757936621772924971218807300819701941457605399099898870264241518769370682330612103782092302148525012450902351701339
d = gmpy2.invert(x,(p-1)*(q-1))

m = long_to_bytes(gmpy2.powmod(c,d,p*q))
print(m)

HD CTF2023_爬过小山去看云

题目

密文:ymyvzjtxswwktetpyvpfmvcdgywktetpyvpfuedfnzdjsiujvpwktetpyvnzdjpfkjssvacdgywktetpyvnzdjqtincduedfpfkjssne
在山的那头,有3个人,4只鸟,19只羊,11朵云

希尔Hill密码

基于矩阵的乘法,多表替换密码
加密:

  1. 有一个nxn的密钥矩阵
  2. 明文替换(A->0 B->1 …)明文分组(n个字母组成一个n维向量)
  3. 每组向量与密钥矩阵相乘,mod 26
  4. 将得到的每组数字再替换成字母,拼接起来

注意:用作加密的 n×n密钥矩阵必须是可逆的,否则无法解码。只有矩阵的行列式和26互质,才是可逆的。

解密:

  1. 得到密钥矩阵的逆矩阵
  2. 密文替换成数字,分组
  3. 每组向量与密钥逆矩阵相乘,mod 26
  4. 数字转字母,拼接

希尔密码特点:
1.密文为纯字母
2.有密钥(几个数组成,一串数字是无法判断的)

在线网站:希尔密码解密
本题得到

yourpiniseightfourtwozeroeightfourtwoonezeroeighteightfourzerotwofourzeroeightfourzeroonezeroonetwofourx

842084210884024084010124

云影密码(01248密码)

用0.1.2.4.8可以相加得到1-9中任意一个数字,用1-26代表对应的英文字母,密文中0为间隔符。

a = "842084210884024084010124"
a = a.split("0") # 根据0进行分割
flag = ''
for i in range(0, len(a)):
 	str = a[i]
 	sum = 0
 	for i in str:
 		sum += int(i)
 	flag += chr(sum + 64)
print(flag)

得到flag NOTFLAG

HD CTF2023_normal rsa

题目

from Crypto.Util.number import *
#from shin import flag

m=bytes_to_long(b'HDCTF{0b3663ed-67e4-44e2-aee7-7c2d8665b63c}') #原题flag泄露
e=65537
p=getPrime(256)
#q=getPrime(512)
q=6704006258427795304220450411280948926213189680360135534636452074716135019217911134480777251273836898349926894302122011679095979445240343891749741039976761
r=getPrime(512)
n=p*q*r
P=pow(p,2,n)  #P = p^2 mod n 
Q=pow(q,2,n)  #Q = q^2 mod n
c=pow(m,e,n)
print(f"P = {P}")
print(f"Q = {Q}")
print(f"n = {n}")
print(f"c = {c}")
'''
P = 6773247693445539441213578786581644136043035242620265251725630106817272212428325283262417364786451280269516220237289567904055371962564710888510272312707201
Q = 44943699913039047357456835559925378512493523252980366265686899925123157887149890185055864945749408514100461655676474535153113631214288057465776668291975220848776401405531599573114898492452990847774628035552581539370236080368457643523158920565504112005843410442573511095306233906498204203659537135943420051121
n = 4785613888465991171479248142015453309149548888755453367991501772592797686075465426815591528773123474962122102667475893532087343900904799831474817826058951265607078893487357878501280782935653048309499430170214015422492927323961394806106719569168457890040223027119115392961801582406287167644266319898276785787730947633037300317098453409851410936140488150390919951503767522517809035474567
c = 2247027561636791381460194811205520085150851211795956750955965051548230844233212462525163107917067768507367576366327035846089534916090521357212722275045521111077106695721780943857231570836500588468487620819893688830570842176795906808347617421353983094639290979158413935035603633331786978227439155042365130799647385116773171906670409535157184391352888875130028955334874727206292146950544
'''

因为 P = p 2 m o d n P=p^2 mod n P=p2modn Q = q 2 m o d n Q=q^2modn Q=q2modn,而 n = p ∗ q ∗ r n=p*q*r n=pqr从题中给出的数据可以看出 n > P n>P n>P n > Q n>Q n>Q,所以我们可以直接得出 P = p 2 P=p^2 P=p2 Q = q 2 Q=q^2 Q=q2
原来看到了 n = p ∗ q ∗ r n=p*q*r n=pqr 想到了ctfshow的funny rsa2,但是尝试之后发现这道题用funny rsa2的方法是解不出来的。在两道题的题解中放入

t = gmpy2.gcd(e, phi)
print(t)

就发现了在funny rsa2中e与phi是互素的,而在这道题中e与phi不互素,在这种情况下逆元d无解,得到的t=65537,说明了phi % e=0。在这里插入图片描述
截图来源

exp

from Crypto.Util.number import *
from gmpy2 import *
P = 6773247693445539441213578786581644136043035242620265251725630106817272212428325283262417364786451280269516220237289567904055371962564710888510272312707201
Q = 44943699913039047357456835559925378512493523252980366265686899925123157887149890185055864945749408514100461655676474535153113631214288057465776668291975220848776401405531599573114898492452990847774628035552581539370236080368457643523158920565504112005843410442573511095306233906498204203659537135943420051121
n = 4785613888465991171479248142015453309149548888755453367991501772592797686075465426815591528773123474962122102667475893532087343900904799831474817826058951265607078893487357878501280782935653048309499430170214015422492927323961394806106719569168457890040223027119115392961801582406287167644266319898276785787730947633037300317098453409851410936140488150390919951503767522517809035474567
c = 2247027561636791381460194811205520085150851211795956750955965051548230844233212462525163107917067768507367576366327035846089534916090521357212722275045521111077106695721780943857231570836500588468487620819893688830570842176795906808347617421353983094639290979158413935035603633331786978227439155042365130799647385116773171906670409535157184391352888875130028955334874727206292146950544
e = 65537
p = int(iroot(P,2)[0])
q = int(iroot(Q,2)[0])
# print(p)
#print(q)
r = n//(p*q)
d = inverse(e,(p-1)*(r-1))
print(long_to_bytes(pow(c,d,p*r)))

只需要用p和r去求e的逆元

HD CTF2023_normal rsa (revenge)

题目

from Crypto.Util.number import *
#from shin import flag

m=bytes_to_long(b'HDCTF{******}')
e=65537
p=getPrime(256)
q=getPrime(512)
r=getPrime(512)
n=p*q*r
P=pow(p,2,n)
Q=pow(q,2,n)
c=pow(m,e,n)
print(f"P = {P}")
print(f"Q = {Q}")
print(f"n = {n}")
print(f"c = {c}")
'''
P = 8760210374362848654680470219309962250697808334943036049450523139299289451311563307524647192830909610600414977679146980314602124963105772780782771611415961
Q = 112922164039059900199889201785103245191294292153751065719557417134111270255457254419542226991791126571932603494783040069250074265447784962930254787907978286600866688977261723388531394128477338117384319760669476853506179783674957791710109694089037373611516089267817074863685247440204926676748540110584172821401
n = 12260605124589736699896772236316146708681543140877060257859757789407603137409427771651536724218984023652680193208019939451539427781667333168267801603484921516526297136507792965087544395912271944257535087877112172195116066600141520444466165090654943192437314974202605817650874838887065260835145310202223862370942385079960284761150198033810408432423049423155161537072427702512211122538749
c = 7072137651389218220368861685871400051412849006784353415843217734634414633151439071501997728907026771187082554241548140511778339825678295970901188560688120351732774013575439738988314665372544333857252548895896968938603508567509519521067106462947341820462381584577074292318137318996958312889307024181925808817792124688476198837079551204388055776209441429996815747449815546163371300963785
'''

与上一题类似
在这道题中n被分解成了三个数p,q,r,并且e和phi是互素的,所以这道题和 funny rsa2 是一样的。
exp

from Crypto.Util.number import *
from gmpy2 import *
P = 8760210374362848654680470219309962250697808334943036049450523139299289451311563307524647192830909610600414977679146980314602124963105772780782771611415961
Q = 112922164039059900199889201785103245191294292153751065719557417134111270255457254419542226991791126571932603494783040069250074265447784962930254787907978286600866688977261723388531394128477338117384319760669476853506179783674957791710109694089037373611516089267817074863685247440204926676748540110584172821401
n = 12260605124589736699896772236316146708681543140877060257859757789407603137409427771651536724218984023652680193208019939451539427781667333168267801603484921516526297136507792965087544395912271944257535087877112172195116066600141520444466165090654943192437314974202605817650874838887065260835145310202223862370942385079960284761150198033810408432423049423155161537072427702512211122538749
c = 7072137651389218220368861685871400051412849006784353415843217734634414633151439071501997728907026771187082554241548140511778339825678295970901188560688120351732774013575439738988314665372544333857252548895896968938603508567509519521067106462947341820462381584577074292318137318996958312889307024181925808817792124688476198837079551204388055776209441429996815747449815546163371300963785
e = 65537
p = int(iroot(P,2)[0])
q = int(iroot(Q,2)[0])
# print(p)
#print(q)
r = n//(p*q)
# 解的时候,也可以不⽤三个,⽤两个(p和q、q和r、p和r)或⼀个(q或r)都⾏
d = inverse(e,(p-1)*(q-1)*(r-1))
print(long_to_bytes(pow(c,d,p*q*r)))

在使用欧拉函数时,只需要保证求得的数是逆元即可,而不需要知道每个质因数,因此可以只使用两个或一个质数来计算逆元。

HD CTF2023_math rsa

题目

from Crypto.Util.number import *
from shin import flag

m=bytes_to_long(flag)
r=getPrime(1024)
assert r%4==3
p=getPrime(1024)
assert pow(p,(r-1)//2,r)==1
q=getPrime(1024)
e=65537
n=p*q
a=pow(p,2,r)
c=pow(m,e,n)
print(f"n = {n}")
print(f"r = {r}")
print(f"a = {a}")
print(f"c = {c}")
'''
n = 14859096721972571275113983218934367817755893152876205380485481243331724183921836088288081702352994668073737901001999266644597320501510110156000004121260529706467596723314403262665291609405901413014268847623323618322794733633701355018297180967414569196496398340411723555826597629318524966741762029358820546567319749619243298957600716201084388836601266780686983787343862081546627427588380349419143512429889606408316907950943872684371787773262968532322073585449855893701828146080616188277162144464353498105939650706920663343245426376506714689749161228876988380824497513873436735960950355105802057279581583149036118078489
r = 145491538843334216714386412684012043545621410855800637571278502175614814648745218194962227539529331856802087217944496965842507972546292280972112841086902373612910345469921148426463042254195665018427080500677258981687116985855921771781242636077989465778056018747012467840003841693555272437071000936268768887299
a = 55964525692779548127584763434439890529728374088765597880759713360575037841170692647451851107865577004136603179246290669488558901413896713187831298964947047118465139235438896930729550228171700578741565927677764309135314910544565108363708736408337172674125506890098872891915897539306377840936658277631020650625
c = 12162333845365222333317364738458290101496436746496440837075952494841057738832092422679700884737328562151621948812616422038905426346860411550178061478808128855882459082137077477841624706988356642870940724988156263550796637806555269282505420720558849717265491643392140727605508756229066139493821648882251876933345101043468528015921111395602873356915520599085461538265894970248065772191748271175288506787110428723281590819815819036931155215189564342305674107662339977581410206210870725691314524812137801739246685784657364132180368529788767503223017329025740936590291109954677092128550252945936759891497673970553062223608
'''

整理题目给出的信息,
r ≡ 3 ( m o d 4 ) r ≡ 3 (mod 4 ) r3(mod4)
p ( r − 1 ) / / 2 ≡ 1 m o d ( r ) p^{(r-1)//2} ≡1 mod(r) p(r1)//21mod(r)
a ≡ p 2 m o d ( r ) a≡p^2mod(r) ap2mod(r)


二次剩余问题

Tonelli-Shanks算法

Tonelli –Shanks 算法(被 Shanks 称为 RESSOL 算法)用于模块化算术,以 r 2 ≡ n ( m o d p ) r^2 ≡ n (mod p ) r2n(modp)形式的同余求解r,其中p是素数:即,求n模p的平方根。

参考博客

exp

from Crypto.Util.number import isPrime, inverse, long_to_bytes
n = 14859096721972571275113983218934367817755893152876205380485481243331724183921836088288081702352994668073737901001999266644597320501510110156000004121260529706467596723314403262665291609405901413014268847623323618322794733633701355018297180967414569196496398340411723555826597629318524966741762029358820546567319749619243298957600716201084388836601266780686983787343862081546627427588380349419143512429889606408316907950943872684371787773262968532322073585449855893701828146080616188277162144464353498105939650706920663343245426376506714689749161228876988380824497513873436735960950355105802057279581583149036118078489
r = 145491538843334216714386412684012043545621410855800637571278502175614814648745218194962227539529331856802087217944496965842507972546292280972112841086902373612910345469921148426463042254195665018427080500677258981687116985855921771781242636077989465778056018747012467840003841693555272437071000936268768887299
a = 55964525692779548127584763434439890529728374088765597880759713360575037841170692647451851107865577004136603179246290669488558901413896713187831298964947047118465139235438896930729550228171700578741565927677764309135314910544565108363708736408337172674125506890098872891915897539306377840936658277631020650625
c = 12162333845365222333317364738458290101496436746496440837075952494841057738832092422679700884737328562151621948812616422038905426346860411550178061478808128855882459082137077477841624706988356642870940724988156263550796637806555269282505420720558849717265491643392140727605508756229066139493821648882251876933345101043468528015921111395602873356915520599085461538265894970248065772191748271175288506787110428723281590819815819036931155215189564342305674107662339977581410206210870725691314524812137801739246685784657364132180368529788767503223017329025740936590291109954677092128550252945936759891497673970553062223608
e = 65537
p = pow(a, (r+1) // 4, r)# p≡3(mod4) ===> p=pow(a,(r+1)//4,r)
if not isPrime(p):
 p = r - p
q = n//p
d = inverse(e, (p-1)*(q-1))
print(long_to_bytes(pow(c, d, n)))
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
国/家/网/络/安/全/宣/传/ 病毒软件 钓鱼网站 WIFI陷阱 关注网络安全 国家网络安全宣传介绍PPT全文共24页,当前为第1页。 1 网络安全主要特征 目 录 CONTENTS 2 网络安全相关法律 3 网络安全防护措施 国家网络安全宣传介绍PPT全文共24页,当前为第2页。 网络安全 主要特征 第一章 国家网络安全宣传介绍PPT全文共24页,当前为第3页。 清理微信僵尸粉诈骗 免费WIFI陷阱 信息丢失 病毒软件 钓鱼网站 01 网络安全主要特征 国家网络安全宣传介绍PPT全文共24页,当前为第4页。 网络安全 相关法律 第二章 国家网络安全宣传介绍PPT全文共24页,当前为第5页。 《中华人民共和国网络安全法》由全国人民代表大会常务委员会于2016年11月7日发布,自2017年6月1日起施行。《网络安全法》是我国第一部全面规范网络空间安全管理方面问题的基础性法律,是我国网络空间法治建设的重要里程碑,是依法治网、化解网络风险的法律重器,为网络安全工作提供切实法律保障。 相关法律 02 网络安全相关法律 国家网络安全宣传介绍PPT全文共24页,当前为第6页。 网络安全 防护措施 第三章 国家网络安全宣传介绍PPT全文共24页,当前为第7页。 使用电脑的过程中应采取什么措施 01 如何防范U盘、移动硬盘泄密 02 如何设置windows系统开机密码 03 如何将网页浏览器配置得更安全 04 计算机中毒有哪些症状 05 勿打开陌生的网页、电子链接或附件 06 03 网络安全防护措施 国家网络安全宣传介绍PPT全文共24页,当前为第8页。 接入移动硬盘或u盘为何先进行扫描 07 如何安全的使用WIFI 08 如何安全的使用智能手机 09 如何保护手机支付安全 11 防范骚扰电话、诈骗、垃圾短信 12 接入移动硬盘或u盘为何先进行扫描 13 接入移动硬盘或u盘先进行扫描 03 网络安全防护措施 国家网络安全宣传介绍PPT全文共24页,当前为第9页。 使用电脑的过程中应采取什么措施 1.安装防火墙和防病毒软件,并经常升级; 2.注意经常给系统打补丁,堵塞软件漏洞; 3.不要上一些不太了解的网站; 4.不要执行从网上下载后未经杀毒处理的软件; 5.不要打开MSN 或者QQ 上传送过来的不明文件等。 03 网络安全防护措施 国家网络安全宣传介绍PPT全文共24页,当前为第10页。 使用电脑的过程中应采取什么措施 及时查杀木马与病毒 从正规商家购买可移动存储介质 定期备份并加密重要数据 不要将办公与个人的可移动存储介质混用 03 网络安全防护措施 国家网络安全宣传介绍PPT全文共24页,当前为第11页。 如何设置windows系统开机密码 设置windows系统开机密码 1.使用鼠标点击"开始"菜单中的"控制面板"下的"用户账户", 2.点击"创建密码",输入两遍密码后按"创建密码"按钮即可。 03 网络安全防护措施 国家网络安全宣传介绍PPT全文共24页,当前为第12页。 如何将网页浏览器配置得更安全 设置统一、可信的浏览器初始页面; 定期清理浏览器中本地缓存、历史记录以及临时文件内容; 利用病毒防护软件对所有下载资源及时进行恶意代码扫描。 03 网络安全防护措施 国家网络安全宣传介绍PPT全文共24页,当前为第13页。 计算机中毒有哪些症状 文件打不开 经常报告内存不够 提示硬盘空间不够 经常死机 出现大量来历不明的文件 数据丢失 系统运行速度变慢 操作系统自动执行操作 03 网络安全防护措施 国家网络安全宣传介绍PPT全文共24页,当前为第14页。 勿打开陌生的网页、链接或附件 勿打开陌生的网页、电子链接或附件 不明来历的网页、电子邮件链接、附件中,很可能隐藏着大量的病毒、木马,一旦打开,这些病毒、木马会自动进入电脑并隐藏在电脑中,会造成文件丢失损坏甚至导致系统瘫痪。 03 网络安全防护措施 国家网络安全宣传介绍PPT全文共24页,当前为第15页。 接入移动硬盘或u盘为何先进行扫描 外接存储设备也是信息存储介质,所存的信息很容易带有各种病毒,如果将带有病毒的外接存储介质接入电脑,很容易将病毒传播到电脑中。 接入移动硬盘或u盘为何先进行扫描 03 网络安全防护措施 国家网络安全宣传介绍PPT全文共24页,当前为第16页。 如何安全的使用WIFI 警惕公共场所免费的无线信号为不法分子设置的 钓鱼陷阱,尤其是一些和公共场所内已开放的Wi-Fi 同名的信号。在公共场所使用陌生的无线网络时, 尽量不要进行与资金有关的银行转账与支付; 03 网络安全防护措施 国家网络安全宣传介绍PPT全文共24页,当前为第17页。 如何安全的使用智能手机 不要轻易打开陌生人通过手机发送的链接和文件; 为手机设置访问密码,
物理与电子工程学院 《微机原理与接口技术》 课程设计报告书 设计题目: 基于数字电路的电子密码锁 专 业: 自动化 班 级: 学生姓名: 学 号: 20140343 指导教师: 2015年6月15日 物理与电子工程学院课程设计任务书 专业: 自动化 班级: 1 "学生姓名" "学号 " " "课程名称"微机原理与接口技 "设计题目"基于数字电路的电子密码锁 " " "术 " " " "设计目的"设计目的: " "、主要内"1、掌握基于数字电路的硬件电路的设计方法。 " "容(参数"2、掌握Proteus Professional仿真软件的使用方法。 " "、方法)"设计主要内容及要求: " "及要求 "1、设计电子密码锁的总体方案,将连续的模拟量如直流电压转换成不 " " "连续的离散的数字形式并加以显示。 " " "2、模数转换芯片的选项及模数转换电路的设计。 " " "3、电压显示电路设计。 " " "4、根据技术要求进行硬件设计,画出系统电路原理图,最后对系统进 " " "行仿真调试。 " "工作量 "2时间,每天3学时,共计42学时 " "进度安排"第1天:明确课程设计的目的和意义,根据课程设计要求查找相关资料 " " "第2-3天:学习课程设计中用到的数字电路相关知识 " " "第4-5天:根据课程设计的要求完成硬件主要集成模块选择及硬件电路 " " "设计。 " " "第6-10天:学习Proteus " " "Professional仿真软件,绘制硬件电路原理图。 " " "第11-12天:通过Proteus Professional仿真软件,进行仿真调试。 " " "第13-14天:撰写课程设计报告。 " "主要参考"参考文献 " "资料 "[1].阎石 数字电路技术基础[M].高等教育出版社,2005 " " "[2].许琦.基于FPGA的电子密码锁的设计[J].科技信息,2006 " " "[3].李连华.基于FPGA的电子密码锁设计[J].中国科技信息,2006 " " "[4].童诗白 华成英 模拟电子技术基础[M].高等教育出版社,2006 " "指导教师" "教研室主任签字" " "签字 " " " " 目 录 摘 要 …………………………………………………………… 1 前言 …………………….…………………………………… 1.1 发展前景 ………….……………………………………… 1.2 研究目的和意义 …………………………………………… 1.3 基本要求…………………………………………………… 1.4 基本设计原理……………………………………………… 1.5 主要性能指标………………………………………………… 2 设计方案简述 ………………………………………………… 2.1 设计思路 …………………………………….…………….… 2.2 原理框图 ………………………………………………….… 2.3 设计原理分析 ………………………………………….… 3 详细设计……………..……………………..…………………… 3.1 密码锁单元电路设计 ……………………………………… 3.1.1密码识别电路 ……………………………………..………. 3.1.2秒脉冲产生电路..…………………………. 3.1.3倒计时电路 ……………………………………..……….… 3.1.4驱动蜂鸣器电路……………………………………..……. 3.1.5驱动继电器电路……………………………………..……… 3.2 密码锁总体电路设计 …………………………….………… 4总 结 ……..……………………………………………..…… 参考文献 …….…………………………..………………………. 摘 要 采用逻辑门电路设计电子密码锁,阐述了其工作原理,给出了具体的电路原理图。 该密码锁具有密码预置功能,保密性强,误码报警,并且报警时间可以设定,同时用数 码管显示出报警时间。密码正确时驱动继电器控制开锁指示灯,误码时报警信号由蜂鸣 器发出,声音为间歇式鸣笛。采用自行设计的5V稳压电源供电,具有耗电省等特点。使 用时用户必须按下确认按钮后方可知用户输入的密码是否与预置密码一致,当密码正确 时密码锁可以被打开,点亮绿色二极管亮代表密码正确,锁可以打开。密码不正确时按 下确认按钮,红色二极管被点亮,同时蜂鸣器鸣笛十秒,数码管显示十秒倒计时;倒计 时结束时,数码管显示00,对其产生的编码信号经门电路处理后转化为低电平信号,传 给秒脉冲电路控制端,使其停止工作,从而脉冲驱动的蜂鸣器也停止报警。 关键词: 电子密码锁;数字电路; 预置密码;误码报警 前 言 1.1背景及其发展前景 随着人们生活水平的提高,对家庭防盗技术的要求也是越来越高,传统的
数字电子密码锁课程设计全文共8页,当前为第1页。数字电子密码锁课程设计全文共8页,当前为第1页。数字电子密码锁课程设计 数字电子密码锁课程设计全文共8页,当前为第1页。 数字电子密码锁课程设计全文共8页,当前为第1页。 课程设计任务书学生姓名: 专业班级: 指导教师: 单位: 题目:《数字电子密码锁》初始条件: 利用集成集成芯片和门电路等设计一个数字电子密码锁。 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)(1)设计一个数字电子锁,有其预先设定好的密码,该密码可以修改。 (2)输入密码按确定键后,若密码正确则锁打开; 若密码不正确则电路发出报警信号。任意输入密码而不按确定键的话电路不会有反应。 (3)任意输入密码而不按确定键的话电路不会有反应。 (4)打开的持续时间为T某,警报持续时间也为T某,即按下确定键到松开后10秒,按住确定键不放的话一直打开或者报警。 时间安排: 第17理论讲解,地点:新3-205第18理论设计及实验安装调试,地点:鉴主15楼通信实验室第19撰写报告及答辩,地点:鉴主16楼报告厅指导教师签名: 年月日系主任(或责任教师)签名: 年月日目录1绪论11.1课程设计的目的11.2课程设计的任务及要求12工作原理及方案选择12.1电路设计的多种方案12.1.1方案一22.1.2方案二22.2电路设计方案的比较23电路设计及仿真33.1数字电子密码锁的设计原理框图33.2各组成部分电路的设计33.2.1密码输入及验证电路的工作原理33.2.2密码修改及输出锁定53.2.3计时模块63.2.4逻辑组合模块73.3数字电子密码锁的总电路图83.4电路参数的选择及计算84电路软件仿真104.1开锁的仿真104.2报警的仿真104.3数据测试115电路的安装与调试145.1焊接电路145.2总电路的调试数字电子密码锁课程设计全文共8页,当前为第2页。数字电子密码锁课程设计全文共8页,当前为第2页。155.3调试中遇到的问题及分析与总结156167附录177.1仪器仪表电子元器件明细清单177.2参考文献18摘要电子密码锁是一种通过密码输入来控制电路或是芯片工作,从而控制机械开关的闭合,完成开锁、闭锁任务的电子产品。它的种类很多,有简易的电路产品,也有基于芯片的性价比较高的产品。现在应用较广的电子密码锁是以芯片为核心,通过编程来实现的。其性能和安全性已大大超过了机械锁。其特点如下: (1)保密性好,编码量多。随机开锁成功率几乎为零。 数字电子密码锁课程设计全文共8页,当前为第2页。 数字电子密码锁课程设计全文共8页,当前为第2页。 (2)密码可变,用户可以随时更改密码,防止密码被盗,同时也可以避免因人员的更替而使锁的密级下降。 (3)误码输入保护,当输入密码多次错误时,报警系统自动启动。 (4)无活动零件,不会磨损,寿命长。 (5)使用灵活性好,不像机械锁必须佩带钥匙才能开锁。 1.2课程设计的任务及要求初始条件: 利用集成集成芯片和门电路等设计一个数字电子密码锁。 主要任务:(1)设计一个数字电子锁,有其预先设定好的密码,该密码可以修改。 (2)输入密码按确定键后,若密码正确则锁打开(此设计用发光二极管S表示锁,锁打开就是点亮发光二极管S); 若密码不正确则电路发出报警信号(用放光二级管J,报警就是点亮放光二级管J)。任意输入密码而不按确定键的话电路不会有反应。 (3)任意输入密码而不按确定键的话电路不会有反应。 数字电子密码锁课程设计全文共8页,当前为第3页。数字电子密码锁课程设计全文共8页,当前为第3页。(4)打开的持续时间为T某,警报持续时间也为T某,即按下确定键到松开后10秒,按住确定键不放的话一直打开或者报警。 数字电子密码锁课程设计全文共8页,当前为第3页。 数字电子密码锁课程设计全文共8页,当前为第3页。 2工作原理及方案选择2.1电路设计的多种方案自己设计制作数字电子密码锁,可以使用各种集成(译码器,555定时器,触发器),也可以采用单片机(如89C51)。由于自己知识范围的限制,并且为了进一步掌握数字电子技术的基本理论及实验调试技术,我在这次课程设计中采用集成芯片及门电路设计数字电子密码锁的设计方法。 2.1.1方案一设计选用单片机作为本设计的核心元件,利用单片机灵活的编程设计和丰富的I/O端口,及其控制的准确性,实现基本的密码锁功能。在单片机的外围电路外接输入键盘用于密码的输入和一些功能的控制,外接芯片用于密码的存储,外接LCD显示器用于显示作用。当用户需要开锁时,先按键盘开锁键之后按键盘的数字键0-9输入密码密码输完后按下确认键,如果密码输入正确则开锁,不正确显示密码错误重新输入密码,当三次密码错误则发出报警。除上述基本的密码锁功能外,声光提示等功能,依

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值