【问题标题】:Encrypted text is too large in AES algorithmAES算法中的加密文本太大
【发布时间】:2016-11-03 05:15:07
【问题描述】:

我正在使用下面的 AES 算法代码来加密给定的文本。

string EncryptionKey = "abc";
string originalText = "Original text";
        byte[] clearBytes = Encoding.ASCII.GetBytes(originalText);
        using (Aes encryptor = Aes.Create())
        {
            Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
            encryptor.Key = pdb.GetBytes(32);
            encryptor.IV = pdb.GetBytes(16);
            using (MemoryStream ms = new MemoryStream())
            {
                using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateEncryptor(), CryptoStreamMode.Write))
                {
                    cs.Write(clearBytes, 0, clearBytes.Length);
                    cs.Close();
                }

                string encryptedText = Convert.ToBase64String(ms.ToArray());
            }
        }

输出:

XBqY9wBUpAa+ly7P2cdZBQ==

如果我增加原始文本的字符,那么加密文本的大小也会增加。

例如:

输入:

原文长度增加

输出:

RU3azV4sslgUWFSoCKxdKHN/qDCEcKXN/tCFa80Bcmu1O418T/CGRZc3mIzx0f2Q

结果字符串不应根据输入文本增加。如何做到这一点?

【问题讨论】:

    标签: c# algorithm encryption cryptography aes


    【解决方案1】:

    如果我正确理解您的问题,那么您的问题是不可能的。

    我不是密码学专家,但我会尽力解释:

    e(x) 成为加密给定 x 的函数

    d(x) 成为解密给定 x 的函数

    让 x 是一些字符串。

    请考虑一下。如果 e(x) 获取 x 并对其进行加密,则必须存在一个 d(x) 将解密我们的密文并将我们的原始文本返回给我们。否则我们的加密算法就没用了!如果 e(x) 的结果大小不能改变,那么 d(x) 就不可能存在。这是因为只有这么多的数据可以用文本编码(ascii 中每个字节有 127 个可能的值)。所以很自然,随着 e(x) 的输入消息大小的增长,一些密文的大小(e(x) 的结果)也会以类似的速度增长。

    如果您想减小输出文本的大小,可以考虑使用压缩。我个人在这方面没有太多经验,但你可能想看看GZipStream之类的东西。

    此外,正如 Luke 所建议的,您可能正在寻找一种散列算法,该算法将使您的文本具有固定大小。对于c#,也许看看HashAlgorithm

    【讨论】:

    • OP 可能只是想要一个哈希算法并且不知道正确的词来解释他想要什么。
    • "虽然它仍会随着输入文本的增长而增长,但原因与我上面给出的相同" -- 哈希算法不会增长随着输入文本的增长。它具有固定长度的输出。
    • 如果你想加密一些东西而不增加它的大小,你将不得不使用一次性填充。 :3 但是你的问题变成了你如何与目标方共享加密密钥。
    • @luke 我试过散列。它减小了加密文本的大小。但这也会随着输入文本的增长而增长
    • @Kathir 你错了。散列不是加密。哈希是一种单向函数,数据在这个过程中被破坏,你永远无法将哈希恢复为原始数据。根据使用的散列算法,散列输出是固定大小的。如果你的输出增加了,你就做错了。
    猜你喜欢
    • 2021-05-19
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    • 2015-02-23
    • 1970-01-01
    • 2012-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多