学习crypto解密(一)

目录

1.basic set1-challenge1(十六进制转换为base64)

2.basic set1-challenge2(固定异或)

3.basic set1-challenge3(单字节XOR密码)

4.basic set1-challenge4(检测单字符异或)


第一题 十六进制转换为base64

在做题之前我们需要了解一下什么是十六进制以及什么是base64
十六进制:它由0-9,A-F组成,字母不区分大小写。与10进制的对应关系是:0-9对应0-9;A-F对应10-15;N进制的数可以用0~(N-1)的数表示,超过9的用字母A-F。
base64:Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于 2的6次方是64,所以每6个比特为一个单元,对应某个可打印字符。3个字节有24个比特,对应于4个Base64单元,即3个字节可由4个可打印字符来表示。在Base64中的可打印字符包括字母A-Z、a-z、数字0-9共有62个字符,此外两个可打印符号在不同的系统中而不同。

题目
链接: https://www.cryptopals.com/sets/1/challenges/1.

分析
使用decode('hex')将字符串进行 hex解码得到文本,使用 encode('base64')对文本进行base64编码

python实现

import binascii
import base64
datahex='49276d206b696c6c696e6720796f757220627261696e206c696b65206120706f69736f6e6f7573206d757368726f6f6d'
datahex=binascii.a2b_hex(datahex).decode()#十六进制转字符串
bytehex=datahex.encode("utf-8")#字符串转二进制
bytehex= base64.b64encode(bytehex)#二进制转base64
print(bytehex)

结果为

b'SSdtIGtpbGxpbmcgeW91ciBicmFpbiBsaWtlIGEgcG9pc29ub3VzIG11c2hyb29t'

实现之后我们来了解下base系列如何编码

base64 :A~Z , a~z , 0~9 , + , /

编码过程:将输入字符串按字节切分,取得每个字节对应的二进制值(若不足8bytes则高位补0),然后将这些二进制数值串联起来,再按照6bytes 一组进行切分(因为2^6=64),最后一组若不足6bytes则末尾补0。将每组二进制值转换成十进制,然后在上述表格中找到对应的符号并串联起来就是Base64编码结果。
在这里插入图片描述

base32:A~Z , 2~7
先获取输入字符串每个字节的二进制值(不足8bytes高位补0)串联起来,按照 5bytes一组进行切分,并将每组二进制值转换成十进制,在下述表格中找到对应的编码串接起来就是Base32编码
在这里插入图片描述

base16 : 使用A~F , 0~9
编码过程:先获取输入字符串每个字节的二进制值(不足8bytes在高位补0),然后将其串联进来,再按照4bytes一组进行切分,将每组二进制数分别转换成十进制,在下述表格中找到对应的编码串接起来就是Base16编码
在这里插入图片描述
总结:base系列编码的重要之处即在于变表,编码表之间的不同转换可以帮助我们实现不同位数的编码。
详见: 加密解密 之base系列编码.

第二题 固定异或

做题之前我们需要了解一下什么是异或运算(XOR)
它的定义是:两个值相同时,返回false,否则返回true。也就是说,XOR可以用来判断两个值是否不同。
在这里插入图片描述
在这里插入图片描述
XOR的有趣之处还在于如果对一个值连续做两次 XOR,会返回这个值本身。
在这里插入图片描述

题目

链接: https://www.cryptopals.com/sets/1/challenges/2.

分析
先使用 decode('hex')进行hex解码得到文本,再将两份文本对应位置上的值进行异或。如输入1解码后为\x1c\x01\x11\x00\x1f\x01\x01\x00\x06\x1a\x02KSSP\t\x18\x1c,输入2解码后为hit the bull's eye,此时需要将字符\x1c的ASCII数值和字符h的ASCII数值进行异或,依次类推,最后将各个位置异或后的值转换为字符连接起来,并进行hex编码即可。

python实现

