简单的.NET中字符串的混淆



我需要通过Internet发送约30个字符的字符串,这可能最终在另一家公司的数据库中作为ID。

虽然字符串本身无法识别,但我仍然希望它能以任何方式识别。

在.NET中混淆这样的字符串的最简单方法是什么,以便在必要时很容易地反转?

这不是加密

不要将此答案用于必须保密的任何信息。

它将使人类很难阅读。

如果您的字符串不是"香草",它将往返行程,但不能不会。然后您使用较大的价值来移动。

此代码不会保护数据免受" Crack"的共同努力。它。聪明而熟练的人可以用笔和纸来解码。

原始答案如下。

古典事物怎么样(具有现代转折)。

public static string Caesar(this string source, Int16 shift)
{
    var maxChar = Convert.ToInt32(char.MaxValue);
    var minChar = Convert.ToInt32(char.MinValue);
    var buffer = source.ToCharArray();
    for (var i = 0; i < buffer.Length; i++)
    {
        var shifted = Convert.ToInt32(buffer[i]) + shift;
        if (shifted > maxChar)
        {
            shifted -= maxChar;
        }
        else if (shifted < minChar)
        {
            shifted += maxChar;
        }
        buffer[i] = Convert.ToChar(shifted);
    }
    return new string(buffer);
}

显然您会像这样使用

var plain = "Wibble";
var caesered = plain.Caesar(42);
var newPlain = caesered.Caesar(-42);

它的快速,您的密钥只是一个Int16,它将阻止休闲观察者复制粘贴值,但它不安全。

怎么样:

    Convert.ToBase64String(Encoding.UTF8.GetBytes(myString));

及其相反:

    Encoding.UTF8.GetString(Convert.FromBase64String(myObfuscatedString));

只要您不介意增加字符串的长度

尝试使用例如AE进行加密,如果您知道另一台计算机上的加密密钥,可以轻松地将其解密

http://msdn.microsoft.com/en-us/library/system.security.cryptography.aes(v = vs.100).aspx

周围有许多代码样本。例如,我通过快速搜索找到了这篇文章,即使它只有128位,我认为它应该做技巧

使用C#

中的AES加密

我受到@jodrell答案的启发,这是我的替代版本。唯一真正的区别是我使用Modulo操作员而不是IF-then-else Construction。

,如果您像我一样,以前从未听说过Caesar Cipher,这是一个链接:

https://en.wikipedia.org/wiki/caesar_cipher

   public static partial class MString
   {
      ...
      /// <summary>
      /// Method to perform a very simple (and classical) encryption for a string. This is NOT at 
      /// all secure, it is only intended to make the string value non-obvious at a first glance.
      ///
      /// The shiftOrUnshift argument is an arbitrary "key value", and must be a non-zero integer 
      /// between -65535 and 65535 (inclusive). To decrypt the encrypted string you use the negative 
      /// value. For example, if you encrypt with -42, then you decrypt with +42, or vice-versa.
      ///
      /// This is inspired by, and largely based on, this:
      /// https://stackoverflow.com/a/13026595/253938
      /// </summary>
      /// <param name="inputString">string to be encrypted or decrypted, must not be null</param>
      /// <param name="shiftOrUnshift">see above</param>
      /// <returns>encrypted or decrypted string</returns>
      public static string CaesarCipher(string inputString, int shiftOrUnshift)
      {
         // Check C# is still C#
         Debug.Assert(char.MinValue == 0 && char.MaxValue == UInt16.MaxValue);
         const int C64K = UInt16.MaxValue + 1;
         // Check the arguments
         if (inputString == null)
            throw new ArgumentException("Must not be null.", "inputString");
         if (shiftOrUnshift == 0)
            throw new ArgumentException("Must not be zero.", "shiftOrUnshift");
         if (shiftOrUnshift <= -C64K || shiftOrUnshift >= C64K)
            throw new ArgumentException("Out of range.", "shiftOrUnshift");
         // Perform the Caesar cipher shifting, using modulo operator to provide wrap-around
         char[] charArray = new char[inputString.Length];
         for (int i = 0; i < inputString.Length; i++)
         {
            charArray[i] = 
                  Convert.ToChar((Convert.ToInt32(inputString[i]) + shiftOrUnshift + C64K) % C64K);
         }
         // Return the result as a new string
         return new string(charArray);
      }
      ...
   }

和一些测试代码:

     // Test CaesarCipher() method
     const string CHelloWorld = "Hello world!";
     const int CCaesarCipherKey = 42;
     string caesarCiphered = MString.CaesarCipher(CHelloWorld, CCaesarCipherKey);
     if (MString.CaesarCipher(caesarCiphered, -CCaesarCipherKey) != CHelloWorld)
        throw new Exception("Oh no!");

最新更新