Python ASCII 加密程序
Posted
技术标签:
【中文标题】Python ASCII 加密程序【英文标题】:Python ASCII encryption program 【发布时间】:2018-08-26 17:50:13 【问题描述】:早安,
我创建了一个简单的 ASCII 加密程序,但我只有 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】:首先,密钥的字符加法不是一个好的密码,甚至不是一个好的凯撒或维吉尼亚密码。为此,您需要模块化添加:普通字母表的模数 26(但没有大写或小写字母和其他字符)或字节的模数 256。对于字节,您需要为密钥的每个字节指定一个随机值。
目前您的密文有一个偏差:如果您要添加一个带有 0x00 的字符值和一个值为 0x00 的密钥,那么您将得到 0x00 作为密文字节。问题是值 0x00 只有在您的加密方案中使用该特定组合才能达到。因此,如果您看到值 0x00,那么您将立即知道密钥和明文值。
如何检查输入的密钥是否错误,并告诉我的程序在输入错误的情况下不要尝试解密。
无法检查键的值是否正确。您唯一能做的就是验证输出是否符合您的预期。
现代密码学使用消息认证码 (MAC) 来创建认证标签。这个标签可以根据密文和密钥(或者,对于不太安全的方案,明文和密钥)进行验证。还有一些经过身份验证的加密模式,例如 GCM,它们基本上是内置 MAC 身份验证的密码。
为什么加密后的文本比原来的要长?
如果您添加值为 255 或更低的值,那么您将获得 510 或更低的值。然而,这些值至少需要两个字节来编码。
如果我想加密其他东西而不是 ASCII 文本,会有多难?
没那么难:只需使用真正随机的密钥执行 XOR 或模加法(例如,对于 8 位/一个字节的模 256)。但是,要创建任何安全的东西,您可以使用一次性密码(密钥与二进制明文大小相同)或现代密码。
【讨论】:
感谢您的快速回复。你要么回答了我的问题,要么让我大吃一惊,或者两者兼而有之。好吧,至少我已经将脚趾浸入了加密的冰冷水域。这很有趣,将来我会为我的程序导入一个预制的密码类。当我变得更高级时,我会尝试在未来制作另一个更复杂的密码,因为很高兴知道它们是如何工作的。再次感谢。 检查密钥正确性的一种可能方法是在加密之前在消息末尾添加填充。不幸的是,标准 PKCS#7 填充使用非 ASCII 字节,但只需做一些工作就可以适应 ASCII。解密后检查padding,如果不正确,就知道key或者什么东西有问题。 @rossum 不,这仅适用于 CBC 块密码操作模式,即使密钥或数据不正确,填充看起来正确的可能性仍有 ~1/256。它不适用于问题中的密码或一次性密码。 马丁,我不同意。例如,您可以将填充添加到流密码中,并在解密后检查填充以查看它是否符合您的预期。甚至可以在加密之前添加像“XzebraX”这样简单的东西,并在解密后检查然后删除。是的,填充丢失问题的可能性很小。 您很难不同意 :) 但请注意,MAC 已被证明对于现代加密是安全的,如果可以使用现代流密码,您当然也可以使用现代 MAC 或经过身份验证的加密模式。对于经典的 Vigenere 密码等,填充不能很好地工作。例如,如果键大于填充,很容易错过错误(请参阅问题中的键!)。但是,是的,当然,任何已知的明文都可以给出一个粗略的指示——如果它失败那么肯定是有问题的。以上是关于Python ASCII 加密程序的主要内容,如果未能解决你的问题,请参考以下文章
ZZNUOJ_用C语言编写程序实现1171:加密(指针)(附完整源码)