【问题标题】:Implementing PKCS7 padding in python for a C# script在 python 中为 C# 脚本实现 PKCS7 填充
【发布时间】:2021-09-05 08:46:33
【问题描述】:

我在 python 中使用 AES 函数进行了加密:

    def encrypt_text(self):
        raw       = self.PKCS7_padding()
        iv        = Random.new().read(self.block_size)
        cipher    = AES.new(self.key, AES.MODE_CBC, iv)
        encrypted = base64.b64encode(iv + cipher.encrypt(raw))
        return encrypted

然后填充:

def PKCS7_padding(self):
    return self.text+chr(16-len(self.text)%16)*(16-len(self.text)%16)

但是当我将它发送到这个 c# 函数时

        public static string DecryptString(string key, string cipherText)  
        {  
            byte[] iv = new byte[16];  
            byte[] buffer = Convert.FromBase64String(cipherText);  
  
            using (Aes aes = Aes.Create())  
            {  
                aes.Key = Convert.FromBase64String(key);  
                aes.IV = iv;  
                ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV);  
  
                using (MemoryStream memoryStream = new MemoryStream(buffer))  
                {  
                    using (CryptoStream cryptoStream = new CryptoStream((Stream)memoryStream, decryptor, CryptoStreamMode.Read))  
                    {  
                        using (StreamReader streamReader = new StreamReader((Stream)cryptoStream))  
                        {  
                            return streamReader.ReadToEnd();  
                        }  
                    }  
                }  
            }  
        }

说我发送“hello world” 我收到了我发送的字符串加上随机的非 pritable 字符的奇怪组合。例如:“�Ȯ�Ŗf�”��Xhello world”

密钥生成如下:

key = base64.b64encode(os.urandom(32))
return key.decode()

我没有收到任何错误但奇怪的文字任何想法谢谢!如果您有任何问题,请随时提出

【问题讨论】:

  • @Topaco 我如何添加分隔符?

标签: python c# aes padding


【解决方案1】:

在 Python 代码中,生成一个随机 IV 并与密文连接。但是,在 C# 代码中,缺少 IV 和密文的分离。取而代之的是,应用零 IV 并解密 IV 和密文的连接,这会导致问题。

IV 和密文的分离可以添加到 C# 代码中,例如如下:

byte[] buffer = ...

byte[] ct = new byte[buffer.Length - iv.Length];
Buffer.BlockCopy(buffer, 0, iv, 0, iv.Length);
Buffer.BlockCopy(buffer, iv.Length, ct, 0, ct.Length);
buffer = ct;

using ...

请注意,PyCryptodome 在专用模块中支持填充:Crypto.Util.Padding

另外,在 Python 代码中,Base64 编码的密钥在任何地方都没有经过 Base64 解码(但可能只是没有发布相应的代码)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-22
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    • 2014-07-28
    • 1970-01-01
    • 1970-01-01
    • 2013-09-10
    相关资源
    最近更新 更多