将C加密算法转换为Python3

2024-09-30 04:33:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经得到了一个现有的加密算法,在将密码发送到API之前,需要对其进行加密。在

除了Python之外,我没有任何其他语言的经验,因此我无法理解在功能上我需要做些什么来复制它。在

我相信C中AES的默认模式是CBC。我想我已经复制了所需的大部分工作,但我需要填充数据,我不知道这到底发生在哪个阶段,也不知道长度是在哪里添加的。我不明白在C代码中事情发生的顺序。我也相信默认的填充方法是PKCS#7,尽管我很高兴在这方面得到更正。在

Original code

public static string EncryptStringToBytes_Aes(string username, string password)
{
    string encrypted = string.Empty;
    byte[] clearBytes = Encoding. UTF8.GetBytes(password);
    using (Aes aesAlg = Aes.Create())
    {
        byte[] k;
        byte[] iv;
          byte[] bytes = Encoding.UTF8.GetBytes(username);
        k = SHA256.Create().ComputeHash(bytes);
        iv = MD5.Create().ComputeHash(bytes);
        aesAlg.Key = k;
        aesAlg.IV = iv;

        ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, 
        aesAlg.IV);

        using (MemoryStream msEncrypt = new MemoryStream())
        {
                using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, 
                encryptor, CryptoStreamMode.Write))
                {
                    csEncrypt.Write(clearBytes, 0, clearBytes.Length);
                }
                encrypted = Convert.ToBase64String(msEncrypt.ToArray());
        }
    }
    return encrypted;
}
^{pr2}$

我得到一个“ValueError:输入字符串长度必须是16的倍数”。在

当我尝试填充时,encode声明“AttributeError:'bytes'object没有属性'encode'”

我希望能读懂这段代码的人能帮助我完成在Python中重建功能的最后步骤。在


Tags: 代码功能stringbytescreateusernamepasswordbyte
2条回答

看看docs,您没有正确使用密码模块。在

调用AES.new()时,传入的键必须是16个字符的字符串,因此需要填充key属性的长度为16个字节。在

encrypt()方法以一个字节字符串作为输入,在这里您似乎试图传递一个长度(在您的示例中甚至没有定义)。在

您的评论建议您通过了它,否则您不会看到AttributeError异常。在

您看到的AttributeError是因为Cipher.encrypt()返回一个字节数组,而字节数组没有encode()方法。首先需要将字节数组转换为字符串。以下来自here的代码片段应该有帮助:

import array
decoded = array.array('b', your_input).tostring().decode('utf-8') 

显然应该将'utf-8'替换为'base64'。在

我相信我已经成功了,综合运用了这里的答案和评论。不需要填充密钥,因为哈希值已经是16的倍数。下面是(希望)成功的代码供参考。(在不幸地测试连接之前,我还要翻译另外两段C代码!)在

Python Conversion

from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
import hashlib
import base64


username = "example"
password = "example"
mode = AES.MODE_CBC
bytes = username.encode('utf-8')
data_for_padding = password + '0' + str(len(password))
padded = pad(data_for_padding)

key = hashlib.sha256(bytes).digest()
iv = hashlib.md5(bytes).digest()
encryptor = AES.new(key, mode, IV = iv)
clearbytes = padded.encode('utf-8')
ciphertext = encryptor.encrypt(clearbytes)

result = base64.b64encode(ciphertext)

相关问题 更多 >

    热门问题