Алгоритм шифрования случайным образом заменяет некоторые буквы - PullRequest
0 голосов
/ 03 ноября 2018

У меня есть следующий код Python:

file = open("encryption.txt","r")

str1 = file.read()

file.close
charList = []
for char in str1:
    charList.append(char)

bits = []
ascList = []
for i in range(len(charList)):
    ascList.append(ord(charList[i]))
    ascList[i] = "{0:08b}".format(ascList[i])
    currentAsc = ascList[i]
    currentStr = str(currentAsc)
    for x in range(len(currentStr)):

        currentChar = currentStr[x]
        bits.append(int(currentChar))

keyChar = input("enter the character that should act as the key: ")
keyAsc = "{0:08b}".format(ord(keyChar))
keyStr = str(keyAsc)
keyBits = []
for x in range(len(keyStr)):
    keyBits.append(int(keyStr[x]))


key = []
while len(key) != len(bits):

    for i in range(len(keyBits)):
        key.append(keyBits[i])


resultBits = []
for i in range(len(bits)):
    if key[i] != bits[i]:
        resultBits.append("1")
    else:
        resultBits.append("0")

resultSplitInt = []
resultInt = ''.join(resultBits)
for i in range(0,len(resultInt), 8):
    resultSplitInt.append(resultInt[i:i+8])

resultSplit = []
for i in range(len(resultSplitInt)):
    resultSplit.append(chr(int(resultSplitInt[i],2)))

result = ''.join(resultSplit)

file = open("encryption.txt","w")
print(str1)
print("--------------------")
print(result)
file.write(result)
print("done")
file.close()

запуск программы один раз должен изменить содержимое файла «encryption.txt» на основе ключа, а повторный запуск программы должен вернуть содержимое в исходную форму.

однако, когда я действительно запускаю код, некоторые буквы меняются местами.

например: если содержимое "привет мир" и я использую ключ "а" после запуска кода дважды я остаюсь с "hekko workd"

почему это происходит и как я могу это исправить?

p.s. Я знаю, что это не безопасный алгоритм шифрования и мой код не очень эффективен. Я новичок в Python и думал, что это будет забавная задача, чтобы попробовать. Я зашел так далеко и не могу найти никаких причин, почему это не работает

Ответы [ 2 ]

0 голосов
/ 04 ноября 2018

Поскольку вы работаете вне диапазона ASCII, вы должны открыть файл в двоичном режиме : open("encryption.txt","rb") и open("encryption.txt","wb")

Однако в двоичном режиме вы получаете байтовый массив из файла, а не строку:

file = open("encryption.txt","rb")

str1 = file.read()

file.close()
charList = []
for char in str1:
    charList.append(char)

bits = []
ascList = []
for i in range(len(charList)):
    ascList.append(charList[i])
    ascList[i] = "{0:08b}".format(ascList[i])
    currentAsc = ascList[i]
    currentStr = str(currentAsc)
    for x in range(len(currentStr)):

        currentChar = currentStr[x]
        bits.append(int(currentChar))

keyChar = input("enter the character that should act as the key: ")
keyAsc = "{0:08b}".format(ord(keyChar))
keyStr = str(keyAsc)
keyBits = []
for x in range(len(keyStr)):
    keyBits.append(int(keyStr[x]))


key = []
while len(key) != len(bits):

    for i in range(len(keyBits)):
        key.append(keyBits[i])


resultBits = []
for i in range(len(bits)):
    if key[i] != bits[i]:
        resultBits.append("1")
    else:
        resultBits.append("0")

resultSplitInt = []
resultInt = ''.join(resultBits)
for i in range(0,len(resultInt), 8):
    resultSplitInt.append(resultInt[i:i+8])

resultSplit = []
for i in range(len(resultSplitInt)):
    resultSplit.append(chr(int(resultSplitInt[i],2)))

result = ''.join(resultSplit)

file = open("encryption.txt","wb")
print(str1)
print("--------------------")
print(result)
file.write(result.encode())
print("done")
file.close()
0 голосов
/ 03 ноября 2018

Закрыть файл;

file = open("encryption.txt","r")

str1 = file.read()

file.close()

Тогда это работает.

Кстати, хотя бы используйте 'a' = 'A'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...