AES算法

时间:2016-11-03 05:15:08

标签: c# algorithm encryption cryptography aes

使用以下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

结果字符串不应根据输入文本增加。怎么做?

1 个答案:

答案 0 :(得分:3)

如果我正确理解你的问题,你所要求的是不可能的。

我不是加密专家,但我会尽力解释一下:

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