Python ASCII加密程序

Python ASCII加密程序,python,encryption,cryptography,ascii,Python,Encryption,Cryptography,Ascii,你好 我创建了一个简单的ASCII加密程序,对此我只有3个问题: 如何检查输入的密钥是否错误,并告诉我的程序如果输入的密钥不正确,不要尝试解密 为什么加密文本比原始文本长 如果我想加密其他东西而不是ASCII文本,那有多难 谢谢,以下是我的代码和结果: 导入时间 key=“这个■是吗╝b键glkHPAfgbm(*&%)$$*(■ô▀" string=“我他妈的疯了,即使我重复你说不出来的字母” entext=“” detext=“” keycnt=0 打印(“显示要加密的文本”) 时间。睡眠(

你好

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

  • 如何检查输入的密钥是否错误,并告诉我的程序如果输入的密钥不正确,不要尝试解密
  • 为什么加密文本比原始文本长
  • 如果我想加密其他东西而不是ASCII文本,那有多难
  • 谢谢,以下是我的代码和结果:

    导入时间
    key=“这个■是吗╝b键glkHPAfgbm(*&%)$$*(■ô▀"
    string=“我他妈的疯了,即使我重复你说不出来的字母”
    entext=“”
    detext=“”
    keycnt=0
    打印(“显示要加密的文本”)
    时间。睡眠(1)
    打印(字符串)
    时间。睡眠(5)
    #循环遍历字符串和密钥,并将ascii值添加到一起以创建加密字符
    对于字符串中的sLetter:
    entext+=chr(ord(sLetter)+ord(key[keycnt]))
    keycnt+=1
    如果keycnt==len(键):
    keycnt=0
    打印(“显示加密文本”)
    时间。睡眠(1)
    打印(entext)
    #复位键位置
    keycnt=0
    #循环遍历字符串和密钥,并将ascii值相减以创建解密字符
    对于entext中的sLetter:
    detext+=chr(ord(sLetter)-ord(key[keycnt]))
    keycnt+=1
    如果keycnt==len(键):
    keycnt=0
    时间。睡眠(2)
    打印(“显示解密文本”)
    时间。睡眠(1)
    打印(detext)
    
    time.sleep(1)
    首先,使用密钥字符进行加法不是一个好的密码,甚至不是一个好的Caesar或Vigenère密码。为此,您需要模块加法:普通字母表的模数26(但没有大小写和其他字符)或模数256表示字节。如果是字节,则密钥的每个字节都需要一个随机值

    目前,您的密文有一个偏差:如果您要添加一个带有0x00的字符值和一个键值0x00,那么您将得到0x00作为密文字节。问题是,只有在加密方案中使用该特定组合才能达到值0x00。因此,如果您看到值0x00,那么您将立即知道密钥和plaintext值

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

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

    现代密码学使用消息身份验证码(MAC)来创建身份验证标签。该标签可以根据密文和密钥(或者,对于不太安全的方案,明文和密钥)进行验证。还有一些经过身份验证的加密模式,如GCM,它们基本上是内置MAC身份验证的密码

    为什么加密文本比原始文本长

    如果添加值为255或更低的值,则会得到510或更低的值。但是,这些值至少需要两个字节进行编码

    如果我想加密其他东西而不是ASCII文本,那有多难


    没有那么难:只需使用真正的随机密钥执行异或或或模加(例如,8位/一字节的模256)。但是,要创建任何安全的内容,您可以使用一次性键盘(其中密钥与二进制明文大小相同)或者一个现代密码。

    谢谢你的快速回答。你的回答或者让我大吃一惊,或者两者兼而有之。好吧,至少我已经在加密的冰水中浸泡了我的脚趾。这很有趣,将来我只需为我的程序导入一个预先制作的密码类。当我变得更高级时,我会尝试制作另一个更复杂的cip她会在将来告诉她,因为知道它们是如何工作的很好。再次感谢。检查密钥正确性的一种可能方法是在加密之前在消息的末尾添加填充。不幸的是,标准PKCS#7填充使用非ASCII字节,但只需做一点工作就可以适应ASCII。解密后检查填充,如果是i,请检查填充n正确,那么你就知道密钥或其他东西是错误的。@rossum否,这只适用于CBC分组密码操作模式,然后即使密钥或数据不正确,填充看起来也有大约1/256的可能性。这不起作用(很好)对于问题中的密码或一次性pad.Maarten,我不同意。您可以在流密码中添加填充,并在解密后检查填充是否符合您的预期。即使是像“XzebraX”这样简单的东西“可以在加密之前添加,然后检查,然后在解密后删除。是的,填充遗漏问题的可能性很小。您很难不同意:)但请注意,MAC对于现代密码来说是安全的,如果可以使用现代流密码,您当然也可以使用现代MAC或经过身份验证的加密模式。对于经典的Vigenere密码等,填充并不能很好地工作。例如,如果密钥大于填充,则很容易错过错误(参见问题中的关键!)但是,是的,当然,任何已知的明文都可以给出一个粗略的指示——如果它失败了,那么肯定是出了问题。