记一道rsa题目

Crypto-Continued_fraction

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

m1 = bytes_to_long("flag{**********")
m2 = bytes_to_long("***************}")
e = 0x10001
p1=getPrime(512)
q1=getPrime(512)
n1 = p1*p1*p1*p1*p1*q1
p2 = getPrime(512)
hint= p1//(2022*q1*p2)+1
q2 = randint(p1,p1+hint)
assert isPrime(p2)
n2 = p2*q2*q2*q2*q2*q2
c1 = pow(m1,e,n1)
c2 = pow(m2,e,n2)
print("n1=",n1)
print("n2=",n2)
print("c1=",c1)
print("c2=",c2)

# n1= 1256153302556722997835679485829871808209901877944658368294633380086039408209637188283648561974710208562420741204863668125373241516909427306739638768582394391661155157329008815783003303268567732455689976681585719180341791879262235261804780291172646163735569766134496283369776876010433765550597807557716740369078630640629164056123730434939865702582297649206877992510218914493158109915659245977470879976045951953520845428717845238737381501004186574867828363490038297060142964599736049326285646322631112277122289112238935311758549326725559220188899102270828155680789659302591782729536182848762707696215273010646878701028580606341865318406958340196626036013889917779504807663048327842005146211390991643204265514403828323182286983607461509750859161392868951803250718502430595154630844863204136754825203448059235932426723373812958290492927375792457551041464503622981270187813181683705800678105184791224152356667342466450291837456587
# n2= 1197629325190380699374154128374513283820240508821461857430115674113727047293237281127074814227816406157740605135583333664729226869731385678693946183795222888181174575584200136367082503497480853823603769374075912819200587854120171575320112658694639845299676212762187920588396645028444278961588563075638955700989205301920429678357303440841144388921662935109491390033220158222065055652765734940667449637287741783098057517927165840885201990788219503352883314434530198352746142587272387252244739608996358591480242676653170679025554434143849593378462666666170040113198957024953263969979014590685909232969322886865119889612277827254420993904268068435829747543789521624579459660937906125103686937705250459042164404148908258218791466046423503711451547418585736801420769503175880623550310687599137930182497726859069348327075914150715506160538909443106998347917970480446556323094447246836747858707877134905173088467627177471146007736151
# c1= 710845091991380398216733721136006610592361788281046186261035950037696217252772309636540595252970682415638821035841466715754193881889268349770256847384533983912090666113165051957000028445124008234754655483172991257455376698273597295387435177431393496727377669078123014921967229546948512850153154166917157214759642269095531059598553219933340611301435705789734492306061610484209802196003736971810343461147514065523053359050432167293160868787410237387773846812863726670073486411431153915974221516020391498225902044063154073376200149464330453779255307791427795875714926161867582865251039794826304784702200285042718132987075989800363840046234226462240868543848175515291308226485111148056917266096447904592049099343281153836801550057200313222715169887695344170991444392677916450669200736012573310517480306758906791894339130601070145644206868468136454802614730303611168948732160506857860402524079990545547132285627192616806826557659
# c2= 959929824904302382508256979575806109456109034082616678508805089752064096628321793755590498187546754016348420961126246759336272607268291539261105914867584865671365073841993655285982578504150594298539791983556623535143932992954854215754290410196632233122178986613155112548093812638003840310021222831173523233364933633880955497544863238028608030446260699865778686716591585732609156361965222181105410174461025274430633046335469336805793373049590852037241172659827772256553878369747571483117225549884952570363769952655850924935263917370199574057017569476640230750349696998312231326117417428910508978870672118868211788201212157079178900589193313672154891235102585084722764273685429942398646356615174972323634859894915491250334836758611460436222121570938096566286002320990662210681239221116433991294979485366413009059963907062122364841265702664453389772337092732514892753045076150215244712614921937632928299144562324398499337380405

这是题目

这一段代码其实很好懂,明文为flag{***}的形式,分为两段加密,往下看可以发现,两段的加密方式其实是完全相同的,也就是说,只要解出各自的pq可以得到答案,而解pq的方式其实也是一样的。 

分析:

对于一段代码,用函数获得512位的随机质数作为pq

p1=getPrime(512)
q1=getPrime(512)

通过下面的公式算出特殊的n值

n1 = p1*p1*p1*p1*p1*q1
n2 = p2*q2*q2*q2*q2*q2

然后得到密文

打印出密文,加密就完成了

题目最后还给了n1的数值。

