【问题标题】:Encryption algorithm randomly replaces some letters加密算法随机替换一些字母
【发布时间】:2018-11-03 15:27:30
【问题描述】:

我有以下 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”的内容,再次运行程序应该会将内容恢复到原来的形式。

但是,当我实际运行代码时,一些字母被换掉了。

例如: 如果内容是“hello world” 我使用键“a” 运行代码两次后,我留下了“hekko workd”

为什么会发生这种情况,我该如何解决?

附言我知道这既不是一种安全的加密算法,也不是我的代码非常有效。我是 python 新手,并认为这将是一个有趣的任务。我已经走到了这一步,但找不到任何不工作的原因

【问题讨论】:

  • 我无法重现;我得到“A”作为输出。但也许问题在于您没有正确关闭文件:file.close 应该是 file.close()
  • @Aran-Fey 你必须运行两次才能将文件转换回来

标签: python-3.x encryption


【解决方案1】:

由于您在 ASCII 范围之外操作,您应该在binary mode 中打开文件: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()

【讨论】:

  • 谢谢,这解决了问题
【解决方案2】:

关闭文件;

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

str1 = file.read()

file.close()

然后就可以了。

顺便说一句,至少使用'a'='A'

【讨论】:

    猜你喜欢
    • 2012-06-24
    • 2013-06-15
    • 1970-01-01
    • 2017-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    相关资源
    最近更新 更多