强网杯2025
check-little
侥幸拿到一血
1234567891011121314151617181920212223242526272829303132333435363738394041from Crypto.Util.number import *from Crypto.Util.Padding import padfrom Crypto.Cipher import AESimport osflag, key = open('secret').read().split('\n')e = 3while 1: p = getPrime(1024) q = getPrime(1024) phi = (p - 1) * (q - 1) if phi % e != 0: breakN = p * qc = pow(key, e, N)iv = os.urandom(16)ciphertext = AES.new(key = long_to_bytes(key)[:16], iv = iv, mode =...
羊城杯
这次羊城杯的密码题很少也是侥幸ak了
瑞德的一生
12345678910111213141516171819202122232425262728293031323334353637383940414243from Crypto.Util.number import *from gmpy2 import legendrefrom secret import flagm = bytes_to_long(flag)p, q = getPrime(256), getPrime(256)n = p * qx = getRandomRange(0, n)while legendre(x, p) != -1 or legendre(x, q) != -1: x = getRandomRange(0, n)def encrypt(msg , n, x): y = getRandomRange(0, n) enc = [] while msg: bit = msg & 1 msg >>= 1 enc.append((pow(y, 2) *...
ECC
ECC
椭圆曲线是什么
满足 Weierstrass 方程的点集,形如: Y2 = X3 + AX + B
这样的等式称为椭圆曲线(elliptic curve)
当这个方程表示的曲线是一条连续的曲线时,需要满足条件 4A3 + 27B2 ≠ 0
这时称为非奇异椭圆曲线,反之称为奇异椭圆曲线
奇异椭圆曲线都是形状有点尖或者有交叉
这些情况下的点加法会出现问题
下面来介绍一下点加法
我们在椭圆曲线上定义加的运算,我在曲线上找到两点P,Q,现在想要计算出P ⊕ Q
首先我们连接P,Q两点,与椭圆曲线E相交于一点
相交的点关x的对称的点就是P ⊕ Q的点R
这里我考虑一个情况如果当P=Q的时候也就是P ⊕ P,该如何运算呢
其实还是一样的,只不过这次我们取过椭圆曲线E上的点P的切线,再与曲线相交后做关于x轴的对称点即可
现在还有种情况就是如果是无穷远点呢,也就是当P,Q关于x轴对称
也就是P ⊕ P′ = 𝒪
这时候会发现 P ⊕ 𝒪 = P...
格密码
格密码
作为后量子密码,可以用来抵抗量子攻击
向量
带有方向的线段
u⃗ = (1, 2)
向量的运算
向量的运算满足平行四边形法则
u⃗ + v⃗ = w⃗
ku⃗ = (k, 2k),也就是将长度扩大k倍(k ∈ ℤ)
向量空间
向量的集合,运算的空间 $\text { 1. } a \in
V, b \in V \text {, 则 } a+b \in V \\$
2. a ∈ V, k ∈ ℝ, 则
ka ∈ V 。
也就是满足封闭性
向量正交与施密特(Schmidt)正交化
当 $ a , b $ 时,当 ((a, b) = 0),即 ( a^T b = 0 ) 时,称向量 ( a, b
) 正交。
由两两正交的非零向量组成的向量组称为正交向量组,由单位向量组成的正交向量组称为标准正交向量组。
( n ) 维欧氏空间求解正交基,一组基底为 (α1, α2, ⋯, αn)
Step 1: 令 β1 = α1
Step 2: 计算 α2 在 β1
方向上的投影,并做差得到 $$
\beta_2 =...
Gröbner基学习
Gröbner基学习
我是跟着这篇博客学习的
把Gröbner基当作一个求解同余方程组的工具
一般可以用 Ideal.groebner_basis() 来解方程组
先来看具体的实例
12345678910111213from Crypto.Util.number import *p, q = getPrime(256), getPrime(256)N = p * qm1 = bytes_to_long(b"flag{12345678901234567890")m2 = bytes_to_long(b"1234567890123456789012345")m3 = bytes_to_long(b"6789012345678901234567890}")e = 17c1 = pow(m1, e, N)c2 = pow(m2, e, N)c3 = pow(m3, e, N)s = m1 + m2 + m3print(c1, c2, c3,...
Shamir's secret sharing
Shamir’s secret sharing算法
该算法由于Shamir提出,也就是RSA中的这S
算法概述:
秘密s被分成n份毫无相关的部分信息,每一部分信息称为一个子密钥,由一个参与者持有,只有至少拥有k份子密钥时才能恢复出秘密s,这种方案为(k, n)-秘密分割门限方案,k称为方案的门限值
一个秘密S要由n个人来保管
将s分为n个值→{s1, s2, s3,…,sn}
保证从中任取k个值,可以还原出s,{s1, s2, s3,…,sn}→s
保证从中任取k-1个值不能还原出s,{s1, s2, s3,…,sn}↛s
算法实现:
这是如何实现的呢
我们可以先回顾下多项式的性质
两个点可以确定唯一的一条直线也就是一次多项式
但是确不能确定唯一的二次多项式
但是三个点就可以确定唯一的二次多项式
对结论推广,我们可以知道k-1次的多项式可以由k个点来唯一确定
回到算法中,我们将秘密看成是k-1次多项式我们可以得到...
