public KeyInfo GetKeyInfo(string KeyName, byte[] IV, SymmetricAlgorithm Crypter) { if(null == this.KeyCache ) lock(_sharedKeyCacheLock) { if(null == this.KeyCache) this.KeyCache = new ConcurrentDictionary<string, KeyInfo>(); } if (KeyCache.ContainsKey(KeyName)) return KeyCache[KeyName]; string keyValue = null; KeyInfo retVal = new KeyInfo(); if (null != this.SharedKeyServer) keyValue = this.SharedKeyServer.GetKey(KeyName); if (null == keyValue && null != this.KeyServer) keyValue = this.KeyServer.GetKey(KeyName); if(null != keyValue) { retVal.KeyValue = keyValue; int keySize = Crypter.KeySize; byte[] workingBytes = new Rfc2898DeriveBytes(keyValue, IV).GetBytes(keySize / 4); retVal.KeyBytes = workingBytes.Take(keySize / 8).ToArray(); retVal.SecretBytes = workingBytes.Skip(keySize / 8).Take(keySize / 8).ToArray(); //if(!KeyCache.ContainsKey(KeyName)) // lock(_sharedKeyCacheLock) // { // if (!KeyCache.ContainsKey(KeyName)) // KeyCache.Add(KeyName, retVal); // } } return retVal; }