Python 2.7 不同python解释器的不同输出

Python 2.7 不同python解释器的不同输出,python-2.7,python-3.x,Python 2.7,Python 3.x,我试图用python实现单字节XOR解密。当我在python2.7中运行它时,我得到了所需的值 烹饪MC就像一磅培根 但是当我在python3.2中运行时 0,b'\x1b77316?x\x15\x1b\x7f+x413=x9x7-6x:9;76' 这是我的密码 ''' Created on Oct 24, 2015 Matasano Crypto Challenge 3 ''' import binascii from Crypto.Util.strxor import strxor_c

我试图用python实现单字节XOR解密。当我在python2.7中运行它时,我得到了所需的值 烹饪MC就像一磅培根 但是当我在python3.2中运行时 0,b'\x1b77316?x\x15\x1b\x7f+x413=x9x7-6x:9;76'

这是我的密码

'''
Created on Oct 24, 2015

Matasano Crypto Challenge 3
'''

import binascii
from Crypto.Util.strxor import strxor_c  
from collections import Counter
import math

FREQUENCY_TABLE = {
    b'a':  0.08167,
    b'b':  0.01492,
    b'c':  0.02782,
    b'd':  0.04253,
    b'e':  0.1270,
    b'f':  0.02228,
    b'g':  0.02015,
    b'h':  0.06094,
    b'i':  0.06966,
    b'j':  0.00153,
    b'k':  0.00772,
    b'l':  0.04025,
    b'm':  0.02406,
    b'n':  0.06749,
    b'o':  0.07507,
    b'p':  0.01929,
    b'q':  0.00095,
    b'r':  0.05987,
    b's':  0.06327,
    b't':  0.09056,
    b'u':  0.02758,
    b'v':  0.00978,
    b'w':  0.02360,
    b'x':  0.00150,
    b'y':  0.01974,
    b'z':  0.00074,
}

def englishness(a):
    c = Counter(a.lower())
    total_characters = len(a)
    coefficient = sum(math.sqrt(FREQUENCY_TABLE.get(char, 0) * y/total_characters) for char,y in c.items())
    print (coefficient)
    return coefficient

def answer(s):
    print (s)
    def compfunc(items):
        return englishness(items[1])
    return max([(i, strxor_c(s,i)) for i in range(0,256)], key = compfunc)

if __name__ == '__main__':
    encodedS = b'1b37373331363f78151b7f2b783431333d78397828372d363c78373e783a393b3736'
    S = binascii.unhexlify(encodedS)
    print (answer(S))

我把代码弄乱了一点,发现englishness函数在python3.2中没有给出正确的系数,它总是给出0。我不知道我做错了什么。

这行有问题

coefficient = sum(math.sqrt(FREQUENCY_TABLE.get(char, 0) * y/total_characters) for char,y in c.items())
在Python3中,char是字符的ord,而不是Python2中的实际字符。比较:

$ python2
Python 2.7.6 (default, Jun 22 2015, 17:58:13) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> [char for char in b'foobar']
['f', 'o', 'o', 'b', 'a', 'r']
>>> 

$ python3
Python 3.4.3 (default, Jul 28 2015, 18:20:59) 
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> [char for char in b'foobar']
[102, 111, 111, 98, 97, 114]
一个丑陋的快速修复方法是

coefficient = sum(math.sqrt(FREQUENCY_TABLE.get(bytes([char]), 0) * y/total_characters) for char,y in c.items())

我认为图书馆的作者也许能以更好的方式回答这个问题。似乎是pycrypto库有问题。@CrakC我认为这不是pycrypto库的问题。如上图所示,给出期望结果的i值为88。我打开了Python3.2解释器,strxorècS,88给了我正确的输出字符串,像煮培根一样煮MC。此外,根据官方网站,pycrypto通过Python2.1到Python3.3进行工作,这实际上解决了问题。但是你能告诉我byteschar和bytes[char]之间的区别吗?byteschar返回一个字符零数组记住,这里char是一个数字bytes10==b'\x00\x00\x00\x00\x00\x00\x00\x00'为什么它会为列表提供不同的输出?也就是说,为什么将数字括在方括号中会给出不同的值?参数的解释与bytearray相同: