Simple insecure two-way data “obfuscation”?

后端 未结 17 1630
别跟我提以往
别跟我提以往 2020-11-22 01:10

I\'m looking for very simple obfuscation (like encrypt and decrypt but not necessarily secure) functionality for some data. It\'s not mission critical. I need something to k

17条回答
  •  谎友^
    谎友^ (楼主)
    2020-11-22 01:44

    I combined what I found the best from several answers and comments.

    • Random initialization vector prepended to crypto text (@jbtule)
    • Use TransformFinalBlock() instead of MemoryStream (@RenniePet)
    • No pre-filled keys to avoid anyone copy & pasting a disaster
    • Proper dispose and using patterns

    Code:

    /// 
    /// Simple encryption/decryption using a random initialization vector
    /// and prepending it to the crypto text.
    /// 
    /// Based on multiple answers in http://stackoverflow.com/questions/165808/simple-two-way-encryption-for-c-sharp 
    public class SimpleAes : IDisposable
    {
        /// 
        ///     Initialization vector length in bytes.
        /// 
        private const int IvBytes = 16;
    
        /// 
        ///     Must be exactly 16, 24 or 32 bytes long.
        /// 
        private static readonly byte[] Key = Convert.FromBase64String("FILL ME WITH 24 (2 pad chars), 32 OR 44 (1 pad char) RANDOM CHARS"); // Base64 has a blowup of four-thirds (33%)
    
        private readonly UTF8Encoding _encoder;
        private readonly ICryptoTransform _encryptor;
        private readonly RijndaelManaged _rijndael;
    
        public SimpleAes()
        {
            _rijndael = new RijndaelManaged {Key = Key};
            _rijndael.GenerateIV();
            _encryptor = _rijndael.CreateEncryptor();
            _encoder = new UTF8Encoding();
        }
    
        public string Decrypt(string encrypted)
        {
            return _encoder.GetString(Decrypt(Convert.FromBase64String(encrypted)));
        }
    
        public void Dispose()
        {
            _rijndael.Dispose();
            _encryptor.Dispose();
        }
    
        public string Encrypt(string unencrypted)
        {
            return Convert.ToBase64String(Encrypt(_encoder.GetBytes(unencrypted)));
        }
    
        private byte[] Decrypt(byte[] buffer)
        {
            // IV is prepended to cryptotext
            byte[] iv = buffer.Take(IvBytes).ToArray();
            using (ICryptoTransform decryptor = _rijndael.CreateDecryptor(_rijndael.Key, iv))
            {
                return decryptor.TransformFinalBlock(buffer, IvBytes, buffer.Length - IvBytes);
            }
        }
    
        private byte[] Encrypt(byte[] buffer)
        {
            // Prepend cryptotext with IV
            byte [] inputBuffer = _encryptor.TransformFinalBlock(buffer, 0, buffer.Length); 
            return _rijndael.IV.Concat(inputBuffer).ToArray();
        }
    }
    

    Update 2015-07-18: Fixed mistake in private Encrypt() method by comments of @bpsilver and @Evereq. IV was accidentally encrypted, is now prepended in clear text as expected by Decrypt().

提交回复
热议问题