加密和解密的性能

时间:2014-12-17 07:34:47

标签: asp.net performance encryption dictionary

在我的网络应用程序中,我使用AES来加密或解密数据。根据我的搜索,它是最快的加密算法之一,实际上我认为它非常快。

但有时我真的需要加密或解密许多字符串,这会导致性能问题。

对于这种方式我认为我可以使用字典来存储字符串的加密和普通版本,以便第二次我可以从字典实例中获取加密的字符串。下面的代码是我的字典实现。

    private static Dictionary<string, string> _veryFastDict;

    public static Dictionary<string, string> GetVeryFastDictInstance()
    {
        return _veryFastDict ?? (_veryFastDict = new Dictionary<string, string>());
    }

,加密代码在

之下
    public static string VeryFastEncrypt(string text)
    { 
        if (GetVeryFastDictInstance().ContainsKey(text))
        {
            return GetVeryFastDictInstance()[text];
        }

        ///string encryptedText 
        /// encryption code

        GetVeryFastDictInstance().Add(text,encryptedKey);

        return encryptedKey;
     }   

这是一种很好的方法吗?这种方法有什么问题吗?

2 个答案:

答案 0 :(得分:2)

是的,不是重做同样的工作,而是将加密的结果存储在某些数据结构中。这节省了重新计算相同加密消息的时间。

当您使用较少的加密字符串但这些字符串很多时,此策略很有用。

但是这也可能存在 size 的问题,如果你有很多需要加密的字符串,但它们的出现次数较少。这会降低性能,因为它会增加数据结构的大小(可能是哈希映射,哈希表虽然它具有O(1)搜索功能)。内存需求会增加。

在这种情况下,加密大块数据是一种解决方法。因为AES是分组密码。它适用于数据块,对于大型数据而言,它真的很快。块。但是对于小数据来说它不太受欢迎,因为加密开销不仅仅是优势。

结论:

  1. 如果存在较少的字符串和更多的出现,则使用数据结构字典,哈希映射等来存储PT-CT对。记住数据结构的大小。
  2. 使用加密一次并替换所有出现的方法(在此方法中您不需要额外的数据结构)
  3. 对于更多字符串和更少出现次数,请检查选项2或阻止加密。

答案 1 :(得分:1)

这是可以接受的,但我在这里看到以下问题。

  1. 您没有锁定.add()来电,因此您可能会导致数据损坏,因为字典是静态的。
  2. 您不必注意在您的词典中获取太多数据的情况。您必须时不时地删除一些数据,否则如果您的数据增长过多,最终可能会吃掉所有内存。字典很适合找到一个字符串,因为make里面有索引,但是如果你的数据太多了,那么你可能会失去性能,因为每次你插入一个新的字符串需要更长时间...所以你可能会想到为每个字符串添加一个额外的计数器并计算使用的次数,因此您只保留字符串的最小值...并删除剩余的时间。