将32位整数加密为32位整数,然后解密

本文关键字:32位 整数 然后 解密 加密 | 更新日期: 2023-09-27 18:17:04

可能重复:
一对一整数映射函数

我需要将32位整数加密为32位整数,并且我可以解密它,

有人知道怎么做吗?

提前感谢!!

谢谢,是的,我不需要高度安全,并将32位无符号整数加密为32位有符号整数

将32位整数加密为32位整数,然后解密

  • 选择一个随机整数作为加密密钥
  • 将整数与要加密的密钥异或
  • 将整数与密钥再次异或以解密

下面的内容非常简单,但很有效:混合一些比特,然后与一些数字进行XOR(^(。

这种方法的天真与Shannon的熵概念有关——如果不增加结果消息长度

,就无法获得良好的加密

我认为你不会用一个开始和结束都很小的东西来获得现代级别的安全性。

传统上,一个人可以与一个特定的秘密数字异或。再次与此数字进行异或运算将得到原始数字。

然而,这将在几分之一秒内落入已知的明文攻击。你甚至可以在这样的箱子里用铅笔和纸很快地把它打碎。它也可能不会删除你想删除的某些属性(比如可以从你能看到的id中猜测"附近"的id号(。

您可以选择所有32位整数的随机排列,并使用它进行加密。计算要解密的逆排列。

这将具有尽可能好的安全性,但需要存储整个排列(128 GB密钥大小(。=(

也可以对整数使用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);
}