为什么将RSA公共指数设置为1的提交会出现问题?
为什么将RSA公共指数设置为1的提交会出现问题?
今天在cryptohack上做了一道公钥为1的题目,当我计算出明文的时候发现其与密文一模一样,这不经让人深思,是不是当公钥为1时,根本没有对原来的明文成功加密?
对此网上有这样一个回答:
简而言之,当e=1时,d=1,加密是恒等映射,即不加密。
RSA 是一种密码系统——一种执行密钥生成、加密和解密的方法——以便您可以安全地向其他人发送消息。 RSA 是称为公钥密码系统的一类成员,因为用于加密消息的密钥是公开的并且每个人都可以自由地知道。您用来解密用公钥加密的消息的密钥是秘密的,只有您知道,因此我们将其称为私钥。
如果您将挂锁和钥匙想象为公钥和私钥的模拟,您可以看到这如何处理现实世界的消息:
鲍勃给了爱丽丝一把挂锁(他的公钥)并保留了锁的钥匙(他的私钥)。
现在,如果爱丽丝想向鲍勃发送消息,她会将消息放入一个盒子中,将他的挂锁放在盒子上,然后将盒子发送给他。
只有鲍勃有钥匙,因此只有鲍勃可以打开挂锁并进入盒子。
为了实际生成密钥,RSA 需要三个重要的数字:
“N”,两个非常大的素数 p 和 q 的乘 ...
RSA中模数分解方法
RSA中对模数n分解的方法1、暴力算法家人们,但凡数值大一点包算不出来的,有着超级简单的脚本思路,但是等pycharm运行出结果的时间都够睡一觉了!
2、费马分解原理是将模数n分解成平方差的格式,适用于分解俩个因子接近的奇数(不是奇数就把他变成奇数呗!)$$n = a^2 - b^2 = (a+b)(a-b)$$具体步骤如下:
找到一个整数 a,使 a^2^ 接近 n 并且 a^2^≥n。
计算 b^2^=a^2^−n.
检查 b^2^ 是否是一个完全平方数。如果是,那么 n 的因子为 (a+b)和 (a−b)。
如果 b^2^ 不是一个完全平方数,增加 a 的值并重复步骤 2。
1234567891011121314151617import mathdef is_square(n): """检查一个数是否为完全平方数""" root = int(math.isqrt(n)) return root * root == ndef fermat_factor(n): &q ...
CBC 位翻转攻击
CBC 位翻转攻击
⊕
CBC加密解密过程:
1、核心思想 CBC的位翻转攻击通过对初始向量(IV)的优化,使得解密之后的明文块发生需要的变化,在CBC模式中密文的分组第一块通常为IV本身,我们需要考虑的是密文分组2的解密,明文分组1之后开始才是FLAG字段。
根据例题:https://aes.cryptohack.org/flipping_cookie/get_cookie/
12345678910111213141516171819202122232425262728293031323334353637383940from Crypto.Cipher import AESimport osfrom Crypto.Util.Padding import pad, unpadfrom datetime import datetime, timedeltaKEY = ?FLAG = ?@chal.route('/flipping_cookie/check_admin/<cookie>/<iv>/')def check_admin(cooki ...
CBC Mode介绍
CBC Mode
AES具有的五种加密模式中,有一种类似于ECB的加密算法,即为CBC
CBC(Cipher Block Chaining (CBC))将明文分成若干个小段,然后对每一段进行加密处理,对此,我们引入对应的图解
1、初始化向量初始化向量是一个长度为一个分组的比特序列,其在代码中通常被缩写为IV,密文的长度除以初始化向量的长度,从而得到密文分组的块数,以进行下一步操作
例题:
https://aes.cryptohack.org/ecbcbcwtf/
通过访问题设 https://aes.cryptohack.org/ecbcbcwtf/encrypt_flag/
可以得到一串密文,通过查看源码中IV的字节个数来对密文进行分块
1iv = os.urandom(16)
IV即为一个16字节的初始化向量
我们通过观察随机的密文
1{"ciphertext":"655d9981ee826b63ac16998a3c8a98418f5fb1938f5e97fc3cc5472c665916362df4f0ec9d95877313c26 ...
ECB Mode介绍
ECB Mode
简介 ECB 通过将明文分成n个大小的块,将每个块单独加密,从而得到一个密文。如果明文不能被块大小整除,那
么ECB模式则会通过附加一些字节从而使其能够被整除
在ECB中,每个块是单独加密的,所以其相互独立
获取块的大小和明文的大小 获取块大小应为解决ECB问题的第一步,可以通过纯手动来求解块的字节和明文的字节,假如加密输出的长度为八个字节,我在明文中添加一个字节,加密输出的长度没改变,但是在添加三个字节的时候,密文的长度就发生了改变,那么块的字节数就是密文突变字节的长度,从而让我们得到了块的字节大小
以https://aes.cryptohack.org/ecb_oracle
题目作为示例
以十六进制形式输入12个a时,则认为输入了6个字节,此时返回的密文十六进制长度为64,即32个字节
继续尝试输入第7个字节:
很容易可以发现,此时的密文长度发生了突变,并且是从32字节突变为48字节,由此可以定义块的长度为16字节。而因为在输入第七个字节时才发生的突变,由此可见,明文的字节数应为26(26+6=32)
由上述过程我们得到了块的大小 1 ...
AES对称加密
AES 对称加密
符号异或:⊕
字节输入顺序假定字节顺序:$$1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16$$规定的排列方式:$$[[1,5,9,13] \\ [2,6,10,14] \\ [3,7,11,15] \\ [4,8,12,16]]$$
加密方法$$明文 \\初始变化 \\9轮循环运算 \\1轮最终轮 \\密文$$
循环运算循环运算包括四大部分:字节代换,行移位,列混合,轮密钥加。
列混合在进行第10轮循环时不需要
字节代换 字节代换需要使用到S-BOX,通过初始变化后的矩阵,对其参照S-BOX进行变换,x为第一个数,y为第二个数,对应代换之后即可得字节代换后的结果
S-BOX
行移位 行移位即进行对字节代换后的矩阵进行一系列变化
即第二行头向尾移动一格,第三行头向尾移动俩格,第四行头向尾移动三格
得到的排列方式:$$[[1,5,9,13] \\ [6,10,14,2] \\ [11,15,3,7] \\ [16,4,8,12]]$$
列混合( 第十轮跳过 )给定一个规定好的正矩阵:$$[[02,03,01,01] \\ [0 ...