Simple insecure two-way data “obfuscation”?

后端 未结 17 1752
别跟我提以往
别跟我提以往 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:30

    Just thought I'd add that I've improved Mud's SimplerAES by adding a random IV that's passed back inside the encrypted string. This improves the encryption as encrypting the same string will result in a different output each time.

    public class StringEncryption
    {
        private readonly Random random;
        private readonly byte[] key;
        private readonly RijndaelManaged rm;
        private readonly UTF8Encoding encoder;
    
        public StringEncryption()
        {
            this.random = new Random();
            this.rm = new RijndaelManaged();
            this.encoder = new UTF8Encoding();
            this.key = Convert.FromBase64String("Your+Secret+Static+Encryption+Key+Goes+Here=");
        }
    
        public string Encrypt(string unencrypted)
        {
            var vector = new byte[16];
            this.random.NextBytes(vector);
            var cryptogram = vector.Concat(this.Encrypt(this.encoder.GetBytes(unencrypted), vector));
            return Convert.ToBase64String(cryptogram.ToArray());
        }
    
        public string Decrypt(string encrypted)
        {
            var cryptogram = Convert.FromBase64String(encrypted);
            if (cryptogram.Length < 17)
            {
                throw new ArgumentException("Not a valid encrypted string", "encrypted");
            }
    
            var vector = cryptogram.Take(16).ToArray();
            var buffer = cryptogram.Skip(16).ToArray();
            return this.encoder.GetString(this.Decrypt(buffer, vector));
        }
    
        private byte[] Encrypt(byte[] buffer, byte[] vector)
        {
            var encryptor = this.rm.CreateEncryptor(this.key, vector);
            return this.Transform(buffer, encryptor);
        }
    
        private byte[] Decrypt(byte[] buffer, byte[] vector)
        {
            var decryptor = this.rm.CreateDecryptor(this.key, vector);
            return this.Transform(buffer, decryptor);
        }
    
        private byte[] Transform(byte[] buffer, ICryptoTransform transform)
        {
            var stream = new MemoryStream();
            using (var cs = new CryptoStream(stream, transform, CryptoStreamMode.Write))
            {
                cs.Write(buffer, 0, buffer.Length);
            }
    
            return stream.ToArray();
        }
    }
    

    And bonus unit test

    [Test]
    public void EncryptDecrypt()
    {
        // Arrange
        var subject = new StringEncryption();
        var originalString = "Testing123!£$";
    
        // Act
        var encryptedString1 = subject.Encrypt(originalString);
        var encryptedString2 = subject.Encrypt(originalString);
        var decryptedString1 = subject.Decrypt(encryptedString1);
        var decryptedString2 = subject.Decrypt(encryptedString2);
    
        // Assert
        Assert.AreEqual(originalString, decryptedString1, "Decrypted string should match original string");
        Assert.AreEqual(originalString, decryptedString2, "Decrypted string should match original string");
        Assert.AreNotEqual(originalString, encryptedString1, "Encrypted string should not match original string");
        Assert.AreNotEqual(encryptedString1, encryptedString2, "String should never be encrypted the same twice");
    }
    

提交回复
热议问题