gpt4 book ai didi

python - 在 python 中返回多个值时的不同结果(加密挑战)

转载 作者:太空宇宙 更新时间:2023-11-04 00:05:32 24 4
gpt4 key购买 nike


我正在研究密码挑战的问题 3(第 1 组)(https://cryptopals.com/sets/1/challenges/3)
我已经找到 key ('x')并解密了消息('Cooking mcs like a pound of bacon')这是我的代码:

from hexToBase64 import hexToBinary
from fixedXOR import xorBuffers

def binaryToChar(binaryString):
asciiValue = 0
for i in range(int(len(binaryString))-1,-1,-1):
if(binaryString[i] == '1'):
asciiValue = asciiValue + 2**(7-i)
return chr(asciiValue)

def decimalToBinary(number):
binaryString = ""
while (number != 0):
bit = number % 2
binaryString = str(bit) + binaryString
number = int(number/2)
while(len(binaryString) < 8):
binaryString = "0" + binaryString
return binaryString

def breakSingleByteXOR(cipherString):
decryptedMess = ""
lowestError = 10000
realKey = ""
for i in range(0,128):
errorChar = 0
tempKey = decimalToBinary(i)
tempMess = ""
for j in range(0,len(cipherString),2):
#Take each byte of the cipherString
cipherChar = hexToBinary(cipherString[j:j+2])
decryptedChar = binaryToChar(xorBuffers(cipherChar,tempKey))
asciiValue = ord(decryptedChar)
if (not ((asciiValue >= 65) and (asciiValue <= 90)) \
or ((asciiValue >= 90) and (asciiValue <= 122)) \
or ( asciiValue == 32 )):
# if the character is not one of the characters ("A-Z" or "a-z"
# or " ") consider it as an "error"
errorChar += 1
tempMess = tempMess + decryptedChar
if(errorChar < lowestError):
lowestError = errorChar
decryptedMess = tempMess
realKey = chr(i)
return (realKey,decryptedMess)



if __name__ == "__main__":
print(breakSingleByteXOR("1b37373331363f78151b7f2b783431333d78397828372d363c78373e783a393b3736"))

问题是当我使用函数 breakSingleByteXOR 返回一个值 (decryptedMess) 时,结果是“像一磅培根一样 cooking mcS”
但是当我用函数返回 2 个值时(如上面的代码 - (key,decryptedMess)),我收到了一个奇怪的结果 ('x', 'cOOKING\x00mc\x07S\x00LIKE\x00A\x00POUND\x00OF\x00BACON') ,任何人都可以向我解释为什么会这样吗?

老实说,我正在学习 python,因为我正在接受挑战,所以希望我不会用这些代码触发任何人....如果有人能给我一些关于编写好的 python 代码的建议,我也将非常感激
谢谢大家 :D

最佳答案

的确,打印字符串不同的原因是 print 的一个怪癖。功能。

该程序更深层次的问题是它没有产生正确的答案。那是因为大丑if试图确定解密字符是否在可接受范围内的方法是不正确的。

它在两个方面是不正确的。第一个是 (asciiValue >= 90)应该是 (asciiValue >= 97) .一种可以避免此错误的编写所有这些表达式的更好方法是将它们表示为 (asciiValue >= ord('a'))(asciiValue == ord(' '))等等,避免难以理解的数字。

第二种方式是表达式没有正确分组。当他们站立时,他们这样做:

character is not in the range 'A' to 'Z',
or character is in the range 'a' to 'z',
or character is 'space',
then count this as an error

所以一些应该是好的字符(特别是“a”到“z”和空格)被认为是坏的。要修复,您需要重新处理括号,以便条件为:

character is not in the range 'A' to 'Z',
and character is not in the range 'a' to 'z',
and character is not space,
then count this as an error

或者(这是你正在尝试的风格)

character is not (in the range 'A' to 'Z'
or in the range 'a' to 'z'
or a space)

我不会给你确切的插入表达式来修复程序,你最好自己解决。 (处理这种复杂性的一个好方法是将它移到一个单独的函数中,该函数返回 TrueFalse 。这样可以很容易地测试您的实现是否正确,只需调用具有不同字符的函数和看到结果就是你想要的。)

当您获得正确的表达式时,您会发现该程序发现了一个不同的“最佳 key ”,并且该 key 的解密字符串不包含与 print 行为异常的愚蠢的超出范围的字符。 .

关于python - 在 python 中返回多个值时的不同结果(加密挑战),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54253301/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com