infinite_blog
Revenge 第一次差分 记 第二次差分,消掉b 记 那么 于是 所以 对任意两个求gcd+爆破,得到m 123456789101112131415d = [beta[i]*k[i+1] - beta[i+1]*k[i] for i in range(len(beta)-2)]m = []for i in d: for j in d: if i!=j: m.append(gcd(i,j))m1 = []for i in m: for j in m: if i!=j: m1.append(gcd(i,j))km = min(m1)for i in range(2,2^22): if km%i == 0 and km//i < 2**528 and km//i % 65536 == 0: m = km//i 求出m之后 由于k_1和m有公因数,得除掉 求出a 12345d = gcd(k[0],m)k1 = k[0]//db1 = beta[0]//dm1 =...
lsfr
1.LSFR基本介绍线性反馈移位寄存器(LFSR, Linear-Feedback ShiftRegister)是一种其输入位由其前一个状态的线性函数决定的移位寄存器 最常用的单个位线性函数是异或(XOR)。因此,LFSR通常是一种其输入位由整个寄存器当前值中某些位进行异或运算所得的移位寄存器。 LFSR的初始值被称为种子(seed),由于寄存器的操作是确定性的,因此其产生的值序列完全由当前(或之前)的状态决定。同样地,由于寄存器的可能状态数量是有限的,它最终必然会进入一个循环周期。不过,一个精心选择的反馈函数可以使LFSR 产生一个看起来随机且周期很长的比特序列。 2.Fibonacci LFSRs1.运算会影响下一个状态的比特位置被称为抽头(taps)。在图示中,抽头的位置是[16, 14, 13, 11]。LFSR 最右边的比特被称为输出位(outputbit),它始终也是一个抽头。 要获得下一个状态,首先将所有抽头位进行异或(XOR)运算;然后,将所有比特整体向右移动一位,最右边的比特被丢弃;最后,把之前异或运算的结果写入现在空出来的最左边比特位。 要获取伪随机输出流,每...
RSA相关总结
RSA简介1.encrypt生成两个大素数p,q 计算 作为模数,计算Euler函数 然后随机生成公钥e,满足 当N,e公开作为公钥之后 任何人都可以用公钥加密 2.decrypt计算私钥 解密 只有拥有私钥d的人可以解密 但是,往往由于参数生成不当,RSA可以被破解 相关数论算法1.Eculid算法用一个递归很容易实现 123456def eculid(x,y): r = x % y if r == 0: return y else: return eculid(y,r) 时间复杂度是O() 2.Extend Eculid算法也是递归 123456def gcdext(x,y): r = x % y if r == 0: return [0,1] else: return [gcdext(y,r)[1],gcdext(y,r)[0] - x//y * gcdext(y,r)[1]] 注意到 由于x可以由y和x%y表示,那么 只需求 的解,注意到 那么 即 此...
infinite_blog
gmssl使用命令行功能从2.4版开始,GmSSL提供了sm2、sm2utl命令用于SM2相关的计算。 生成SM2私钥1$ gmssl sm2 -genkey -sms4 -out sm2.pem 将SM2私钥整数值转换为PEM格式的私钥1$ gmssl sm2 -inform text -out sm2.pem 导出SM2公钥1$ gmssl sm2 -in sm2.pem -pubout -out sm2Pub.pem 显示SM2私钥的Z值1$ gmssl sm2 -genzid -in sm2.pem -id Alice -noout 计算带Z值的杂凑值1$ gmssl sm2utl -dgst -in msg.txt -pubin -inkey sm2Pub.pem -id Alice 对消息签名12$ gmssl sm2utl -sign -in msg.txt -inkey sm2.pem -id Alice -out sig.der$ gmssl sm2utl -verify -in msg.txt -sigfile sig.der -pubin -...
signature
1.公钥和私钥对称密码由于只有一把密钥,加密和解密都是用同一把密钥,那么很容易受到MIMT攻击,中间人受到一方的信息,就可以用密钥解密,然后随便伪造信息,篡改信息。非对称密码用到了两把密钥,公钥和私钥,一把用于加密,一把用于解密,但是具体哪一把加密要视情形而定,但是,如果一把用于加密,那么另一把一定用于解密 对称密码由于只有一把密钥,加密和解密都是用同一把密钥,那么很容易受到MIMT攻击,中间人受到一方的信息,就可以用密钥解密,然后随便伪造信息,篡改信息。非对称密码用到了两把密钥,公钥和私钥,一把用于加密,一把用于解密,但是具体哪一把加密要视情形而定,但是,如果一把用于加密,那么另一把一定用于解密 1.传输信息(公钥加密)假设Bob有两把密钥,公钥和私钥, 当有人想要给他发信息的时候,都可以用公钥加密,但只有他能用私钥解密 只要私钥不泄露,那么这个信息就是安全的,没有任何人能篡改 2.数字签名(私钥加密,公钥解密)那么当Bob要给别人回信的时候,由于别人没有私钥,那该怎么保证信息的安全性呢? Bob可以用Hash函数生成message的digest 由于Hash函数的雪崩效应,但...
Certification
JWT(JSON Web Tokens)JavaScript 对象签名和加密 (JOSE) 是一个框架,指定了在 Internet上安全传输信息的方式。它最著名的是 JSON Web 令牌(JWT),用于在网站或应用程序上对自己进行授权。JWT通常在您通过输入用户名和密码对自己进行身份验证后,通过在浏览器中存储您的“登录会话”来做到这一点。换句话说,网站会为您提供包含您的用户ID 的 JWT,可以将其呈现给网站以证明您是谁,而无需再次登录。JWT看起来是这样的: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmbGFnIjoiY3J5cHRve2p3dF9jb250ZW50c19jYW5fYmVfZWFzaWx5X3ZpZXdlZH0iLCJ1c2VyIjoiQ3J5cHRvIE1jSGFjayIsImV4cCI6MjAwNTAzMzQ5M30.shKSmZfgGVvd2OSB2CGezzJ3N6WAULo3w9zCl_T47KQ 你可以识别它,因为它是被分割成三个部分(由.分隔)的base64编码数据:报头、有效载荷和签名。实际上,这是一种ba...
有向图笔记
Robin定理要证明命题:“如果一个无向图 有一个强定向(strongorientation),那么 是2-边连通的(2-edge-connected)”,我们可以从反证法来理解。我们首先澄清几个术语: 定义澄清 强定向(strong orientation):将无向图 的每条边赋予一个方向,得到有向图 ,使得 是强连通的(即对于任意两个顶点 ,都存在一条从 到 的有向路径)。 2-边连通图(2-edge-connected graph):一个无向图中没有“桥”(bridge)。也就是说,删除任意一条边,图仍然连通。 反证思路假设 有一个强定向,但它不是2-edge-connected。也就是说,存在一条桥(bridge)。我们将通过这条桥的性质来得出矛盾。 桥的性质: 如果一条边 是桥,那么删除它会把图 分成两个连通块,记作 和 ,其中 。 换句话说,所有从 到 的路径都必须经过这条边,因为这是唯一连接 和 的边。 强定向后的问题: 将这条桥定向为 ,那么在有向图中,只能从 到 ,不能从 到 ,因为 是唯一的连接边,方向也固定。 同理,如果定向为 ...
openssl使用
BIGNUM(大数) BIGNUM 是 OpenSSL 里用于存储大整数的结构体,远超普通的int 或 long,适合密码学中用到的大数运算。 常用操作函数示例: BN_new() — 创建一个新的大数对象。BN_free() — 释放大数对象。BN_hex2bn(BIGNUM **bn, const char *hex) —从十六进制字符串创建大数。BN_bn2hex(const BIGNUM *bn) —把大数转成十六进制字符串。BN_mod_inverse() — 计算模逆。BN_mod_mul() — 模乘。BN_mod_add() — 模加。BN_rand_range() — 生成范围内随机数。 BN_CTX是大数计算时的临时变量池,避免频繁申请释放内存。 使用流程: BN_CTX_new() 创建。 BN_CTX_start() 开始申请临时变量。 BN_CTX_get() 依次申请临时变量(BIGNUM指针)。 计算结束后用 BN_CTX_end() 和 BN_CTX_free()清理。 EC_GROUP 代表一个椭圆曲线参数集合,例如素域p,系数a,b,基点...
sympy库的使用
✅ 1. 创建矩阵1234from sympy import Matrix, symbolsA = Matrix([[1, 2], [3, 4]])print(A) 输出: 123Matrix([[1, 2],[3, 4]]) 也可以使用符号变量: 12x, y = symbols('x y')B = Matrix([[x, 1], [2, y]]) ✅ 2. 矩阵基本属性1234print(A.shape) # (2, 2)print(A.rows) # 2print(A.cols) # 2print(A[0, 1]) # 2:访问元素(行列从0开始) ✅ 3. 矩阵加法、乘法、数乘1234B = Matrix([[5, 6], [7, 8]])print(A + B) # 加法print(A * B) # 矩阵乘法print(2 * A) # 数乘 ✅ 4. 行列式与逆矩阵12print(A.det()) # 行列式:-2print(A.inv()) ...
熵密杯复现
熵密杯2024复现1.puzzle1题目1234567891011121314151617181920212223242526272829def encrypt_message(message, key): # 添加前缀 message_with_prefix = MSG_PREFIX + message message_bytes = message_with_prefix.encode('utf-8') message_len = len(message_bytes) num_blocks = message_len // 16 + 1 blocks = [message_bytes[i * 16:(i + 1) * 16] for i in range(num_blocks)] # 进行0填充 blocks[-1] = blocks[-1].ljust(16, b'\x00') encrypted_blocks = [] k = key # 加密每个分组 for block in blocks: ...