2
我在加密/解密交叉语言时遇到了一些问题。Python AES加密填充导致C#解密中的问题
这里是我的Python代码一些文本加密:
class AESCipher:
def __init__(self, key, iv):
self.key = base64.b64decode(key)
self.iv = base64.b64decode(iv)
def encrypt(self, raw):
BS = 16
pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS)
raw = pad(raw)
cipher = AES.new(self.key, AES.MODE_CBC, self.iv)
res = self.iv + cipher.encrypt(raw)
return base64.b64encode(res)
def decrypt(self, enc):
enc = base64.b64decode(enc)
unpad = lambda s : s[:-ord(s[len(s)-1:])]
cipher = AES.new(self.key, AES.MODE_CBC, self.iv)
return unpad(cipher.decrypt(enc[16:]))
crypt = AESCipher("key", "iv")
print "{0}".format(crypt.encrypt("Hallow"))
和C#解密:
public static string DecryptStringFromBase64(string base64String)
{
byte[] bytes = Decrypt(Convert.FromBase64String(base64String));
var utf8 = Encoding.UTF8.GetString(bytes);
return utf8;
}
public static byte[] Decrypt(byte[] bytes)
{
AesManaged algorithm = new AesManaged();
algorithm.IV = Convert.FromBase64String("IV");
algorithm.Key = Convert.FromBase64String("KEY");
byte[] ret = null;
using (var decryptor = algorithm.CreateDecryptor())
{
using (MemoryStream msDecrypted = new MemoryStream())
{
using (CryptoStream csEncrypt = new CryptoStream(msDecrypted, decryptor, CryptoStreamMode.Write))
{
csEncrypt.Write(bytes, 0, bytes.Length);
}
ret = msDecrypted.ToArray();
}
}
return ret;
}
然而解密值永远是不正确的是这样的:
我觉得这跟这个有关系填充,有人可以建议如何解决这个问题吗?
我这给了一个镜头和线'csEncrypt.Write(字节,16,bytes.Length); //更改'抛出错误: '在mscorlib.dll中发生类型'System.ArgumentException'的未处理异常 附加信息:偏移量和长度超出数组的边界或者计数大于元素的数量从索引到源集合的末尾.' – TomSelleck
对不起,我认为第三个参数是结束索引,但它是一个计数。它现在应该工作。 –
工作对我很好,谢谢,只需要改变'algorithm.Key = Convert.FromBase64String(“KEY”);''algorithm.Key = Encoding.UTF8.GetBytes(key);' – Milen