杂谈
区块链(一)
区块链概念区块链属于比特币延伸出来的内容,是一种分布式数据库技术。特性:分布式、公开、去中心化、不可篡改。
关键词:账本、数据库。
区块是一个和结构体,通过父区块和本区块的哈希值进行链接:
如果其中一个数据不小心被篡改,就会因为哈希值关系发生连锁反应。
数据库特点为中心化,而区块链为分布式的。
数据库存储时是一个数据中心链接上所有服务器,区块链的每个提供服务的人都要储存一个链结构。
共识机制Proof of work:工作量证明、挖矿(原理就是爆破哈希值)。
难度:服务器决定控制交易的时间,也就是控制难度,使得哈希值符合一定的规则,不能太慢也不能太快。要想达到这个要求,就需要引入nonce,即随机数。
当某个区块的哈希值被爆破出来,这个区块就认为是被打包了,系统会给打包的那个人提供奖励机制。
分层模型
数据层:提供数据结构。
网络层:例如Gossip协议:通过最小的代价告诉全网我发起一笔交易,同时避免网络风暴。
共识层:POW,POS,DPOS,PBFT等。
激励层:给矿工发钱的。
以太坊区块链为去中心化的东西,没了中心化,提供服务的就是处于世界各地的节点。除了一些主链,还有一些测试 ...
CTF
一些做题记录2023.9
[ACTF 2022]RSA Leak12345678910111213141516171819202122232425262728293031323334353637383940414243444546from sage.all import *from secret import flagfrom Crypto.Util.number import bytes_to_longdef leak(a, b): p = random_prime(pow(2, 64)) q = random_prime(pow(2, 64)) n = p*q e = 65537 print(n) print((pow(a, e) + pow(b, e) + 0xdeadbeef) % n)def gen_key(): a = randrange(0, pow(2,256)) b = randrange(0, pow(2,256)) p = pow(a, 4) q = pow(b, 4) rp = randrange(0, pow(2,24) ...
数学
《近世代数基础》札记
基本概念集合有限或无限个固定事物的全体叫一个集合(简称集),组成集合的事物是这个集合的元素(元)。
没有元素的集合叫做空集合。
集合表示:
A=\{a,b,c,...\}子集,真子集,交集,并集。
集合的积:
从$A_1,A_2,…,A_n$顺序取出元素组$(a_1,a_2,…,a_n)(a_i\in A_i)$所组成的集合记为集合$A_1,A_2,…,A_n$的积:
A_1×A_2×...×A_n映射
(a_1,a_2,...,a_n)→ d=\phi(a_1,a_2,...,a_n)法则$\phi$叫做集合$A_1,A_2,…,A_n$到集合$D$的一个映射,元$d$叫做元$(a_1,a_2,…,a_n)$在映射$\phi$下的象,元$(a_1,a_2,…,a_n)$叫做元$d$在映射$\phi$下的逆象。
需要对任何一个$A_1×A_2×…×A_n$的元素都能得到唯一的$D$元$d$,才算构成映射。
代数运算一个$A×B$到$D$的映射叫做一个$A×B$到$D$的代数运算,代数运算是一种特殊的映射。
(a,b)→d=\circ(a,b)=a\circ b如果$\circ$是 ...
Crypto
多项式RSA
因为sage可以使得运算在多项式环上进行,所以可以利用sage将RSA的参数设置为多项式并进行RSA加解密,先了解一下大致原理,再拿几道题举例子。
计算原理对于在整数上的RSA,都知道:
c\equiv m^e(\bmod n)
m\equiv c^d(\bmod n)考虑原理(只考虑$\gcd(n,m)=1$):
c^d\equiv (m^e)^d\equiv m^{ed}\equiv m^{k\phi(n)+1}\equiv m(\bmod n)引申到多项式上,在有限域中选取两个不可约多项式$g(p),g(q)$,有$g(n)=g(p)g(q)$。
计算$g(n)$的欧拉函数$\phi(g(n))=phi$,选择一个互素的公钥$e$,对于多项式明文$g(m)$,进行加密:
g(m)^e\equiv g(c)(\bmod g(n))解密,有$g(c)^d\equiv g(m)(\bmod g(n))$。
欧拉函数计算那么对于多项式,该怎么计算它的欧拉函数呢?
欧拉函数$\phi(n)$表示小于$n$的所有与$n$互质的数的个数,多项式的$\phi(P(y))$则类似,表示不高于 ...
web
Crypto On The Web
这篇文章是Cryptohack在Crypto On The Web部分的复现。
JSON WEB TOKENS提供一个可以修改JWT的网站:JSON Web Tokens - jwt.io
Token Appreciation
在Web中,令牌(Token)是一个用于身份验证和授权的字符串。它们被用作身份验证凭证,以便验证用户的身份,并且还可以用于授权访问受保护资源。
在身份验证方面,令牌通常用于代替传统的用户名和密码。用户通过提供用户名和密码进行身份验证,并且如果验证成功,服务器会生成一个Token并返回给客户端。客户端可以在后续的请求中使用令牌来证明他们的身份,而无需再次提供用户名和密码。
令牌还可以用于授权访问受保护的资源。服务器可以要求客户端在每次请求中附带令牌,以便判断客户端是否有权限访问该资源。通过验证令牌的有效性并检查权限,服务器可以决定是否允许客户端访问请求的资源。
在Web开发中,常见的令牌类型包括JWT(JSON Web Token)、OAuth令牌(用于跨应用程序身份验证和授权)和访问令牌(用于访问API资源)等。
JavaScript对象签名和加密(JOSE) ...
Crypto数学
NTRU密码系统
抽象代数补充卷积多项式环定理:设$F$是域,非零多项式$m\in F[x]$,那么每个非零同余类$a\in F[x]/(m)$存在唯一的代表元$r$满足$\deg r<\deg m,a\equiv r(\bmod m)$。
对于商环$F[x]/(x^2+1)$,根据上面的定理可知商环的每个元素可以被唯一表示成$\overline{\alpha+\beta x},\alpha,\beta\in F$,有加法运算:
\overline{\alpha_1+\beta_1 x}+\overline{\alpha_2+\beta_2 x}=\overline{(\alpha_1+\alpha_2)+(\beta_1+\beta_2) x}乘法运算类似,但是需要注意结果是在环上,需要取余:
\overline{\alpha_1+\beta_1 x}\cdot \overline{\alpha_2+\beta_2 x}=\overline{\alpha_1\alpha_2+(\alpha_1\beta_2+\alpha_2\beta_1) x+\beta_1\beta_2x^2}=\ove ...
Crypto数学
Coppersmith算法
很早之前就了解利用Coppersmith来解决CTF中的问题,但是只是懂了皮毛,运用起来一直是一知半解,现在好好研究一下它的原理。
原理解释
度为$d$的首一多项式:$F(x)=x^d+a_{d-1}x^{d-1}+…+a_1x^1+a_0(\bmod M)$
我们需要寻找$x_0$,使得$F(x_0)\equiv 0(\bmod M)$,这里的$|x_0|<M^{\frac 1d}$。
构造$G(x_0)=0$来简化$F(x_0)$(这里取的是等号并非同余),转换为等式之后就可以用求根公式或者牛顿迭代法等方法进行快速求根。而$G(x)$的构造往往与格的LLL算法有关。
已知$X$为$|x_0|$的取值上界,可以用行向量$b_F=(a_0,a_1X,…,a_dX^d)$表示$F(x)$。
原理举例取模数$M=323=17×19$,多项式$F(x)\equiv x^2+33x+215(\bmod M)$。
构造$G(x)=9F(x)-M(x+6)=9x^2-26x+3$,得到$G(3)=0$,也就是$ ...
杂谈
Reverse学习日记(二)
IDA快捷键:
F2:下断点。
F7:单步步入进入子函数内部。
F8:单步步过不进入子函数内部。
F5:查看伪代码。
F9:运行程序,直到遇到断点或者结束。
ESC:返回到跳转前的位置。
CTF
近期比赛复现Vol.1
SCTFBarter(赛后)两个文件:
sage:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152from Crypto.Util.number import *from random import *from secrets import flagdef gen_random(seed, P, Q, r_list, times): s = seed for i in range(times): s = int((s * P)[0]) r = int((s * Q)[0]) r_list.append(r) return r_listdef gen_seed(): seed = getRandomNBitInteger(32) return seeddef getP_Q(): Q = Curve.random_point() P = 114514*Q re ...
Crypto
周分享2:背包密码体制
背包问题设$n$元组由正整数$a_i$组成$A=(a_1,…,a_n)$,一已知的正整数$s$为$A$中部分元素的和,背包问题是在$A$中寻找所有的$a_i$使得和为$s$,$A$为背包向量,$s$为背包容积:
在现实生活中,背包问题的实例:
我们有一个能承重$s$的背包,现在我们有$n$个物品,每个物品都有一定的质量,问哪些物品放到背包里能可以把这个背包装满。
123456789101112import randomlist = []s = 0for _ in range(20): i = random.randint(100, 2000) list.append(i) temp = random.randint(0, 1) s += i*tempprint(list)print(s)
为了寻找符合条件的组使得和为$s$,可以求出$A$的所有的非空子集($2^n-1$个),分别求和比较一下即可找到:
123456789101112131415161718192021222324252627282930313233import random# e ...