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;
 }