【问题标题】:Buffer length grows in stream cipher缓冲区长度在流密码中增长
【发布时间】:2017-06-14 17:19:39
【问题描述】:

如果我读取的字节被加密,大小会增加。

当我尝试解密时如何找到我读取的字节的值。

例如:

缓冲区长度:8192

加密后:8208

16 字节的差异不固定。

我怎样才能使这个过程稳定 我期待您的不同解决方案和建议

加密功能

using (FileStream TEMPFILE = new FileStream(FILE_FULL_NAME, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite, BUFFER_SIZE, FileOptions.DeleteOnClose))
{
    int BUFFER_SIZE=8192;
    byte[] buffer = new byte[BUFFER_SIZE];

    while ((bytesRead = FILE_ORGINAL.Read(buffer, 0, BUFFER_SIZE)) > 0)
    {
        byte[] cryp = EN_Crypto_AES(buffer); 

        //encryp lenth  : 8208
        //BUFFER_SIZE   : 8192
        //----------------------
        //Crypto         +16 byte

        TEMPFILE.Write(cryp, 0, cryp.Length);
    }

    TEMPFILE.Position = 0;
    TEMPFILE.CopyTo(FILE_ORGINAL);
}

解密函数

using (FileStream TEMPFILE = new FileStream(FILE_FULL_NAME, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite, BUFFER_SIZE, FileOptions.DeleteOnClose))
{
    int BUFFER_SIZE=8192;

    byte[] buffer = new byte[BUFFER_SIZE];

    while ((bytesRead = FILE_ORGINAL.Read(buffer, 0, BUFFER_SIZE)) > 0)
    {
        byte[] cryp = DE_Crypto_AES(buffer); //16 byte ? 

        TEMPFILE.Write(cryp, 0, cryp.Length);
    }

    TEMPFILE.Position = 0;
    TEMPFILE.CopyTo(FILE_ORGINAL);
}

编辑

另一个类

byte[] passwordBytes;

public byte[] EN_Crypto_AES(byte[] bytesToBeEncrypted)
{
    byte[] encryptedBytes = null;

    byte[] saltBytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };

    using (MemoryStream ms = new MemoryStream())
    {
        using (RijndaelManaged AES = new RijndaelManaged())
        {
            AES.KeySize = 256;
            AES.BlockSize = 128;

            var key = new Rfc2898DeriveBytes(passwordBytes, saltBytes, 1000);
            AES.Key = key.GetBytes(AES.KeySize / 8);
            AES.IV = key.GetBytes(AES.BlockSize / 8);

            AES.Mode = CipherMode.CBC;

            using (var cs = new CryptoStream(ms, AES.CreateEncryptor(), CryptoStreamMode.Write))
            {
                cs.Write(bytesToBeEncrypted, 0, bytesToBeEncrypted.Length);
                cs.Close();
            }
            encryptedBytes = ms.ToArray();
        }
    }

    return encryptedBytes;
}
public byte[] DE_Crypto_AES(byte[] bytesToBeDecrypted)
{
    byte[] decryptedBytes = null;

    // Set your salt here, change it to meet your flavor:
    // The salt bytes must be at least 8 bytes.
    byte[] saltBytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };

    using (MemoryStream ms = new MemoryStream())
    {
        using (RijndaelManaged AES = new RijndaelManaged())
        {
            AES.KeySize = 256;
            AES.BlockSize = 128;

            var key = new Rfc2898DeriveBytes(passwordBytes, saltBytes, 1000);
            AES.Key = key.GetBytes(AES.KeySize / 8);
            AES.IV = key.GetBytes(AES.BlockSize / 8);

            AES.Mode = CipherMode.CBC;

            using (var cs = new CryptoStream(ms, AES.CreateDecryptor(), CryptoStreamMode.Write))
            {
                cs.Write(bytesToBeDecrypted, 0, bytesToBeDecrypted.Length);
                cs.Close();
            }
            decryptedBytes = ms.ToArray();
        }
    }

    return decryptedBytes;
}

【问题讨论】:

  • 您需要发布EN_Crypto_AES的代码。

标签: c# encryption stream buffer


【解决方案1】:

AES 不是流密码,它可以在 CTR 模式下用作流密码。

额外的字节是填充。见PKCS#7 padding

块密码要求输入是块大小的精确倍数,这通常通过 PKCS#7 填充来完成。通过指定填充(很多时候是默认值),填充字节会在加密期间自动添加并在解密期间删除。

AES 的块大小为 16 字节,并且使用了填充,即使输入数据已经是块大小的精确倍数,也必须添加它。

【讨论】:

  • 谢谢。我知道这是标准的 16 字节。这只是一个例子。如何解决此逻辑中的操作?
  • AES 不是 CBC 模式下的流密码。添加的填充字节有什么问题?
  • 我无法解密问题
  • 您是遇到错误还是数据不正确?但是你问错了问题,这个问题似乎真的是关于解密失败。
  • BUFFER_SIZE=8192+16;没有任何问题。但它不是一个准确的编码。
猜你喜欢
  • 1970-01-01
  • 2012-05-17
  • 2010-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多