【问题标题】:How do I encrypt and decrypt a string in python 3.7?如何在 python 3.7 中加密和解密字符串?
【发布时间】:2019-01-27 11:02:53
【问题描述】:

I've found this exactly same question。但是 PyCrypto 不会同时安装在 python 3.6.5 和 3.7.0 上。

所以,我实现了某种类似于 Gronsfeld 的密码。我知道,这很糟糕,但我可以简单地用密码加密和解密字符串

def encrypt(string, password):
    int_list = []
    password_len = len(password)
    for cnt, sym in enumerate(string):
        password_sym = password[cnt % password_len]
        int_list.append(ord(sym)-ord(password_sym))
    return int_list

# got some list which contain mine key to Todoist api, yes, this can be bruteforced, but same as any other API key
>>> [-20, -20, -50, -14, -61, -54, 2, 0, 32, 27, -51, -21, -54, -53, 4, 3, 29, -14, -51, 29, -10, -6, 1, 4, 28,
       29, -55, -17, -59, -42, 2, 50, -13, -14, -52, -15, -56, -59, -44, 4]

def decrypt(int_list, password):
    output_string = ""
    password_len = len(password)
    for cnt, numb in enumerate(int_list):
        password_sym = password[cnt % password_len]
        output_string += chr(numb+ord(password_sym))
    return output_string

那么,应该怎么做呢?

【问题讨论】:

  • 我测试了你的代码,它可以工作。你到底有什么问题?
  • 您尝试安装 PyCrypto 了吗?它在 3.6 上运行良好。
  • @Sharku 我认为它不安全:/
  • @DanielRoseman `Command ""c:\program files (x86)\python36-32\python.exe" -u -c "import setuptools, tokenize;__file__='C:\\Users\ \EEgorov.NWX\\AppData\\Local\\Temp\\pip-install-6hs9ukdo\\pycrypto\\setup.py';f=getattr(tokenize, 'open', open)(文件);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, file, 'exec' ))" install --record C:\Users\EEgorov.NWX\AppData\Local\Temp\pip-record-m0z81zyx\install-record.txt --single-version-externally-managed --compile" 失败,错误代码1 在 C:\Users\EEgorov.NWX\AppData\Local\Temp\pip-install-6hs9ukdo\pycrypto`

标签: python python-3.x security


【解决方案1】:

Cryptography 是一个积极开发的库,可提供加密配方和原语。它支持 Python 2.6-2.7、Python 3.3+ 和 PyPy。

安装

$ pip install cryptography

使用高级对称加密配方的示例代码:

from cryptography.fernet import Fernet
key = Fernet.generate_key()
cipher_suite = Fernet(key)
cipher_text = cipher_suite.encrypt(b"A really secret message. Not for prying eyes.")
plain_text = cipher_suite.decrypt(cipher_text)

【讨论】:

  • 如果密钥不正确,它会抛出异常,因此它会被暴力破解到新的速度,甚至不需要在线检查 API 密钥。不要认为这会提高安全性。
  • @EgorEgorov 我听不清楚!你能给我一个它产生错误的示例代码吗?您应该提供长度为 44 的密钥,否则将导致“不正确的填充”。 Fernet.generate_key() 生成一个随机密钥。如果你愿意,你可以生成一个密钥。确保保持这种格式 ---> key = b'Yzx79GUul49KKI11kQ-42pjySAMDCbKywCrDravrbkg='
  • 有问题的代码,它会遍历密码符号。因此,如果代码输入错误的密码,它会生成带有错误 unicode 符号的字符串,而不是抛出异常。
  • @EgorEgorov 任何 Decrypt 函数都不会说它是否正确,但该函数将获取密钥和密文并返回输出!这里的密钥长度是 42。所以为了暴力攻击,你需要使用(可以有 96 个字符)96*96*............*96 =96^42组合。所以从数学上讲,它需要很多时间来蛮力,你的生命就会结束。
  • 我们应该如何存储Fernet生成的密钥以供将来加密/解密?
最近更新 更多