如何正确包装单字节XOR密钥?

时间:2019-07-13 17:18:00

标签: python encryption cryptography xor

我正在尝试对8位长的密钥对12位长的消息进行XOR。

包装似乎有效的密钥的方法(当按比例放大并用于269位长的加密消息时)如下:

message = "110111101010"

key = "01100001"

def adjust_key_length(message, key):
    multiplier = len(message) / len(key)
    modulo = len(message) % len(key)
    adjusted_key = key[0:modulo] + key * multiplier
    return adjusted_key

上面的代码翻译为:

multiplier = 1
modulo = 4
adjusted_key = "0110" + "01100001"

如上所述,这种调整密钥长度的方法似乎适用于实际的加密消息,产生解密的英语纯文本,但有一个例外:加密单词的第一个ASCII字符似乎丢失了,因为这个词的意思是“寻找”。

我想这应该是“烹饪”。

将一个较长的消息与一个字节的密钥进行异或的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

您的Adjustd_key不正确。

def adjust_key_length(message, key):
    multiplier = len(message) / len(key)
    modulo = len(message) % len(key)
    adjusted_key = multiplier* key + key[0:modulo] 
    return adjusted_key

message = "110111101010"

key = "01100001"

print( adjust_key_length(message, key))

我们希望密钥比某些部分重复

output   : 011000010110

如果我们讨论通过X-OR加密文本的正确方法,则肯定需要更长的密钥流。您可以通过urandom生成用于加密。

更新评论:

  1. 通常,密码学挑战使用大写字符作为历史密码。
  2. 二进制转换需要填写开头。 '1b'被转换为11011而不是00011011。您可以从此answer
  3. 中看到

上部。

hex_string = "1b37373331363f78151b7f2b783431333d78397828372d363c78373e783a393b3736"

num_of_bits = len(hex_string) * 4

binary_string = bin(int(hex_string, 16))[2:].zfill(num_of_bits)

# list of english characters
#chars = "abcdefghijklmnopqrstuvwxyz"
chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

# list comprehension, creating binary forms of above characters,
# making them 8 bits long by adding zeroes to the beginning
binary_chars = [format(ord(char), 'b').zfill(8) for char in chars]

def adjust_key_length(message, key):
    multiplier = int(len(message) / len(key))
    modulo = len(message) % len(key)
    adjusted_key = multiplier * key  + key[0:modulo]
    return adjusted_key