首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不同python解释器的不同输出

不同python解释器的不同输出
EN

Stack Overflow用户
提问于 2015-10-25 20:56:05
回答 1查看 131关注 0票数 0

我试图在python中实现单个字节的XOR解密。当我在python2.7中运行这个程序时,我得到了所需的值

(88, "Cooking MC's like a pound of bacon")

但是当运行在python3.2中时,我得到

(0, b'\x1b77316?x\x15\x1b\x7f+x413=x9x(7-6<x7>x:9;76')

这是我的密码。

代码语言:javascript
复制
'''
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)。我不知道我做错了什么。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-26 01:20:10

这一行有问题

代码语言:javascript
复制
coefficient = sum(math.sqrt(FREQUENCY_TABLE.get(char, 0) * y/total_characters) for char,y in c.items())

在Python3中,char是字符的命令,而不是Python2中的实际字符。比较:

代码语言:javascript
复制
$ 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]

一个快速(丑陋)的解决方法是

代码语言:javascript
复制
coefficient = sum(math.sqrt(FREQUENCY_TABLE.get(bytes([char]), 0) * y/total_characters) for char,y in c.items())
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33334992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档