简体   繁体   English

解密时要解密的数据长度无效

[英]Length of the data to decrypt is invalid when decrypting

I need to encrypt an image, return the string of the encrypted data, then decrypt it 我需要加密图像,返回加密数据的字符串,然后将其解密

Here's my encryption code : 这是我的加密代码:

string plainText = ASCIIEncoding.ASCII.GetString(Imagebytes);
byte[] encrypted;
byte[] key = Encoding.UTF8.GetBytes("M02cnQ51Ji97vwT4");;
// Create an AesCryptoServiceProvider object 
using (AesCryptoServiceProvider aesAlg = new AesCryptoServiceProvider())
{
    aesAlg.Key = key;
    aesAlg.BlockSize = 128;

    // Create a decrytor to perform the stream transform.
    ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);

    // Create the streams used for encryption. 
    using (MemoryStream msEncrypt = new MemoryStream())
    {
        using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
        {
            using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
            {

                //Write all data to the stream.
                swEncrypt.Write(plainText);
            }
            encrypted = msEncrypt.ToArray();

        }
    }
}

using (var aesAlg = new AesManaged())
{


    aesAlg.Key = new UTF8Encoding().GetBytes("M02cnQ51Ji97vwT4");
    aesAlg.IV = new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
    ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);

    return UTF8Encoding.UTF8.GetString(encryptor.TransformFinalBlock(Imagebytes, 0, Imagebytes.Length)).Length;

}

My decryption work fine ( because i can receive image / video perfectly ) 我的解密工作正常(因为我可以完美接收图像/视频)

here's the code: 这是代码:

const  string BLOB_KEY = "TTAyY25RNTFKaTk3dndUNA==";
using (RijndaelManaged rm = new RijndaelManaged())
{
    rm.Mode = CipherMode.ECB;
    rm.Key = Convert.FromBase64String(BLOB_KEY);
    rm.IV = new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
    rm.Padding = PaddingMode.Zeros;
    using (MemoryStream ms = new MemoryStream())
    {
        using (CryptoStream cs = new CryptoStream(ms, rm.CreateDecryptor(),
                    CryptoStreamMode.Write))
        {
            cs.Write(image, 0, image.Length);
            return ms.ToArray();
        }
    }
}

What's wrong with my encryption code ? 我的加密代码有什么问题?

Your very initial line of code is already wrong: 您最初的代码行已经错误:

string plainText = ASCIIEncoding.ASCII.GetString(Imagebytes);

An image is not a string, and plaintext is not necessarily a string either. 图像也不是字符串,明文也不一定是字符串。 Both consist of bytes. 两者均由字节组成。 So you should not be using a StreamWriter either, just a normal stream. 因此,您也不应该使用StreamWriter ,而应该使用普通流。

It is likely that data is lost during conversion. 转换期间可能会丢失数据。

Furthermore, you are writing to a decryption stream and you are using ECB mode at one side and CBC mode at the other. 此外,您正在写入解密流,并且一侧使用ECB模式,另一侧使用CBC模式。

I would strongly advice you to read into the material and start over. 我强烈建议您阅读材料并重新开始。

Thank you, i've changed my code to : 谢谢,我将代码更改为:

var aesAlg = new AesManaged
        {
            KeySize = 128,
            Key = key,
            BlockSize = 128,
            Mode = CipherMode.ECB,
            Padding = PaddingMode.Zeros,
            IV = new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
        };

        ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
        return encryptor.TransformFinalBlock(Imagebytes, 0, Imagebytes.Length);

And it works fine ! 而且效果很好!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM