【问题标题】:Encrypt strings with chars below ASCII 127 in Python在 Python 中使用低于 ASCII 127 的字符加密字符串
【发布时间】:2020-10-24 12:37:10
【问题描述】:

我正在使用这对函数来加密和解密小字符串。始终小于键“s2”。

这些函数适用于所有字符都低于 ascii 127 的任何字符串,但是当我将它们与诸如“¡hola!”之类的字符串一起使用时会失败或“canción”。

编码“¡hola!”得到 b'\xc2\xa1hola!',这种格式破坏了 desencrypt_str() 的结果

我尝试了一些方法,但我无法让它们发挥作用。

关于如何改进功能的任何想法?

s2 = "A9BS03JJDJS9375MFJ498DJSWL59S"   # a string as "key", assume it´s longer than any s1

def encrypt_str(s1):
  try:
    j = "".join([chr(ord(c1) ^ ord(c2)) for (c1, c2) in zip(s1, s2)])    # XOR
    j = "".join(carac.encode('utf-8').hex() for carac in j)              # converts to hexa chars
    return j                                                         # a readable string
  except:
    return ""


def desencrypt_str(s1):
  try:
    s1 = bytes.fromhex(s1)                                         # encrypted string with hexa values
    j = "".join([chr(c1 ^ ord(c2)) for (c1, c2) in zip(s1, s2)])   # reverts XOR
    return j                               # the original string
  except:
    return ""

【问题讨论】:

    标签: python encryption non-ascii-characters


    【解决方案1】:

    解密必须与加密相反。

    首先,在encrypt_str这一行:

    j = "".join(carac.encode('utf-8').hex() for carac in j) 
    

    在功能上等同于:

    j = j.encode('utf-8').hex()
    

    其逆是:

    s1 = bytes.fromhex(s1).decode('utf-8')
    

    而对于desencrypt_str 中的标签,使用s1 而不是j

    异或运算的逆运算是异或运算本身,即直线

    j = "".join([chr(ord(c1) ^ ord(c2)) for (c1, c2) in zip(s1, s2)])    
    

    对于加密和解密是相同的。用于解密s1 表示密文,s2 表示密钥。

    这将导致以下解密:

    def desencrypt_str(s1):
        try:
            s1 = bytes.fromhex(s1).decode('utf-8')                         
            j = "".join([chr(ord(c1) ^ ord(c2)) for (c1, c2) in zip(s1, s2)])    
            return j                               
        except:
            return ""
    

    这里的明文和密钥可以包含任何Unicode字符,例如

    s2 = "€9ΩS0αJDJS9375MFJ498DJSWL59S"
    ciphertext = encrypt_str("¡hola!canción€")
    plaintext = desencrypt_str(ciphertext)
    print(plaintext)
    

    显示¡hola!canción€

    【讨论】:

    • 谢谢@Topaco。我在 Python3 解释器中得到这个: >>> t1 = "English" >>> t2 = "Español" >>> bytes.fromhex(t1).decode('utf-8') ValueError: non-hexadecimal number found在 fromhex() arg 的位置 1 >>> bytes.fromhex(t2).decode('utf-8') ValueError: non-hexadecimal number found in fromhex() arg at position 4
    • 在运行发布的示例时,您何时收到此错误? Here你可以找到一个有效的(Python 3)实现,请将它与你的代码进行比较。
    • 在变量级别,它工作得很好。在我的 Python3 代码中,我正在从文件中读取纯文本,对其进行加密,并将其作为密文保存在另一个文件中。对于我所看到的(我在 Windows 中工作),字符串保存为“┬íhola!”和“canci├│n”(我希望你能看到非ASCII字符。那些特殊字符导致错误。
    • 您当前的问题/发布的代码不会以任何方式处理文件 I/O。请发布一个完整但最小且可执行的代码,以便作为一个整体重现问题。发布的明文来自哪里,这是明文文件的内容还是十六进制编辑器的输出?明文文件是否可靠,即是否可以排除损坏?请不要在评论中回答这个问题,而是将缺失的信息添加到问题中(即提出一个新问题或通过在末尾附加信息来编辑当前问题)。谢谢。
    • 在文本编辑器中将源纯文本文件保存为ANSI,加密时使用.encode('ascii'),解密时使用.decode('ansi')解决。非常感谢@Topaco 的帮助。
    猜你喜欢
    • 2021-12-31
    • 2014-06-20
    • 2015-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多