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