the cryptopals crypto challenges set 1 part 2

2024-03-15 00:20

本文主要是介绍the cryptopals crypto challenges set 1 part 2,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

今天写了剩下的几题:

在这里插入图片描述

  1. Implement repeating-key XOR
  2. Break repeating-key XOR
  3. AES in ECB mode
  4. Detect AES in ECB mode

思路与代码

1

利用之前的fixedxor函数就好,但是落实到具体容易出一些编码的问题。
我遇到的问题是在字符串和二进制/十六进制转换的时候,直接使用bin()/hex()去掉前缀的结果进行拼接,这样的后果是长度不对齐,字符转换成二进制,长度应为8,不足需要补前导0,十六进制则长度应为2,不足需要补前导0。

def ascii2hex(raw: str):'''>>> ascii2hex('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')61616161616161616161616161616161616161616161616161616161616161616161>>> ascii2hex('\n')0a'''return ''.join([hex(ord(i))[2:].zfill(2) for i in raw])def repeatXor(raw: str, key: str):'''>>> repeatXor("Burning 'em, if you ain't quick and nimble\nI go crazy when I hear a cymbal", 'ICE')0b3637272a2b2e63622c2e69692a23693a2a3c6324202d623d63343c2a26226324272765272a282b2f20430a652e2c652a3124333a653e2b2027630c692b20283165286326302e27282f'''key = (key * (int(len(raw) / len(key)) + 1))[:len(raw)]return fixedXor(ascii2hex((raw)), ascii2hex(key))def fixedXor(str1: str, str2: str) -> str:'''>>> fixedXor('1c0111001f010100061a024b53535009181c', '686974207468652062756c6c277320657965')746865206b696420646f6e277420706c6179'''dec1 = [int(str1[i:i+2], 16) for i in range(0, len(str1), 2)]dec2 = [int(str2[i:i+2], 16) for i in range(0, len(str2), 2)]return ''.join([hex(i ^ j)[2:].zfill(2) for i,j in zip(dec1, dec2)])

2

首先写一个计算汉明距离的函数,稍后利用汉明距离作为评分标准。

def hamming(raw1: str, raw2: str):'''>>> hamming('this is a test', 'wokka wokka!!!')37'''bias = 0if (len(raw1) > len(raw2)):bias = len(raw1) - len((raw2))raw1 = raw1[:len(raw2)]elif (len(raw1) < len(raw2)):bias = len(raw2) - len((raw1))raw2 = raw2[:len(raw1)]raw1 = ascii2bin(raw1)raw2 = ascii2bin(raw2)return sum([raw1[i] != raw2[i] for i in range(len(raw1))])+bias

然后读取文件,解码base64,得到raw string。注意要去掉每一行的换行符,还要注意文件最后应以换行作为最后一行防止最后一个字符串缺一个字符。

cipherFile = ''
with open('6.txt', 'r') as file:# 读取每一行lines = file.readlines()
for line in lines:cipherFile += line[0:-1]	
strCipherFile = base64.b64decode(cipherFile).decode()

用题目所给的两种方法计算汉明距离得分。得分的对应的keysize大概率就是keysize。

candidate = []
strCipherFile = base64.b64decode(cipherFile).decode()
for KeySize in range(2, 40):ss1 = strCipherFile[:KeySize]ss2 = strCipherFile[KeySize: 2 * KeySize]candidate.append((hamming(ss1, ss2)/KeySize, KeySize))
print(sorted(candidate))candidate = []
strCipherFile = base64.b64decode(cipherFile).decode()
for KeySize in range(1, 40):ss1 = strCipherFile[:KeySize]ss2 = strCipherFile[KeySize: 2 * KeySize]ss3 = strCipherFile[2 * KeySize: 3 * KeySize]ss4 = strCipherFile[3 * KeySize: 4 * KeySize]# 计算所有可能的汉明距离hamming_distances = [hamming(ss1, ss2), hamming(ss1, ss3), hamming(ss1, ss4), hamming(ss2, ss3), hamming(ss2, ss4), hamming(ss3, ss4)]# 计算平均汉明距离average_hamming_distance = sum(hamming_distances) / len(hamming_distances)candidate.append(((average_hamming_distance/KeySize), KeySize))
print(sorted(candidate))

第二种方法似乎更靠谱一点,因为真正的 keysize 没有出现在前一种里。。。最终 keysize 为 29。

然后基于 keysize 分块,按列划分字符串进行单个字符异或的破解(Detect single-character XOR),依次得到密钥的每一位,接着就可以用密钥进行解密(Implement repeating-key XOR)。
ps(这里思路我当时没缕清,以为 findSingleXor 的结果应该是有特征的。。。但是它是又一列的字符构成的字符串,当然不会有规律了。。。重点是猜出这一位的 key,然后拼起来,最后用来解密密文,这时的结果才是有规律的。。。)

KeySize = 29
strCipherFile = strCipherFile.zfill(2871+29)
breakCipher = [strCipherFile[i:i + KeySize] for i in range(0, len(strCipherFile), KeySize)]
transBreakCipher = [None for _ in range(len(breakCipher[0]))]
for i in range(KeySize):transBreakCipher[i] = ''.join([ss[i] for ss in breakCipher])key = ''
for i in transBreakCipher:key += findSingleXor(ascii2hex(i))[2]
print(key)	# nator X: Bring the noiseTermi
print(hex2ascii(repeatXor(strCipherFile, key)))

看到明文时还是很感动的

在这里插入图片描述

