将字符串加密和解密为固定长度

时间:2016-02-06 22:45:37

标签: c# asp.net encryption cryptography

我查看了很多例子并尝试了几篇文章。但他们都没有解决我的问题。

我想加密数据库中的主列值(INTEGER Value)并在URL中显示它。我希望我的URL简单易读,所以我不想要冗长的加密值。大多数情况下,我的长度约为5到7个字符。

这可能吗?如果是这样,最好的方法是什么?

Encrypt and decrypt a string

http://www.codeproject.com/Tips/306620/Encryption-Decryption-Function-in-Net-using-MD-Cry

2 个答案:

答案 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)

您当然可以自己推送,但是根据提供的信息,以下库看起来可能很有用。

http://hashids.org/net/

显然要考虑您的安全要求以及这是否足以满足这些要求。