【问题标题】:Decrypting in Python 3.5 using cryptography在 Python 3.5 中使用密码学进行解密
【发布时间】:2018-07-09 08:27:23
【问题描述】:

我正在尝试解密从c_text 读取并存储在其中的加密文件。

from cryptography.fernet import Fernet

def cipher_decrypt(c_text):
    key = open(key_loc,'rb')
    key.seek(0)
    key_b = key.read()
    print ('Key: ' + str(key_b))
    print ('\nCipher text: ' + str(c_text))
    cipher_suite = Fernet(key_b)
    key.close()
    plain_text = cipher_suite.decrypt(c_text).decode()
    print ('\nPlain text: ' + plain_text)
    return plain_text

调用时,应该打印以下内容:

密钥:b'z7oCVMrxjjgx3n1HFI9oCkyxMnOrXekYKNMEBDKF704='

密文: b'gAAAAABbQxMuhTmZGb0fgR6eRwQO9_qPv0tMI9GVVtyNZbHmDb6YY0veCrvG8uat5m_huC6ZHjI17V-HhLTrUGgdQGlwowY1t24cAq9ybJgfGeQVwWLsR_0 = gAAAAABbQxMvgyBwq3hhMbLLP1VMbbboix4qw_TD0nF164TN2QqLGA5iHtX-dpEkj4ALMUY_dhYMqOfXY0ZUqIiX4Z_7Ud-EB8FHN0RsSiaiTBXHOS6_55A = gAAAAABbQxMwm8dek1OLeJp-sE6qmrXQSgbVqi3Sx2JwafW4YpTWuRJosBWJJpBFQ8zp8_rQ5rsLhhs7mQ4XwhGxND1GXmg8RZSrQ9-eclg6L5qyHH5Rch4 =' P>

纯文本:服务名称:gmail\n 用户名:gmail\n 密码:gmail\n\n

但是,它只打印纯文本的第一行。怎么了?

编辑:这是我写入文件的代码的 sn-p 以及加密函数。

            ser_name = pymsgbox.prompt("Enter service name")
            ser_name_s = 'Servicename: ' + str(ser_name) + '\n'
            manager = open(mng_name,'ab')
            manager.write(cipher_encrypt(ser_name_s))
            manager.close()
            acc_name = pymsgbox.prompt("Enter user name or email associated with " + str(ser_name))
            acc_name_s = 'Username/Email: ' + str(acc_name) + '\n'
            manager = open(mng_name,'ab')
            manager.write(cipher_encrypt(acc_name_s))
            manager.close()
            pw_name = pymsgbox.password("Enter password associated with " + str(acc_name))
            pw_name_s = 'Password: ' + str(pw_name) + '\n'
            manager = open(mng_name,'ab')
            manager.write(cipher_encrypt(pw_name_s))
            manager.close()

加密函数:

def cipher_encrypt(p_text):
    key = open(key_loc,'rb')
    key.seek(0)
    key_b = key.read()
    cipher_suite = Fernet(key_b)
    key.close()
    cipher_text = cipher_suite.encrypt(p_text.encode())
    return cipher_text

编辑 2: 经过一些测试,我注意到解密只发生在上述代码中的第一个写入命令(即使加密正常进行)。所以这肯定有问题,虽然我一辈子都搞不清楚......

【问题讨论】:

  • 嗨@Ray - 当你说它只打印纯文本的第一行时,你是什么意思?您上面的“纯文本:...”示例只有一行,所以您的意思是它在第一个 \n 之后切断?
  • @PhilSheard 它只打印这个:>Servicename: gmail

标签: python python-3.x encryption python-cryptography


【解决方案1】:

您可以通过从我认为的纯文本对象中删除 .decode() 操作来获得您想要的结果。或者,将解码后的版本从其最终字节序列转换为字符串。

这是一个演示版:

>> from cryptography.fernet import Fernet
>> key = Fernet.generate_key()
>> f = Fernet(key)
>> token = f.encrypt(b"Servicename: gmail\n Username: gmail\n Password: gmail\n\n")
>> decrypted = f.decrypt(token)
>> decoded = decrypted.decode()
>> print(decrypted)
b'Servicename: gmail\n Username: gmail\n Password: gmail\n\n'
>> print(decoded)
Servicename: gmail
 Username: gmail
 Password: gmail

您只看到版本中的第一行的事实是终端正在解释换行符。我使用 iPython (Jupyter) 和两个版本的完整输出进行了测试。

【讨论】:

  • 免责声明:我没有在生产中使用这个库,这只是从查看文档。
  • 我删除了 \n 字符以查看它们是否导致问题,但我仍然得到相同的结果。 @ScottMcC 给出的答案与我得到的相同。所以也许我在加密/写入文件时出错了?我将代码添加到我的原始帖子中。
【解决方案2】:

在您的示例中,我实际上得到的文字更少。重现步骤:

>>> from cryptography.fernet import Fernet
>>> key = b'z7oCVMrxjjgx3n1HFI9oCkyxMnOrXekYKNMEBDKF704='
>>> cipher_text = b'gAAAAABbQxMuhTmZGb0fgR6eRwQO9_qPv0tMI9GVVtyNZbHmDb6YY0veCrvG8uat5m_huC6ZHjI17V-HhLTrUGgdQGlwowY1t24cAq9ybJgfGeQVwWLsR_0=gAAAAABbQxMvgyBwq3hhMbLLP1VMbbboix4qw_TD0nF164TN2QqLGA5iHtX-dpEkj4ALMUY_dhYMqOfXY0ZUqIiX4Z_7Ud-EB8FHN0RsSiaiTBXHOS6_55A=gAAAAABbQxMwm8dek1OLeJp-sE6qmrXQSgbVqi3Sx2JwafW4YpTWuRJosBWJJpBFQ8zp8_rQ5rsLhhs7mQ4XwhGxND1GXmg8RZSrQ9-eclg6L5qyHH5Rch4='
>>> cipher_suite = Fernet(key)
>>> decrypt_result = cipher_suite.decrypt(cipher_text)
>>> decrypt_result
b'Servicename: gmail\n'

据我所知,这个密文中似乎没有存储任何其他信息?

【讨论】:

  • 这与我得到的输出相同。我将添加我在原始帖子中写入文件的代码部分。
  • 我还有一个问题。每次我加密某些东西时,密钥都会改变吗?
  • 是的,我相信加密过程中集成了一个时间戳,每次都会提供不同的加密输出。这使您可以选择在创建加密字符串时添加ttl 参数。
  • 那么有什么方法可以让我多次存储和使用同一个加密密钥?
  • 是的。时间戳不会影响加密过程 - 我阅读了所有 fernet 源代码。只需再次使用相同的密钥。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-28
  • 1970-01-01
  • 2018-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-15
相关资源
最近更新 更多