首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AES加密/解密byte[]

AES加密/解密byte[]
EN

Stack Overflow用户
提问于 2015-01-13 00:27:30
回答 1查看 1.2K关注 0票数 0

我试图使用以下方法加密一个byte[],但是当我解密它时,我的byte[]比我开始时要大,我认为这与填充有关,但我不知道如何解决它。

这个方法还没有完成(我知道像我的例子一样添加键+ iv是不好的,但是为了测试的目的,我要让它在我继续之前工作)。

因此,当我尝试打开文件之后(用MS文件测试),我会收到一条消息,说文件损坏了,我想要修复它。

加密方法

代码语言:javascript
复制
public byte[] Encrypt(byte[] dataToEncrypt) {
        // Check arguments. 
        if (dataToEncrypt == null || dataToEncrypt.Length <= 0) {
            throw new ArgumentNullException("dataToEncrypt");
        }

        byte[] encryptedData;
        byte[] key;
        byte[] iv;

        // Create an Aes object  
        using (Aes aesAlg = Aes.Create()) {
            key = aesAlg.Key;
            iv = aesAlg.IV;

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

            // Create the streams used for encryption. 
            using (MemoryStream memoryStream = new MemoryStream()) {
                using (CryptoStream cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write)) {
                    cryptoStream.Write(dataToEncrypt, 0, dataToEncrypt.Length);
                    cryptoStream.FlushFinalBlock();

                    encryptedData = memoryStream.ToArray();

                }
            }


        }

        byte[] result = new byte[encryptedData.Length + KEY_SIZE + IV_SIZE];

        Buffer.BlockCopy(key, 0, result, 0, KEY_SIZE);
        Buffer.BlockCopy(iv, 0, result, KEY_SIZE, IV_SIZE);
        Buffer.BlockCopy(encryptedData, 0, result, KEY_SIZE + IV_SIZE, encryptedData.Length);

        return result;
    }

解密方法

代码语言:javascript
复制
public byte[] Decrypt(byte[] encryptedData) {
        // Check arguments. 
        if (encryptedData == null || encryptedData.Length <= 0) {
            throw new ArgumentNullException("encryptedData");
        }

        byte[] storedKey = new byte[KEY_SIZE];
        byte[] storedIV = new byte[IV_SIZE];
        byte[] dataToDecrypt = new byte[encryptedData.Length - (KEY_SIZE + IV_SIZE)];

        Buffer.BlockCopy(encryptedData, 0, storedKey, 0, KEY_SIZE);
        Buffer.BlockCopy(encryptedData, KEY_SIZE, storedIV, 0, IV_SIZE);
        Buffer.BlockCopy(encryptedData, KEY_SIZE + IV_SIZE, dataToDecrypt, 0, encryptedData.Length - (KEY_SIZE + IV_SIZE));

        byte[] decryptedData = null;

        // Create an AesCryptoServiceProvider object 
        // with the specified key and IV. 
        using (Aes aesAlg = Aes.Create()) {
            aesAlg.Key = storedKey;
            aesAlg.IV = storedIV;

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

            // Create the streams used for decryption. 
            using (MemoryStream memoryStream = new MemoryStream(dataToDecrypt)) {
                using (CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read)) {
                    cryptoStream.Read(dataToDecrypt, 0, dataToDecrypt.Length);

                    decryptedData = memoryStream.ToArray();
                }
            }

        }

        return decryptedData;
    }
EN

回答 1

Stack Overflow用户

发布于 2015-01-13 01:39:56

假设整个缓冲区也是纯文本数据。您应该只返回缓冲区中包含明文数据的部分(使用Read的响应来查看返回的字节数)。由于填充,加密的数据通常更大。

作为单一的读取方法,在流处理方面并不是很好的实践。您需要一直读到流的末尾。否则,你可能会从拥有太多的数据变成拥有太少的数据。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27913119

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档