Encryption 加密16位数字的简单方法

Encryption 加密16位数字的简单方法,encryption,Encryption,我们正在寻找一种加密16位数字(可能是10-20位)的方法,要求如下: 输出也是一个数字 输出不加倍(或大幅增加位数) 不需要预先存储大量映射表 可以使用中等至低安全性 简单且安全性极低:添加一些内容,然后将数字与另一个大小类似的数字进行异或运算。只有在没有人可以访问源代码的情况下才可行。任何有权访问该程序(即使没有源代码)并且可以使用几个示例(0、1000、10000、10000000)运行该程序的人都可以找到它 根据语言: uint64_t theNumber; uint64

我们正在寻找一种加密16位数字(可能是10-20位)的方法,要求如下:

  • 输出也是一个数字
  • 输出不加倍(或大幅增加位数)
  • 不需要预先存储大量映射表
  • 可以使用中等至低安全性

简单且安全性极低:添加一些内容,然后将数字与另一个大小类似的数字进行异或运算。只有在没有人可以访问源代码的情况下才可行。任何有权访问该程序(即使没有源代码)并且可以使用几个示例(0、1000、10000、10000000)运行该程序的人都可以找到它

根据语言:

   uint64_t theNumber;

   uint64_t cryptbase1= 12345678909876, cryptbase2= 234567890987654;

   // encrypt 
   uint64_t encrypted= (theNumber + cryptbase1) ^ cryptbase2;

   // decrypt 
   uint64_t decrypted= (encrypted ^ cryptbase2) - cryptbase1;

我可以想象一个16位到20位的加密算法:

加密:

  • 将16位数字转换为二进制表示(需要54位)
  • 使用块大小较小的分组密码算法(例如,块大小为64位)加密54位
  • 将加密的64位转换为其20位表示形式
  • 解密:

  • 将20位数字转换为其二进制64位表示形式
  • 使用分组密码算法进行解密
  • 将64位转换为其20位表示形式。左4位数字必须为
    0
    ,剩余16位

  • 您可能看到的是块大小最多可容纳20位十进制数字的块密码。您可以使用,它具有可变的块大小,或者您也可以使用偶数位数的每个块滚动您自己的simple。您似乎不需要非常高级别的安全性,因此一个简单的四、六轮Feistel密码可能会更容易

    我使用一个简单的Feistel密码进行整数置换,F函数是:

    // The F function for the Feistel rounds.
    private int F(int num, int round) {
        // XOR with round key.
        num ^= mRoundKeys[round];
        // Square, then XOR the high and low parts.
        num *= num;
        return (num >>> HALF_SHIFT) ^ (num & LOW_16_MASK);
    } // end F()
    
    你似乎不需要比这更复杂的东西。如果您想要加密安全性,那么使用草率布丁,这会更加安全


    任何大小合适的二进制块都可以表示为十进制数字。

    因为其中一个要求是将散列输出存储为数字,然后立即放弃安全性。还有,一个“16位数字”让我相信你们是在试图破解信用卡号码?哎哟可怕的想法。@DanKanze-你能详细说明一下数字的问题吗?为什么使用一些数字作为输出会造成安全威胁?此外,OP询问的是加密(可逆),而不是散列(不可逆)。@Rogach我的意思是,输出摘要的风险非常高。可以用一系列的排列来破解。@DanKanze-让我换一句话-你的意思是输出中对一个小数字的要求是不好的,对吗?@Rogach我假设键是一个数字bc,输出的要求是一个数字。你也可以在某个地方加入一个小乘数,例如“((theNumber+cryptbase1)*13)^cryptbase2“如果您不介意数字的增加。反汇编二进制文件仍会在ASM代码中显示XOR。此外,您可以运行加密两次或两次以上(然后再解密两次)。@hunter:是的,访问加密程序会严重降低安全性,这样一来,它肯定无法承受一个天才黑客或密码专家超过一个小时的攻击。其中一个问题是,它无法对所有20位十进制数字进行加密,因为这些数字最多需要66位。@CodesInChaos:你是对的,在这种情况下,可以尝试切换到3*32位的块大小(支持如此小的块大小)。这将导致20位到29位的加密算法。