如何正确环绕单字节 XOR 密钥?
How to properly wrap around a single-byte XOR key?
我正在尝试对 12 位长的消息与 8 位长的密钥进行异或。
包装似乎有效的密钥的方法(当放大并用于 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 字符似乎丢失了,正如单词所示 "ooking"。
我假设它应该是 "cooking"。
将较长的消息与单字节密钥进行异或的正确方法是什么?
你的adjusted_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 生成用于加密用途。
评论更新:
- 一般来说,加密挑战使用大写字符作为历史密码。
- 二进制转换需要填写开头。 “1b”转换为
11011
而不是 00011011
。从这个可以看出answer
上半部分。
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
我正在尝试对 12 位长的消息与 8 位长的密钥进行异或。
包装似乎有效的密钥的方法(当放大并用于 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 字符似乎丢失了,正如单词所示 "ooking"。
我假设它应该是 "cooking"。
将较长的消息与单字节密钥进行异或的正确方法是什么?
你的adjusted_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 生成用于加密用途。
评论更新:
- 一般来说,加密挑战使用大写字符作为历史密码。
- 二进制转换需要填写开头。 “1b”转换为
11011
而不是00011011
。从这个可以看出answer
上半部分。
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