Python ASCII加密程序

时间:2018-08-26 17:50:13

标签: python encryption cryptography ascii

美好的一天,

我已经创建了一个简单的ASCII加密程序,对此我只有3个问题:

  1. 我如何检查输入的密钥是否错误,并告诉我的程序如果输入错误,不要尝试解密。
  2. 为什么加密后的文本比原始文本长?
  3. 如果我想加密非ASCII文本的其他东西,会有多难?

谢谢,这是我的代码和结果,如下:

import time
key = "This■isôthe╝key¦b££glkHPAfgbm(*&%$$*(■ô▀"
string = "Encryption the hell out of me, even if I repeatttttttt lettersssss you can't tell"

entext = ""
detext = ""
keycnt=0

print("Displaing Text to be Encrypted")
time.sleep(1)
print(string)
time.sleep(5)

#Loops through the string and the key and adds the ascii values together to create a Encrypted character
for sLetter in string:
    entext += chr(ord(sLetter) + ord(key[keycnt]))
    keycnt += 1
    if keycnt == len(key):
        keycnt =0


print("Displaying encrypted Text")
time.sleep(1)
print(entext)

#Resetting key position
keycnt=0

#Loops through the string and the key and subtracts the ascii values together to create a decrypted character
for sLetter in entext:
    detext += chr(ord(sLetter) - ord(key[keycnt]))
    keycnt += 1
    if keycnt == len(key):
        keycnt =0
time.sleep(2)

print("Displaying decrypted Text")
time.sleep(1)
print(detext)
time.sleep(1)

1 个答案:

答案 0 :(得分:1)

首先,加上密钥字符不是一个好的密码,甚至不是一个好的凯撒或维格涅尔密码。为此,您将需要模块化添加:普通字母的模数为26(但没有大写或小写及其他字符),字节的模数为256。如果是字节,则密钥的每个字节都需要一个随机值。

当前,您的密文有一个偏见:如果您要添加一个带有0x00且键值为0x00的字符值,那么您将获得0x00作为密文字节。问题在于,在您的加密方案中,仅使用该特定组合达到了值0x00。因此,如果看到0x00值,那么您将立即知道键值和纯文本值。

  

如何检查输入的密钥是否错误,并告诉我的程序如果输入的密钥错误,不要尝试解密。

无法检查键的值是否正确。您唯一可以做的就是验证输出是否符合您的期望。

现代密码术使用消息身份验证代码(MAC)创建身份验证标签。可以针对密文和密钥(或者对于较不安全的方案,明文和密钥)来验证此标签。还有一些认证的加密模式,例如GCM,基本上是内置MAC认证的密码。

  

为什么加密后的文本比原始文本长?

如果您添加的值等于或小于255,那么您将得到的值等于或小于510。但是,这些值至少需要两个字节来编码。

  

如果我想加密非ASCII文本的其他内容,将有多困难?

并不难:只需使用真正的随机密钥执行XOR或模块化加法(例如8位/一个字节的256模)。但是,要创建任何安全的文件,您可以使用一次性键盘(密钥的大小与二进制纯文本的大小相同)或现代密码。