在.NET中简单混淆字符串?
我需要在互联网上发送一串大约30个字符的字符串,这可能最终会成为另一家公司数据库中的ID。
虽然字符串本身不会识别,但我仍然希望它不会以任何方式被识别。
在.NET中混淆这样一个字符串的最简单方法是什么,以便在必要时可以轻松地撤消它?
古典(具有现代风格)的东西怎么样。
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));
只要你不介意增加你的字符串长度
尝试使用例如AES加密它,如果你知道另一台机器上的加密密钥,你可以在那里轻松解密它
https://msdn.microsoft.com/en-us/library/system.security.cryptography.aes(v=vs.100).aspx
周围有很多代码示例。 例如,我通过快速搜索找到了这篇文章,即使它只有128位,我认为应该这样做
在C#中使用AES加密
我被@Jodrell的答案所鼓舞,这是我的替代版本。 唯一真正的区别是我使用modulo运算符而不是if-then-else结构。
如果你像我一样,之前从未听说过凯撒密码,这里有一个链接:
https://en.wikipedia.org/wiki/Caesar_cipher
public static partial class MString { ... /// /// 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 /// /// string to be encrypted or decrypted, must not be null /// see above /// encrypted or decrypted string 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); } ... }
还有一些测试代码:
上述就是C#学习教程:在.NET中简单混淆字符串?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注---计算机技术网(www.ctvol.com)!
// 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!");
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1017125.html