gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 12:51:47 29 4
gpt4 key购买 nike

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

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

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

Encrypt and decrypt a string

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

最佳答案

根据您的要求,您的整数将不超过 6 个字符 (999999),并且编码最多应为 7 个字符,因此 24 位的异或可以做到这一点:

请注意,此方法很容易被暴力攻击逆转,但会隐藏大多数凡人的真实数字。

首先我们使用一个三字节的 key (值只是示例,取你最喜欢的:

byte[] theKey = new byte[]{ 34, 56, 98 }; 

然后为了对整数进行编码,我们取前三个字节(第四个字节不是必需的,因为您的 INT 不会使用它,只有 20 位可以存储最多 1M,所以最近的字节数是三个)并且我们对每个字节进行 XOR一个在键上有相应的字节:

int cyphered = ((theValue & 0xff) ^ theKey[0]) | 
((((theValue >> 8) & 0xff) ^ theKey[1]) << 8) |
((((theValue >> 16) & 0xff) ^ theKey[2]) << 16);

最后,为了使 URL 的同质化,您将其转换为字符串并用零填充:

string finalValue = cyphered.ToString().PadLeft(7, '0');

要反转值,只需再次与 key 进行异或:

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);

关于c# - 将字符串加密和解密为固定长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35247441/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com