3

不知道题目是不是想让我们手动实现ecb的解密?说是不建议用openssl命令行,那我用python写代码应该没问题吧)

from Crypto.Cipher import AES
with open('7.txt', 'r') as file:lines = file.readlines()cipherText = ''.join([i[:-1] for i in lines]) + 'H' # 原来的文件最后没有换行
cipherText = base64.b64decode(cipherText)	# 题目说到结果使用了base64编码
key = 'YELLOW SUBMARINE'cipher = AES.new(key.encode('utf-8'), AES.MODE_ECB)
cipher.decrypt(cipherText.encode())

在这里插入图片描述

4

检测 ECB 模式。使用 ECB 会导致重复的密文加密后出现重复的结果,以此为依据,分析每个分组的出现频次即可。这里我先用 set 记录每个字符串对应的分组的集合的大小,如果有重复集合就会比较小,结果证明这样就足以检测 ECB 了。

with open('8.txt', 'r') as file:lines = file.readlines()lines = [i[:-1] for i in lines]
# 16 bytes == 16 hex values -> length of 32
splitLines = [set([ss[i:i+32] for i in range(0, len(ss), 32)]) for ss in lines]
print(sorted([(len(hh), i) for i, hh in enumerate(splitLines)]))

这篇关于the cryptopals crypto challenges set 1 part 2的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/810195

相关文章

poj 3050 dfs + set的妙用

题意: 给一个5x5的矩阵,求由多少个由连续6个元素组成的不一样的字符的个数。 解析: dfs + set去重搞定。 代码: #include <iostream>#include <cstdio>#include <set>#include <cstdlib>#include <algorithm>#include <cstring>#include <cm

Collection List Set Map的区别和联系

Collection List Set Map的区别和联系 这些都代表了Java中的集合,这里主要从其元素是否有序,是否可重复来进行区别记忆,以便恰当地使用,当然还存在同步方面的差异,见上一篇相关文章。 有序否 允许元素重复否 Collection 否 是 List 是 是 Set AbstractSet 否

论文翻译:ICLR-2024 PROVING TEST SET CONTAMINATION IN BLACK BOX LANGUAGE MODELS

PROVING TEST SET CONTAMINATION IN BLACK BOX LANGUAGE MODELS https://openreview.net/forum?id=KS8mIvetg2 验证测试集污染在黑盒语言模型中 文章目录 验证测试集污染在黑盒语言模型中摘要1 引言 摘要 大型语言模型是在大量互联网数据上训练的,这引发了人们的担忧和猜测,即它们可能已

多路转接之select(fd_set介绍,参数详细介绍),实现非阻塞式网络通信

目录 多路转接之select 引入 介绍 fd_set 函数原型 nfds readfds / writefds / exceptfds readfds  总结  fd_set操作接口  timeout timevalue 结构体 传入值 返回值 代码 注意点 -- 调用函数 select的参数填充  获取新连接 注意点 -- 通信时的调用函数 添加新fd到

Level3 — PART 3 — 自然语言处理与文本分析

目录 自然语言处理概要 分词与词性标注 N-Gram 分词 分词及词性标注的难点 法则式分词法 全切分 FMM和BMM Bi-direction MM 优缺点 统计式分词法 N-Gram概率模型 HMM概率模型 词性标注(Part-of-Speech Tagging) HMM 文本挖掘概要 信息检索(Information Retrieval) 全文扫描 关键词

MySQL record 02 part

查看已建数据库的基本信息: show CREATE DATABASE mydb; 注意,是DATABASE 不是 DATABASEs, 命令成功执行后,回显的信息有: CREATE DATABASE mydb /*!40100 DEFAULT CHARACTER SET utf8mb3 / /!80016 DEFAULT ENCRYPTION=‘N’ / CREATE DATABASE myd

Android set Tag, findViewWithTag使用

设置了tag为“principal”的view ImageView principal = (ImageView) findViewById(R.id.imagen_home_0);principal.setTag("principal"); 在其它地方获取,获取已经设置了tag为“principal”的view LayoutInflater inflater = LayoutInflate

C++ STL关联容器Set与集合论入门

1. 简介 Set(集合)属于关联式容器,也是STL中最实用的容器,关联式容器依据特定的排序准则,自动为其元素排序。Set集合的底层使用一颗红黑树,其属于一种非线性的数据结构,每一次插入数据都会自动进行排序,注意,不是需要排序时再排序,而是每一次插入数据的时候其都会自动进行排序。因此,Set中的元素总是顺序的。 Set的性质有:数据自动进行排序且数据唯一,是一种集合元素,允许进行数学上的集合相

Eclipse或MyEclipse中Java Working Set管理项目

随着学习JAVA的时间的越来越久,项目也越来越多,Eclipse或MyEclipse界面中显示一堆! 每次工作使用到的项目肯定不会太多...... 每次从这么大数量的工程当中找到自己要使用的, 必须大规模的滚动滚动条...... 图片一   Project Explorer中:    图片二:Package Explorer中: 这样就好找很多了,分类放!

Vue3图片上传报错:Required part ‘file‘ is not present.

错误 "Required part 'file' is not present" 通常表明服务器期望在接收到的 multipart/form-data 请求中找到一个名为 file 的部分(即文件字段),但实际上没有找到。这可能是因为以下几个原因: 请求体构建不正确:在发送请求时,可能没有正确地将文件添加到 FormData 对象中,或者使用了错误的字段名。 前端代码错误:在前端代码中,可能