CryptoStream AES解密失败,具有更大的块

时间:2017-07-09 21:10:01

标签: c# encryption cryptography aescryptoserviceprovider

这是我在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

1 个答案:

答案 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;
}