使用位旋转的解密逻辑

2024-09-30 01:26:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试为下面的加密逻辑编写一个解密逻辑

import os
import string

keybytes = bytes(os.urandom(8))
bit = keybytes[0] % 7 + 1
kxor = []
key = ""

for i in range(1, 8):
    kxor.append(ord(string.ascii_letters[keybytes[i] % len(string.ascii_letters)]))
    key = key + chr(kxor[i-1])
print("Key is %s rotated by %d bits." % (key, bit))

def rotatel(x, bit):
    return ((x << bit) & 0xff) | (x >> (8 - bit))

plaintext = "ABCDE"
bit = 6
kxor = [65,115,113,107,98,75,85]
encryptedText = []
for i in range(0, len(plaintext)):
    encryptedText.append(rotatel(plaintext[i], bit) ^ kxor[i % len(kxor)])
print (bytes.encryptedText)

现在,bitkxor值,我已经硬编码了它们,因为我能够把它们取回来;这意味着,如果这些是我用于加密的值,那么在编写解密逻辑时,我可以通过编程方式获取kxor。 我正在挣扎的是rotatel函数。 我正试图扭转这种逻辑,但我不知道怎么做。因此需要一些指针来反转rotatel函数。 这是正确的方法还是我完全错误地对待这件事

基本上,我的问题是如何反转return ((x << bit) & 0xff) | (x >> (8 - bit))


Tags: keyinimportforstringlenbytesos
2条回答

我终于弄明白了。我想为rotatel写一个反向逻辑-

def rotatel(x, bit):
    return ((x << bit) & 0xff) | (x >> (8 - bit))

我就是这样做的-

def rotater(x, bit):
    return ((x >> bit)& 0xff) | (x << (8 - bit)) & 0xff

例如:

bit = 6
x = "123456"
rotatel(x, bit) = "561234"

因此,您需要的是:

y = "561234"
reverse_rotatel(y, bit) = "123456"

但你必须记住,你xory(561234)和kxor在你rotatel之后。因此,您必须再次使用kxor获得reverse_rotatel之前的y

相关问题 更多 >

    热门问题