def hex_xor(hex1,hex2):
    dec1=int(hex1,16)
    dec2=int(hex2,16)
    xor=dec1^dec2
    return hex(xor)
def main():
    a=hex_xor("1c0111001f010100061a024b53535009181c","686974207468652062756c6c277320657965")
    print(a)
if __name__ == '__main__':
	main()

结果为

0x746865206b696420646f6e277420706c6179

结果存在题目要求中没有出现的0x这个前缀,于是我们还需再在return处后面加[2:]

return hex(xor)[2:]

第三题 单字节XOR密码

题目
链接: https://cryptopals.com/sets/1/challenges/3.
做题之前我们需要了解一下字符频率
通俗的说字符频率即是日常生活中我们使用字符的频率,若为正常的英文文本,那么它的字符频率应该尽可能的大。

分析
遍历密钥解密得到各个明文文本,使用字符频率作为指标对明文进行评分,评估各个明文文本并选择评分最高的明文文本,其对应的密钥就是需要找到的密钥。

python实现

# 遍历密钥解密得到各个明文文本,使用字符频率作为指标对明文进行评分,评估各个明文文本并选择评分最高的明文文本,其对应的密钥就是需要找到的密钥。
CHARACTER_FREQ = {
    'a': 0.0651738, 'b': 0.0124248, 'c': 0.0217339, 'd': 0.0349835, 'e': 0.1041442, 'f': 0.0197881, 'g': 0.0158610,
    'h': 0.0492888, 'i': 0.0558094, 'j': 0.0009033, 'k': 0.0050529, 'l': 0.0331490, 'm': 0.0202124, 'n': 0.0564513,
    'o': 0.0596302, 'p': 0.0137645, 'q': 0.0008606, 'r': 0.0497563, 's': 0.0515760, 't': 0.0729357, 'u': 0.0225134,
    'v': 0.0082903, 'w': 0.0171272, 'x': 0.0013692, 'y': 0.0145984, 'z': 0.0007836, ' ': 0.1918182
}
#获得概率分数
def get_score(string):
	score=0
	for char in string:
		char=char.lower()
		if char in CHARACTER_FREQ:
			score+=CHARACTER_FREQ[char]
	return score
#将hex的每个字符与备选密钥进行xor
def single_xor(candidate_key,hex_string):
	result=""
	for i in hex_string:
		b=chr(candidate_key^i)
		result+=b
	return result
#遍历备选密钥
def Traversal_singlechar(hex_string):
	candidate=[]
	for candidate_key in range(256):
		plaintext=single_xor(candidate_key,hex_string)
		score=get_score(plaintext)
		result={
		'score':score,
		'plaintext':plaintext,
		'key':candidate_key
		}
		candidate.append(result)
	return sorted(candidate,key=lambda c:c['score'])[-1]
def main():
	#hex_string1=raw_input("input hex1:\n").decode('hex')
	string='1b37373331363f78151b7f2b783431333d78397828372d363c78373e783a393b3736'
	hex_string1=bytes.fromhex(string)
	result=Traversal_singlechar(hex_string1)['plaintext']
	key=chr(Traversal_singlechar(hex_string1)['key'])
	print(result)
	print(key)
if __name__ == '__main__':
	main()

结果为

Cooking MC's like a pound of bacon
X

第四题 检测单字符异或

题目
链接: https://www.cryptopals.com/sets/1/challenges/4.

分析
对此文件中的每一行进行Single-byte XOR cipher中的操作,则可以得到每一行经过解密后的明文文本及其所对应的评分。对这些评分进行排序,评分最高的即为结果。

python实现

import single_byte_XOR_cipher
import os
import linecache

def main():
	contents=linecache.getlines('4.txt')
	candidate=[]
	for string in contents:
		hex_string=string[:-1].decode('hex')
		candidate.append(single_byte_XOR_cipher.Traversal_singlechar(hex_string))
	print sorted(candidate,key=lambda c:c['score'])[-1]['plaintext']


if __name__ == '__main__':
	main()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值