我已经得到了一个现有的加密算法,在将密码发送到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中重建功能的最后步骤。在
看看docs,您没有正确使用密码模块。在
调用
AES.new()
时,传入的键必须是16个字符的字符串,因此需要填充key
属性的长度为16个字节。在encrypt()
方法以一个字节字符串作为输入,在这里您似乎试图传递一个长度(在您的示例中甚至没有定义)。在您的评论建议您通过了它,否则您不会看到
AttributeError
异常。在您看到的
AttributeError
是因为Cipher.encrypt()
返回一个字节数组,而字节数组没有encode()
方法。首先需要将字节数组转换为字符串。以下来自here的代码片段应该有帮助:显然应该将
'utf-8'
替换为'base64'
。在我相信我已经成功了,综合运用了这里的答案和评论。不需要填充密钥,因为哈希值已经是16的倍数。下面是(希望)成功的代码供参考。(在不幸地测试连接之前,我还要翻译另外两段C代码!)在
相关问题 更多 >
编程相关推荐