这次我在网上没有找到完全一样的题目,此题最大的特点就是对n的非常规算法,而我在总结的时候有一点证明不了的就是在n为这样的形式下,欧拉定理是否还成立。要知道rsa密码的基础就是欧拉定理和欧拉函数,而且我在一道类似的题目上看到了别人做题完全不考虑这个方面的问题,在求出pq后就当做普通的rsa直接做掉了。而我在比赛的时候也没想着去证明ta,比赛之后大脑退化啥都想不出来,在这里挖个坑说不定上大学后哪天就会证了。在这里先用别的替代一下:

绿城杯2021 Crypto writeups_M@ku1i的博客-优快云博客

原本说不贴链接的,但是想想为了提高wp的说服力,我还是贴一个看吧。这里面rsa2-plus也是两段加密的,其中第二段的加密就是和这道题类似的算法,但是n的组成不完全相同,这算不算举例论证?

解题 

接着就是想办法计算两组pq。

首先看到题目里面有一个hint变量

根据我2天做题以来的经验,这个变量绝对有问题。

而且在大数分解(yafu or factordb)对两个n不起作用的情况下,必然会有一些非常规的方法让我们得到pq,而看到hint的计算式,我的第一反应就是这个数应该很小吧,后来经过我的反复推算确实如此。如果你还是不相信可以把代码截出来自己跑着玩一玩:

(这里把randint(,)函数下的p2改成了0,更加直观地显示出这个函数的作用,多次运行证明了ta上下限都可以取到的事实)

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

p1=getPrime(512)
q1=getPrime(512)
p2 = getPrime(512)
hint= p1//(2022*q1*p2)+1
q2 = randint(0,0+hint)


print(hint)
print(q2)

我们可以接着看,q2的大小要不和p1相等,要不比p1大1.

然而分析一下奇偶,n是奇数,一个大质数肯定也是奇数,那么q2的大小只能和p1一样了。我们设q2=p1=a

可知:n1=q1*a^5,   n2=p2*a^5
因为q1p2都是质数,所以a^5就是n1和n2的最大公约数,这个可以通过一个函数算出来

q5=gcd(n1,n2)

(这些函数都需要一些库的支持)

之后分别计算两组pq就很简单了,然后按照常规rsa的题目做就可以了

下面是整个做题脚本。

from gmpy2 import *
from Crypto.Util.number import *
#p1=q2=q
n1= 1256153302556722997835679485829871808209901877944658368294633380086039408209637188283648561974710208562420741204863668125373241516909427306739638768582394391661155157329008815783003303268567732455689976681585719180341791879262235261804780291172646163735569766134496283369776876010433765550597807557716740369078630640629164056123730434939865702582297649206877992510218914493158109915659245977470879976045951953520845428717845238737381501004186574867828363490038297060142964599736049326285646322631112277122289112238935311758549326725559220188899102270828155680789659302591782729536182848762707696215273010646878701028580606341865318406958340196626036013889917779504807663048327842005146211390991643204265514403828323182286983607461509750859161392868951803250718502430595154630844863204136754825203448059235932426723373812958290492927375792457551041464503622981270187813181683705800678105184791224152356667342466450291837456587
n2= 1197629325190380699374154128374513283820240508821461857430115674113727047293237281127074814227816406157740605135583333664729226869731385678693946183795222888181174575584200136367082503497480853823603769374075912819200587854120171575320112658694639845299676212762187920588396645028444278961588563075638955700989205301920429678357303440841144388921662935109491390033220158222065055652765734940667449637287741783098057517927165840885201990788219503352883314434530198352746142587272387252244739608996358591480242676653170679025554434143849593378462666666170040113198957024953263969979014590685909232969322886865119889612277827254420993904268068435829747543789521624579459660937906125103686937705250459042164404148908258218791466046423503711451547418585736801420769503175880623550310687599137930182497726859069348327075914150715506160538909443106998347917970480446556323094447246836747858707877134905173088467627177471146007736151
c1= 710845091991380398216733721136006610592361788281046186261035950037696217252772309636540595252970682415638821035841466715754193881889268349770256847384533983912090666113165051957000028445124008234754655483172991257455376698273597295387435177431393496727377669078123014921967229546948512850153154166917157214759642269095531059598553219933340611301435705789734492306061610484209802196003736971810343461147514065523053359050432167293160868787410237387773846812863726670073486411431153915974221516020391498225902044063154073376200149464330453779255307791427795875714926161867582865251039794826304784702200285042718132987075989800363840046234226462240868543848175515291308226485111148056917266096447904592049099343281153836801550057200313222715169887695344170991444392677916450669200736012573310517480306758906791894339130601070145644206868468136454802614730303611168948732160506857860402524079990545547132285627192616806826557659
c2= 959929824904302382508256979575806109456109034082616678508805089752064096628321793755590498187546754016348420961126246759336272607268291539261105914867584865671365073841993655285982578504150594298539791983556623535143932992954854215754290410196632233122178986613155112548093812638003840310021222831173523233364933633880955497544863238028608030446260699865778686716591585732609156361965222181105410174461025274430633046335469336805793373049590852037241172659827772256553878369747571483117225549884952570363769952655850924935263917370199574057017569476640230750349696998312231326117417428910508978870672118868211788201212157079178900589193313672154891235102585084722764273685429942398646356615174972323634859894915491250334836758611460436222121570938096566286002320990662210681239221116433991294979485366413009059963907062122364841265702664453389772337092732514892753045076150215244712614921937632928299144562324398499337380405
q5=gcd(n1,n2)
e = 0x10001
q=gmpy2.iroot(q5,5)[0]
#print(q)
q1=n1//q5
p2=n2//q5
fn1=(q-1)*(q1-1)*q*q*q*q
fn2=(q-1)*(p2-1)*q*q*q*q
#fn1=mpz(fn1)
#fn2=mpz(fn2)

