簡體   English   中英

XOR加密算法不適用於> 54個字符

[英]XOR cryptographic algorithm not working for > 54 chars

最近,我在研究Project Euler Problem 59之后開始研究密碼學,並制作了基本的XOR密碼學系統。 在這種情況下,您的輸出和一個隨機鍵的組合被制成並保存到文本文件中(僅作為測試,一旦修復此錯誤,我會做得更好),但是我注意到某些消息並沒有正確加密或解密。 我將其范圍縮小為長度> 54的消息。我的代碼如下:

#encrypt.py

import random

msg = raw_input("Enter your message: ")
out = ""
key = ""

for i in xrange(len(msg)):
    key += chr(random.randint(0,255))

k = 0

for char in msg:
    out += chr(ord(msg[k]) ^ ord(key[k]))
    k += 1

print "\nYour output is:", out
print "Your key is:", key

raw_input()

with open("output.txt","r+") as f:
    f.truncate()
    f.write(out+key)

和解密:

#decrypt.py

import sys

if not len(sys.argv) > 1: exit()

with open(sys.argv[1],"r+") as f:
    content = f.read()

msg, key = content[:len(content)/2], content[len(content)/2:]

out = ""

k = 0

for char in msg:
    out += chr(ord(char) ^ ord(key[k]))
    k += 1

print out
raw_input()

對於更長的消息(超過54個字符),當解密它們時,將給出一串隨機字符。 有誰知道為什么會這樣嗎?

由於從隨機位中提取字符可能會產生在屏幕上看起來難看的字符,因此可以在輸出之前嘗試對輸出進行十六進制編碼。

#encrypt.py

import random

msg = raw_input("Enter your message: ")
out = ""
key = ""

for i in xrange(len(msg)):
    key += chr(random.randint(0,255))

k = 0

for char in msg:
    out += chr(ord(msg[k]) ^ ord(key[k]))
    k += 1
out = ":".join("{:02x}".format(ord(c)) for c in out)
key = ":".join("{:02x}".format(ord(c)) for c in key)
print "\nYour output is:", out
print "Your key is:", key

raw_input()

with open("output.txt","w+") as f:
    f.truncate()
    f.write(out+key)

然后,要進行解密,必須先刪除冒號並進行十六進制解碼,然后才能繼續進行常規解密。

#decrypt.py

import sys

if not len(sys.argv) > 1: exit()

with open(sys.argv[1],"r+") as f:
    content = f.read()

content = content.replace(':', '')
msg, key = content[:len(content)/2], content[len(content)/2:]
msg = msg.decode('hex')
key = key.decode('hex')
out = ""

k = 0

for char in msg:
    out += chr(ord(char) ^ ord(key[k]))
    k += 1

print out
raw_input()

在控制台上,結果如下所示:

$ python encrypt.py           
Enter your message: onetwothreefourfivesixseveneightnineteneleventwelvethirteen
Your output is: 7f:09:d0:8c:2e:1a:e0:a0:84:e7:bf:3b:e8:cc:f3:4e:35:e4:4f:20:c8:00:72:9d:f0:bc:de:54:88:30:a6:3d:93:3f:c1:6d:46:4a:68:ca:96:2e:16:50:43:0f:30:fa:27:f3:f2:8d:35:4b:6a:11:cc:02:04
Your key is: 10:67:b5:f8:59:75:94:c8:f6:82:da:5d:87:b9:81:28:5c:92:2a:53:a1:78:01:f8:86:d9:b0:31:e1:57:ce:49:fd:56:af:08:32:2f:06:af:fa:4b:60:35:2d:7b:47:9f:4b:85:97:f9:5d:22:18:65:a9:67:6a
$ cat output.txt 
7f:09:d0:8c:2e:1a:e0:a0:84:e7:bf:3b:e8:cc:f3:4e:35:e4:4f:20:c8:00:72:9d:f0:bc:de:54:88:30:a6:3d:93:3f:c1:6d:46:4a:68:ca:96:2e:16:50:43:0f:30:fa:27:f3:f2:8d:35:4b:6a:11:cc:02:0410:67:b5:f8:59:75:94:c8:f6:82:da:5d:87:b9:81:28:5c:92:2a:53:a1:78:01:f8:86:d9:b0:31:e1:57:ce:49:fd:56:af:08:32:2f:06:af:fa:4b:60:35:2d:7b:47:9f:4b:85:97:f9:5d:22:18:65:a9:67:6a
$ python decrypt.py output.txt
onetwothreefourfivesixseveneightnineteneleventwelvethirteen

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM