【问题标题】:a cracking challenge in pythonpython中的一个破解挑战
【发布时间】:2018-04-05 14:52:39
【问题描述】:

大家好,我只是想帮助理解该算法&谢谢

PASS = input('Enter the Flag: ')
KEY = 'I know, you love decrypting Byte Code !'
I = 5
SOLUCE = [57, 73, 79, 16, 18, 26, 74, 50, 13, 38, 13, 79, 86, 86, 87]
KEYOUT = []
for X in PASS:
    KEYOUT.append((ord(X) + I ^ ord(KEY[I])) % 255)
    I = (I + 1) % len(KEY)

if SOLUCE == KEYOUT:
    print('You Win')
else:
    print('Try Again !')

任何帮助!

【问题讨论】:

  • 这看起来像是XOR cipher(标志和关键字符上的异或)和Caesar cipher(移位I)的组合,所以从那里开始阅读......
  • 我在询问 for 循环中到底发生了什么以及如何反转我尝试了 chr 但没有工作
  • 这真的很容易,我很难在没有给出完整解决方案的情况下提示。请详细说明您尝试了什么以及失败的地方。在没有确凿证据的情况下提供完整的解决方案在 SO 上是不受欢迎的
  • 好读:How to debug small programs (#1) 使用调试器或大量打印来显示代码背后的步骤...... - 比如“什么是 ord(X)。我是什么 ^ ord(...) 等
  • Bruteforce 在这种情况下肯定是一种选择。而且它不需要 Ruby。 ;)

标签: python python-3.x challenge-response


【解决方案1】:

会有我对这个问题的想法和完整的解决方案。

  1. 通知len(KEYOUT) == len(PASS) == len(SOLUCE)
  2. 注意符号之间没有依赖关系
  3. 所以你只需要找到这样的X (ord(X) + I ^ ord(KEY[I])) % 255) 等于SOLUCE 中的对应元素

    FLAG = []
    for part in SOLUCE:
        for ord_X in range(0, 256):
            current_try = (ord_X + I ^ ord(KEY[I])) % 255
            if current_try == part:
                FLAG.append(chr(ord_X))
                break
        else:
            print("fiasco")  # if you aren't sure task is solvable. Not necessary line
        I = (I + 1) % len(KEY)
    

验证很简单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-21
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    相关资源
    最近更新 更多