d1 = int(gmpy2.invert(mpz(e),mpz(fn1)))
d2 = int(gmpy2.invert(mpz(e),mpz(fn2)))
m1 = pow(c1,d1,n1)
m2 = pow(c2,d2,n2)
#print(m1)
print(long_to_bytes(m1),end='')
print(long_to_bytes(m2))

运行得到结果:

最后说一个萌新容易出现的问题:

在密码学这种大数计算的时候,常常不需要用到小数。

做除法的时候一定要用整除符号"//"而不是普通的除号"/"

前者可以输出整数而后者输出浮点数,会导致后面的转换出现问题。

我就扑街了。

 

### 应用安全与数据安全密评相关题目 #### 判断题 开展信息系统密评时,“设备远程管理通道安全”测评项可能涉及“网络和通信安全”和“设备和计算安全”两个层面[^1]。 #### 多选题 根据 GM/T 0115《信息系统密码应用测评要求》,以下可作为设备和计算安全层面“远程管理通道安全”的测评内容的是()[^2]。 此部分通常会考察以下几个方面:身份鉴别机制的安全性、传输协议加密强度以及访问控制策略的有效性等。 #### 单选题 数字信封技术主要用于解决哪种类型的密钥分发问题?选项如下: - A. 公钥分发问题 - B. 私钥分发问题 - C. 对称密钥分发问题 - D. 私钥保密问题 正确答案为 **C**,即对称密钥分发问题[^3]。 #### 填空题 以 ZUC 算法为核心的保密性和完整性算法在 **2011 年** 成为了 3GPP LTE 标准[^4]。 --- 以下是关于应用安全与数据安全密评的一道综合分析题: #### 综合分析题 假设某企业正在对其内部业务系统进行密码应用安全性评估,请列举至少三项针对该系统的测试要点,并说明其重要性。 1. **身份认证机制**:验证用户登录过程中使用的密码学方法是否符合国家密码标准,例如采用国密 SM2 数字签名算法来增强身份可信度。 2. **数据存储保护**:检查敏感数据(如客户个人信息或交易录)是否通过强加密手段(如 SM4 加密算法)进行了妥善保存。 3. **日志审计功能**:确保所有操作行为都被完整录下来以便后续追踪溯源,同时这些日志文件本身也需要经过哈希校验防止篡改。 ```python # 示例代码片段展示如何利用 Python 实现简单的 RSA 非对称加解密过程 from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_OAEP def generate_rsa_keys(): key = RSA.generate(2048) private_key = key.export_key() public_key = key.publickey().export_key() return (public_key, private_key) def encrypt_message(public_key_str, message): rsa_public_key = RSA.import_key(public_key_str) cipher = PKCS1_OAEP.new(rsa_public_key) encrypted_text = cipher.encrypt(message.encode()) return encrypted_text def decrypt_message(private_key_str, ciphertext): rsa_private_key = RSA.import_key(private_key_str) cipher = PKCS1_OAEP.new(rsa_private_key) decrypted_text = cipher.decrypt(ciphertext).decode() return decrypted_text ``` 上述代码展示了基于 PyCryptodome 库实现的一个简单 RSA 非对称加密/解密流程,可用于保障应用程序间的数据交换安全。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值