AesCryptoServiceProvider抛出加密异常

时间:2014-11-30 09:33:48

标签: c# cryptography aescryptoserviceprovider

我正在为学校做一些项目。我正在与TcpClient和TcpListener进行服务器客户端通信。在开始时,我在服务器上创建AES密钥,然后使用RSA将其发送到客户端。我在这里没有问题。但是,当我尝试在客户端上加密字符串然后在服务器上加密它时,我得到一个例外。

  1. 填充无效且无法删除
  2. 服务器代码:

    Byte[] bytes = new Byte[1024];
    String data = null;
    clientStream.Read(bytes, 0, bytes.Length); // preberemo iz streama
    //Array.Clear(bytes, 0, bytes.Length);
    // string temp = Encoding.UTF8.GetString(bytes11);
    //temp = temp.Replace("\0", "");
    //yte[] bytes = Encoding.UTF8.GetBytes(temp);
    using (MemoryStream msEncrypt = new MemoryStream())
    {
    
        using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, aes.CreateDecryptor(aes.Key,aes.IV), CryptoStreamMode.Write))
        {
    
            //StreamWriter swEncrypt = new StreamWriter(csEncrypt);
    
            csEncrypt.Write(bytes, 0, bytes.Length);
    
    
        }
        byte[] encrypted = msEncrypt.ToArray();
        string enc = Encoding.UTF8.GetString(encrypted, 0, encrypted.Length);
    }
    

    客户代码:

    byte[] messg = Encoding.UTF8.GetBytes(messig);
    // dobimo client stream
    string enc = null;
    using (MemoryStream msEncrypt = new MemoryStream())
    {
    
    
        using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, aes.CreateEncryptor(aes.Key, aes.IV), CryptoStreamMode.Write))
        {
    
            csEncrypt.Write(messg,0,messg.Length);
        }
        byte[] encrypted = msEncrypt.ToArray();
        enc = Encoding.UTF8.GetString(encrypted, 0, encrypted.Length);
    }
    byte[] data = new byte[1024];
    data = Encoding.UTF8.GetBytes(enc);
    //CryptoStream CryptStream = new CryptoStream(stream,aes.CreateEncryptor(aes.Key, aes.IV),CryptoStreamMode.Write);
    
    
    stream.Write(data, 0, data.Length); // pošljem sporočilo
    

    尝试使用时,我在服务器上出现异常     msEncrypt.ToArray();

    但是,如果我在动态地分配Byte [],或者我删除了所有空值,我会得到一个例外,说明"输入数据不是一个完整的块"。

2 个答案:

答案 0 :(得分:0)

我用以下方法解决了这个问题:

aes.Padding = PaddingMode.Zeros;

答案 1 :(得分:0)

问题可能是Encoding.UTF8.GetString(encrypted, 0, encrypted.Length);。这意味着代码将可以具有任何值的字节视为文本编码。这意味着,如果字节不代表有效文本,则它们将更改值(例如,用问号替换)或一起省略。

需要使用base 64编码将密文视为实际文本。在这个现代和时代,密文总是二进制的(通常以字节为单位)。


请注意,使用PaddingMode.Zeros无法解决问题。如果使用UTF-8解码,则可能从密文中删除信息。 PaddingMode.Zeros仅删除异常,但不能解决信息丢失的潜在问题。