将32位整数加密为32位整数,然后对其进行解密

时间:2011-12-08 09:40:53

标签: c#

  

可能重复:
  One-to-one integer mapping function

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

任何人都知道该怎么做?

提前致谢!!

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

5 个答案:

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