无题
CTF中的LFSR类题目
题型:给出反馈函数和输出序列,反推出初始状态
2018 CISCN 线上赛 oldstreamgame
题目
flag = "flag{xxxxxxxxxxxxxxxx}"
assert flag.startswith("flag{")
assert flag.endswith("}")
assert len(flag)==14
def lfsr(R,mask):
#0xffffffff -->32位 '0b101100100000011110110001
output = (R << 1) & 0xffffffff
i=(R&mask)&0xffffffff
lastbit=0
while i!=0:
lastbit^=(i&1)
i=i>>1
output^=lastbit
return (output,lastbit)
#将提取的子字符串解析为一个十六进制数,并将其转换为对应的整 ...
MT19937
流密码 | Lazzaro (lazzzaro.github.io)
逆extract_number(求后随机数)
extract_number是对从state中提取的伪随机数做异或处理,而逆extract_number是恢复梅森算法的内部状态(即state)
extract_number
def extract_number(self):
if self.mti == 0:
self.twist()
y = self.mt[self.mti]
y = y ^ y >> 11
y = y ^ y << 7 & 2636928640
y = y ^ y << 15 & 4022730752
y = y ^ y >> 18
self.mti = (self.mti + 1) % 624
return _int32(y)
逆extract_number
# right shift inverse
def invers ...
流密码
流密码(Stream cipher)
流密码 | Lazzaro (lazzzaro.github.io)
密码学复习——第二章(流密码)-阿里云开发者社区 (aliyun.com)
(144条消息) 流密码(一次一密、流密码/序列密码、LFSR、RC4)_Yongliang Xu的博客-CSDN博客
明文逐位与密钥流进行异或运算,生成密文流
又称序列密码
对称加密算法,加密和解密双方使用相同伪随机加密数据流(pseudo-random stream)作为密钥
流密码的安全性依赖于生成高质量的密钥流。
密钥流应该是伪随机的,不可预测的,并且对于同一个密钥,不应该重复出现。
二元加法流密码
一种基于二进制加法运算的流密码算法。它使用一个密钥流和明文流进行逐位的二进制加法运算,生成密文流
一次一密(one-time pad)
又称Vernam加密法
将明文与随机生成的密钥进行异或运算来实现加密和解密
密钥:与明文等长、完全随机、只使用一次,并且发送者和接收者在事先共享同一密钥。
不能提供完整性验证和认证
一次一密的密钥长度和明文一样长,流密码不是,需要种子密钥通 ...
CISCN 2021华南 matryoshka
CISCN 2021华南 matryoshka
题目
from os import urandom
from Crypto.Util.number import *
from secret import flag
KEY_SIZE = 1024
def genkey(size, t):
assert 0 < t < 4
p = getPrime(size)
q = getPrime(size)
N = p * q
e = 0x10001
d = inverse(e, (p - 1) * (q - 1))
if t == 1:
hint = (pow(2020 * p + q, 114514, N), pow(2021 * p + 1919810, q, N))
elif t == 2:
hint = (pow(2020 * p + 2021 * q, 114514, N), pow(2021 * p + 2020 * q, 1919810, N))
else:
...
中国剩余定理
[ 强网杯2022]ASR
题目
from Crypto.Util.number import getPrime
from secret import falg
pad = lambda s:s + bytes([(len(s)-1)%16+1]*((len(s)-1)%16+1))
n = getPrime(128)**2 * getPrime(128)**2 * getPrime(128)**2 * getPrime(128)**2
e = 3
flag = pad(flag)
print(flag)
assert(len(flag) >= 48)
m = int.from_bytes(flag,'big')
c = pow(m,e,n)
print(f'n = {n}')
print(f'e = {e}')
print(f'c = {c}')
'''
n = 825087128028157397936509571571135911537250445897344436708319543186130753456324 ...
CryptoCTF2023
[CryptoCTF2023 (part1) - ZimaB1ue - 博客园 (cnblogs.com)
[CryptoCTF 2023 | LOV3 (lov2.netlify.app)](https://www.cnblogs.com/ZimaBlue/articles/17538563.html)
Easy
Did it!
题目
Finding the intersection among subsets can sometimes be a challenging endeavor, as it requires meticulous comparison and analysis of overlapping elements within each set. But she did it! Try doing it yourself too.
#!/usr/bin/env python3
from random import randint
import sys
from flag import flag
def die(*args):
pr(*args)
qui ...
ECC
ECC
ECC | Lazzaro (lazzzaro.github.io)
椭圆曲线加密算法最通俗的解释 不需要数学基础(2)ECC加密算法_哔哩哔哩_bilibili
基本概念
椭圆曲线不是椭圆而是椭圆积分方程
一条椭圆曲线是在射影平面上满足威尔斯特拉斯方程(Weierstrass)所有点的集合
椭圆曲线的定义式:
y2+axy+by=x3+cx2+dx+ey2+axy+by=x3+cx2+dx+e
y2+axy+by=x3+cx2+dx+e
一般方程:
y2+a1xy+a3y=x3+a2x2+a4x+a6y2+a1xy+a3y=x3+a2x2+a4x+a6
y2+a1xy+a3y=x3+a2x2+a4x+a6
1椭圆曲线方程是一个齐次方程
椭圆曲线都是关于X轴对称的曲线。
2曲线上的每个点都必须是非奇异的(光滑的),偏导数FX(X,Y,Z)、FY(X,Y,Z)、FZ(X,Y,Z)不同为0
3圆曲线的形状,并不是椭圆的。只是因为椭圆曲线的描述方程,类似于计算一个椭圆周长的方程故得名
椭圆曲线表达式
(x,y)∈R2∣y2=x3+ax+b,4a3+27b2≠0 ...
LitCTF 2023
[LitCTF 2023]梦想是红色的 (初级)
题目
自由友善公正公正敬业法治自由自由和谐平等自由自由公正法治诚信民主诚信自由自由诚信民主爱国友善平等诚信富强友善爱国自由诚信民主敬业爱国诚信民主友善爱国平等爱国爱国敬业敬业友善爱国公正敬业爱国敬业和谐文明诚信文明友善爱国自由诚信民主爱国爱国诚信和谐友善爱国自由友善平等爱国友善平等友善自由诚信自由平等爱国爱国敬业敬业友善爱国敬业敬业友善自由友善平等诚信自由法治诚信和谐
题解
社会主义核心价值观编码
http://www.hiencode.com/cvencode.html
flag
LitCTF{为之则易,不为则难}
[LitCTF 2023]Hex?Hex!(初级)
题目
4c69744354467b746169313131636f6f6c6c616161217d
题解
根据题目信息提示 hex 解码
flag
LitCTF{tai111coollaaa!}
[LitCTF 2023]你是我的关键词(Keyworld) (初级)
题目
IFRURC{X0S_YP3_JX_HBXV0PA}
题解
题目信息提示:YOU are my ke ...
coppersmith练习题
[红明谷CTF 2022]easy_ya
题目
from Crypto.Util.number import *
import os
from flag import flag
def gen():
e = 3
while True:
try:
p = getPrime(512)
q = getPrime(512)
n = p*q
phi = (p-1)*(q-1)
d = inverse(e,phi)
return p,q,d,n,e
except:
continue
return
p,q,d,n,e = gen()
r = getPrime(512)
m = bytes_to_long(flag+os.urandom(32))
M = m%r
c = pow(m,e,n)
print("r = %d"%r)
print("M = %d"%M)
print("n ...
二次剩余练习
[HNCTF 2022 WEEK4]square
题目
from flag import flag
from Crypto.Util.Padding import pad
from Crypto.Util.number import *
flag = pad(flag,16)
m = int.from_bytes(flag,'big')
n = getPrime(2048)
e = 16
c = pow(m,e,n)
with open('output.txt','w') as f:
f.write(f'n = {hex(n)}\n')
f.write(f'e = {hex(e)}\n')
f.write(f'c = {hex(c)}\n')
'''
n = 0xcaea4e2db0dc68029999cdad792fa1f9142117163af28f3230f7500ef748841554141ef35555ba23b95dc87f4c83f75dad14b6204dd4907fb75650 ...