在 python 中为 C# 脚本实现 PKCS7 填充
Implementing PKCS7 padding in python for a C# script
我在 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()
我没有收到任何错误,但有奇怪的文字任何想法谢谢!如果您有任何问题,请随时提问
在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 解码(但可能只是没有发布相应的代码)。
我在 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()
我没有收到任何错误,但有奇怪的文字任何想法谢谢!如果您有任何问题,请随时提问
在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 解码(但可能只是没有发布相应的代码)。