NSSCTF 2nd crypto wp
[NSSCTF 2nd] crypto wp
EzRSA
1234567891011121314151617181920212223242526from Crypto.Util.number import *from secret import flagm = bytes_to_long(flag)assert m.bit_length()<200p = getPrime(512)q = getPrime(512)n = p*qe = 3c = pow(m, e, n)kbits = 103m = (m >> kbits) << kbitsMod = getPrime(1024)hint1 = (2021-2023*m) % Modhint2 = pow(2, 2023, Mod)print('n =',n)print('c =',c)print('hint1 =',hint1)print('hint2 =',hint2)'''e=3n = 1 ...
DASCTF 2023 & 0X401七月暑期挑战赛 crypto的题解
[DASCTF 2023 &
0X401七月暑期挑战赛] crypto的题解
赛中我只做出来一题,赛后对其他两题学了复现,学到了很多
ezDHKE
源码
1234567891011121314151617181920212223242526from Crypto.Util.number import *from Crypto.Cipher import AESfrom hashlib import sha256from random import randbytes, getrandbitsfrom flag import flag def diffie_hellman(g, p, flag): alice = getrandbits(1024) bob = getrandbits(1024) alice_c = pow(g, alice, p) bob_c = pow(g, bob, p) print(alice_c , bob_c) key = sha256(long_to_bytes(pow(bob_c, alice, p)) ...
SM4学习
SM4学习
SM4算法是我国商用密码标准,其前身是SMS4算法。SM4算法是一个分组加密算法,分组长度和密钥长度均128bit。SM4算法使用32轮的非线性迭代结构。SM4在最后一轮非线性迭代之后加上了一个反序变换,因此SM4中只要解密密钥是加密密钥的逆序,它的解密算法与加密算法就可以保持一致。基本流程如下
密钥扩展运算把128 bit的种子密钥扩展为32个32 bit的子密钥。
我们先来看轮函数
轮函数分析
\[
轮函数的规则为X_{i+4}=X_i\ xor\ T(X_{i+1}\ xor \ X_{i+2}\ xor \ X_{i+3}\
xor \ RK_{i})\\
i=(0-31)\\
第1轮输入为(X_0,X_1,X_2,X_3),最后一轮为(X_{32},X_{33},X_{34},X_{35})\\
但是输出要逆序,所以输出为\\
(X_{35},X_{34},X_{33},X_{32})\\
\]
然后我们来看T置换
T置换
这里涉及到s盒,与aes和des不同的是,这里的s盒是完全一样的,s盒为
1234567891011121 ...
SM2国密分析
SM2国密分析
简介
SM2是非对称加密算法
它是基于椭圆曲线密码的公钥密码算法标准,其秘钥长度256bit,包含数字签名、密钥交换和公钥加密,用于替换RSA/DH/ECDSA/ECDH等国际算法。可以满足电子认证服务系统等应用需求,由国家密码管理局于2010年12月17号发布。
SM2采用的是ECC 256位的一种,其安全强度比RSA 2048位高,且运算速度快于RSA。随着密码技术和计算技术的发展,目前常用的1024位RSA算法面临严重的安全威胁,我们国家密码管理部门经过研究,决定采用SM2椭圆曲线算法替换RSA算法。SM2算法在安全性、性能上都具有优势。
前置知识
椭圆曲线
椭圆曲线的定义
y2+axy+by=x3+cx2+dx+ey^2+axy+by=x^3+cx^2+dx+e\\
y2+axy+by=x3+cx2+dx+e
最常用的方程是维尔斯特拉斯标准形式。
y2=x3+ax+by^2=x^3+ax+b
y2=x3+ax+b
椭圆曲线阿尔贝群
O 为零元,相反数 P 为关于X轴对称的另一边的点,加法规则为直线三点 P+Q+R=0。
几何加法
普通相交三点:P+Q+R=0
普 ...
LWE问题的学习
LWE问题的学习
容错学习问题 (LWE问题, Learning With
Errors)是一个机器学习领域中的怀疑难解问题,由Oded Regev
在2005年提出,他因此赢得2018年哥德尔奖。这是一个极性学习问题的一般形式。
定义
随机选取一个矩阵 \[
A ∈ Z^{m*n}_q
\] 一个随机向量 \[
s \in Z^{n}_q
\] 一个随机向量 \[
e \in \xi ^{m}
\] 输出 \[
g_A(s,e)=As+e(mod \ q)
\] 一个LWE问题是,给定一个矩阵
A,和LWE系统的输出 ,还原s。
假如我们先没有这噪音部分
其实感觉来说更像是解决一种线性方程组
例如 \[
3x_1+4x_2+x_3=0\\
4x_1+2x_2+5x_3=1\\
2x_1+x_2+x_3=1
\] 构成矩阵的话是这样的 \[
\begin{pmatrix}
3 & 4 &1 \\
4 & 2 &5 \\
2 & 1 &1
\end{pmatrix} *\begin{pm ...
2023数字中国创新大赛-数字网络安全人才挑战赛 crypto wp
2023数字中国创新大赛-数字网络安全人才挑战赛 crypto wp题目源码123456789101112131415161718192021222324252627282930from Crypto.Util.number import *from secrets import flagassert len(flag) == 38t = 30p = getPrime(512)x = getPrime(512)while x > p: x = getPrime(512)rs = []cs = []ss = []for i in range(t): r = getPrime(512) s = getPrime(400) c = (r * x + s) % p rs.append(r) cs.append(c) ss.append(s)enc = pow(x,flag,p)print(f'p = {p}')print(f'rs = {rs}')print(f ...
格的学习过程
ctf中的格密码
NRTU格密码
[深育杯 2021]
123456789101112131415161718192021222324from Crypto.Util.number import *import gmpy2from flag import flagdef encrypt(plaintext): p = getStrongPrime(3072) m = bytes_to_long(plaintext) r = getRandomNBitInteger(1024) while True: f = getRandomNBitInteger(1024) g = getStrongPrime(768) h = gmpy2.invert(f, p) * g % p c = (r * h + m * f) % p return (h, p, c)h, p, c = encrypt(flag)with open("cipher.txt", "w" ...
连分数
连分数
参考文献:Continued Fractions -Gautam Gopal Krishnan
前置知识:gcd(欧几里得)
Algorithm: Let the two positive integers be denoted
by a and b.
\1. If a < b, swap a and b.
\2. Divide a by b and fifind remainder r.
If r = 0, then the gcd is b.
\3. If r = 0, then set a = b, b =
r and go back to step 1.
这是文献中给的基础介绍,其实也类似给了你一个伪代码
不妨举个例子来看
使 a = 43, b = 19
43 = 2 × 19 + 5
19 = 3 × 5 + 4
5 = 1 × 4 + 1
4 = 4 × 1 + 0
其最大公因子是1,
那么应用这个的原因是什么呢,看如下图片
img
是否看到共同点,2,3,1,4,也借此准备引出连分数
简单连分数
定义 ...
连分数与其在rsa中的运用
连分数与其在rsa中的运用
首先先要了解一下连分数的表现形式
也就是把一个数不停细分下去例如x=13/8
可以继续划分为如图所表示的形式
这就是简单连分数,为了方便计算,通常我们会写成[a0,a1,a2,a3],上图我举的例子可以写成[1,1,1,1,2]
我也简单写了个模拟代码,大部分情况应该是适用的(原创代码,可能写的比较差)
1234567891011121314def lianfenshu(a,b): list=[] t=a//b list.append(int(t)) h=1/(a/b-t) if h % 1 == 0: list.append(int(h)) while h%1!=0: t=int(h-h%1) list.append(int(t)) h=round(1/(h%1),4) if h%1==0 : list.append(int(h)) return list
简单连分数的概念也要知道,分为有限连分数和无线 ...
离散数学2
离散数学2
什么是命题和非命题
数理逻辑研究的中心问题是推理,而推理的前提和结论都是命题。因而命题是推理的基本单位。
定义:
具有确切真值的陈述句称为命题(proposition)。该命题可以取一个“值”,称为真值。真值只有“真”和“假”两种.
分别用“T”(或“1”) 和“F”(或“0”)表示。
例如:中国是我们的国家 真值:T
3 能被 2 整除。真值:F
非命题:
一切没有判断内容的句子,如命令句
(或祈使句)、感叹句、疑问句、二义性的陈述句等都不能作为命题。
这个人不行的(二义性)
把门关上(命令句)
请你离开!(感叹句)
你要走吗?(疑问句)
复合命题
原子命题 (简单命题):不能再分解为更为简单命题的命题。
复合命题:可以分解为更为简单命题的命题。这些简单命题之间是通过如“或者”、“并且”、“不”、“如果......则......”、“当且仅当”等这样的关联词和标点符号复合而成
通常用大写的带或不带下标的英文字母表示命题
(包括原子命题和复合命题)。
复合命题的例子:
如果周末天气晴朗,则我们将到郊外旅游
两个三角形全等当且仅当三 ...