这是我在Unity3d中使用的解密方法。当我用128字节大小的部分调用它时它工作得很好但是当它一次说256字节时失败。我应该只在blockize-chunks中调用它吗?
经过进一步分析,我认为PKCS7填充没有以加速的速度被移除。但是它不是相同的字节,因此排除了填充删除。但是我不知道这24个额外字节来自哪里。首先,您可以看到解密文本中没有任何遗漏。那他们到底来自哪里呢?当解码大块时,底部解密数组的调试视图具有此内容:
1 ------ 3895 ------- / home / max / PycharmProjects / RealityShell / Backend \ r \ n \ xx2 \ xx2 \ xx2 \ xx2 \ xx2 \ xx2 \ xx2 \ xx2 \ xx2 \ XX2 \ XX2 \ XX2 \ XX2 \ XX2 \ XX2 \ XX2 \ XX2 \“\ xx2neL \ XX2 \ XX2 \ XX2 \ XX2 \ XX2 {2 ------ 3895 ------- /家/ MAX / PycharmProjects / RealityShell / Backend \ r \ n \ xx2 \ xx2 \ xx2 \ xx2 \ xx2 \ xx2 \ xx2 \ xx2 \ xx2 \ xx2 \ xx2 \ xx2 \ xx2 \ xx2tC; \ xx2VCY3 \ xx2Z?r \ xx2 \ xx2 \ xx2f3 ------ 3895 ------- / home / max / PycharmProjects / RealityShell / Backend \ r \ n \ xx2 \ xx2 \ xx2 \ xx2 \ xx2 \ xx2 \ xx2 \ xx2 \ xx2 \ xx2 \ xx2 \ xx2 \ xx2 \ xx2 \ xx2 \ xx2neWc \ xx2 \ xx2 \ xx2 \ xx2 + \ xx2 \ xx2L; M4 ------ 3895 ------- / home / max / PycharmProjects / RealityShell / Backend \ r \ñ\
所以我的测试内容是“1 ------ 3895 ------- / home / max / PycharmProjects / RealityShell / Backend \ r \ n \”等行,而\ xx2字节是莫名其妙的并构成问题。
public static string DecryptStringFromBytes_Aes(string serversays, string Key)
{
Debug.Log ("Decrypt incoming length:" + serversays.Length.ToString ());
byte[] cipherText = Convert.FromBase64String(serversays);
byte[] keystring = Encoding.UTF8.GetBytes(Key);
using (Aes aesAlg = Aes.Create())
{
aesAlg.Key = keystring;
aesAlg.Mode = CipherMode.CBC;
aesAlg.BlockSize = 128;
aesAlg.Padding = PaddingMode.PKCS7;
byte[] cipherText_only = new byte[cipherText.Length - aesAlg.IV.Length];
byte[] IV = new byte[aesAlg.IV.Length];
Array.Copy(cipherText, 0, IV, 0, aesAlg.IV.Length);
Array.Copy(cipherText, aesAlg.IV.Length, cipherText_only, 0, cipherText_only.Length);
aesAlg.IV = IV;
using (MemoryStream ms = new MemoryStream())
{
using (ICryptoTransform decryptor = aesAlg.CreateDecryptor())
{
using (CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Write))
{
cs.Write(cipherText_only, 0, cipherText_only.Length);
//cs.FlushFinalBlock();
byte[] decrypted = ms.ToArray();
string decr_serverSays = Encoding.UTF8.GetString (decrypted);
Debug.Log (decr_serverSays + "..." + decr_serverSays.Length.ToString());
return decr_serverSays;
}
}
}
}
}
这是Python加密方法:
def encrypt(self, key, raw):
encoder = PKCS7Encoder()
#mac = HMAC.new(raw, digestmod=SHA256)
raw_pad = encoder.encode(raw)
iv = Random.new().read(AES.block_size)
cipher = AES.new(key.encode('utf-8'), AES.MODE_CBC, iv)
encry_cipher = iv + cipher.encrypt(raw_pad)
encry = base64.b64encode(encry_cipher)
#print(len(encry), len(encry_cipher), len(raw_pad))
return encry
答案 0 :(得分:0)
不完全确定如何解释该调试输出,但代码存在问题:在刷新MemoryStream
之前,您正在阅读整个CryptoStream
。您可以做的最好的事情是将ms.ToArray()
移到内部使用之外:
using (MemoryStream ms = new MemoryStream())
{
using (ICryptoTransform decryptor = aesAlg.CreateDecryptor())
using (CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Write))
{
cs.Write(cipherText_only, 0, cipherText_only.Length);
}
byte[] decrypted = ms.ToArray();
string decr_serverSays = Encoding.UTF8.GetString(decrypted);
Debug.Log (decr_serverSays + "..." + decr_serverSays.Length.ToString());
return decr_serverSays;
}