【问题标题】:CBC decryption using ECB functionCBC解密使用ECB函数
【发布时间】:2017-02-18 00:17:55
【问题描述】:

尝试解决 Cryptopals 挑战 10,其中必须使用所有 ASCII 0 (\x00\x00\x00 &c) 的 IV 针对“黄色潜艇”对文本文件进行 CBC 解密。 文本文件的链接如下:

http://cryptopals.com/static/challenge-data/10.txt

我遵循 CBC 使用的算法,获取密文,解密(使用 ECB 解密),然后对第一个块使用带有初始化向量的异或,对后续块使用密文(i-1)。但是,由于某些无法理解的原因,我没有得到可读的解密。我只是在解密后打印时看到一些奇怪的字符:

from Crypto.Cipher import AES
key ='YELLOW SUBMARINE'
iv = "%00%00%00"*32
iv = iv.replace('%',r'\x')

#XOR-ing function
def xor_strings(a, b):
    return "".join(chr(ord(a1) ^ ord(b1)) for a1, b1 in zip(a, b))

#Taking input file and converting it into a single string 
file = open('10.txt','r')
data = file.read()
block = 128

obj = AES.new(key, AES.MODE_ECB)

def split_len(string, size):
    return [string[i:i+size] for i in range(0, len(string), size)]

mylist = split_len(data,block)


decrypted = ""
for i in range (0,len(mylist)):
     mystr = obj.decrypt(mylist[i])
     if (i==0):
          decrypted = decrypted + xor_strings(mystr,iv)
     else:
          decrypted = decrypted + xor_strings(mystr, mylist[i-1])
 print decrypted

这里可能有什么问题?

【问题讨论】:

  • ASCII '0' 字符是十六进制 30 而不是十六进制 00。
  • @rossum 也尝试过。给出相同的结果。问题还说:IV of all ASCII 0 (\x00\x00\x00 &c)

标签: python cryptography pycrypto cbc-mode


【解决方案1】:

iv 需要为 16 个零字节(这里的问题是“ASCII 0”时措辞不明确):

iv = "\x00" * 16

解密前需要对文件进行base64解码:

from base64 import b64decode
#...

file = open('10.txt','r')
data = file.read()
data = b64decode(data)

最后,您的块大小需要以字节为单位才能使此代码正常工作,而不是位:

block = 16

【讨论】:

    猜你喜欢
    • 2013-04-06
    • 1970-01-01
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    相关资源
    最近更新 更多