我需要将32位整数加密为32位整数,我也可以解密它,
任何人都知道该怎么做?
提前致谢!!
谢谢,是的,我不需要高安全性,并且将32位无符号整数加密为32位有符号整数。
答案 0 :(得分:2)
答案 1 :(得分:0)
以下是非常幼稚,但有效:混合一些比特,然后XOR(^)与一些数字。
这种方法的天真与Shannon的熵概念有关 - 如果不增加结果消息长度,就无法获得良好的加密
答案 2 :(得分:0)
我不认为你会得到一个现代化的安全级别,其开始和结束的东西都很小。
经典地,人们可以使用特定的密码进行异或。再次使用此号码进行异或将导致原始号码。
然而,这将在几分之一秒内落入已知的明文攻击。在这种情况下你甚至可以用铅笔和纸快速打破它。它也可能无法移除您想删除的某些属性(例如,您可以从您可以看到的那个中猜出“附近”的ID号。)
答案 3 :(得分:0)
您可以选择所有32位整数的随机排列,并使用它进行加密。计算要解密的逆置换。
这将具有最佳安全性,但需要存储整个排列(128 GB密钥大小)。 =)
答案 4 :(得分:0)
也可以对整数使用RSA加密。这不一定更安全,因为要使用的数字非常小。这是一个有效的例子:
// computes b^x mod m, so that the intermediate calculations are not truncated by uint.
private ulong powmod_ulong(uint b, uint x, uint m)
{
if (x == 0) return 1;
ulong tmp = powmod_ulong(b, x / 2, m);
return x%2 == 1 ? (((tmp*tmp)%m)*b)%m : (tmp*tmp)%m;
}
private uint powmod(uint b, uint x, uint m)
{
return (uint) powmod_ulong(b, x, m);
}
private void Form1_Load(object sender, EventArgs eventArgs)
{
uint p = 62989;
uint q = 61967;
uint n = p * q; // 3903239363
uint phiN = (p - 1) * (q - 1); // 3903114408
uint e = 900548521; // chosen to be coprime to phiN
uint d = 3163940785; // = -739173623 = multiplicative inverse of e. e * d mod phiN == 1.
uint plain = 12345;
uint encrypted = powmod(plain, e, n);
uint decrypted = this.powmod(encrypted, d, n);
}