我查看了很多例子并尝试了几篇文章。但他们都没有解决我的问题。
我想加密数据库中的主列值(INTEGER Value)并在URL中显示它。我希望我的URL简单易读,所以我不想要冗长的加密值。大多数情况下,我的长度约为5到7个字符。
这可能吗?如果是这样,最好的方法是什么?
http://www.codeproject.com/Tips/306620/Encryption-Decryption-Function-in-Net-using-MD-Cry
答案 0 :(得分:1)
根据您的要求,您的整数将不超过6个字符(999999),编码应为最多7个字符,因此24位的XOR将执行此操作:
请注意这种方法可以通过暴力攻击来实现可逆性,但会隐藏大多数凡人的真实数字。
首先我们使用三字节键(值只是示例,取你最喜欢的那些:
byte[] theKey = new byte[]{ 34, 56, 98 };
然后对整数进行编码,我们取前三个字节(第四个字节不是必需的,因为你的INT不会使用它,只有20位可以存储多达1M,所以最近的字节数是3)并且我们每个XOR一个带有密钥的相关字节:
int cyphered = ((theValue & 0xff) ^ theKey[0]) |
((((theValue >> 8) & 0xff) ^ theKey[1]) << 8) |
((((theValue >> 16) & 0xff) ^ theKey[2]) << 16);
最后,为了使网址均匀,您将其转换为字符串并用零填充它:
string finalValue = cyphered.ToString().PadLeft(7, '0');
要使用键重新对该值进行反转:
int cyphered = int.Parse(theStringYouReceived);
int decyphered = ((cyphered & 0xff) ^ theKey[0]) |
((((cyphered >> 8) & 0xff) ^ theKey[1]) << 8)|
((((cyphered >> 16) & 0xff) ^ theKey[2]) << 16);
正如我所说,它不是一个AES256安全密码(:D),但至少会隐藏好奇的数字。
编辑:这是测试用例,它按预期工作:
byte[] theKey = new byte[] { 34, 56, 98 };
int theValue = 1413;
int cyphered = ((theValue & 0xff) ^ theKey[0]) |
((((theValue >> 8) & 0xff) ^ theKey[1]) << 8) |
((((theValue >> 16) & 0xff) ^ theKey[2]) << 16);
string finalValue = cyphered.ToString().PadLeft(7, '0');
int scyphered = int.Parse(finalValue);
int decyphered = ((scyphered & 0xff) ^ theKey[0]) |
((((scyphered >> 8) & 0xff) ^ theKey[1]) << 8) |
((((scyphered >> 16) & 0xff) ^ theKey[2]) << 16);
答案 1 :(得分:0)