从连续的整数生成随机查找代码

时间:2013-02-25 18:37:23

标签: algorithm random cryptography

我想从32位正整数生成一个6个字符的字母数字代码(例如A3SJ8D),其中序列中的每个代码都与前一个代码不同。

  1. A3SJ8D
  2. G54FGS
  3. ...
  4. 此代码必须是可逆的,以便G54FGS可以转换回2,例如(1:1映射)。

    这种“随机性”不是出于安全目的,而是出于非常简单的混淆。换句话说,该方法不必是“安全的”。

    修改

    为了澄清,我理解无符号32位整数(2 ^ 32)-1的最大可能值超过了使用10位数和26个字母的6个字符的字母数字代码的最大可能值, (36 ^ 6)-1。因此,要编码的正整数不得溢出由代码集可用字符数确定的边界。

    回答!

    示例

    以下是Javascript中基于@nwellnhof接受的答案的简单代码示例。

    
    var Skip32 = require('skip32').Skip32,
        key = "0123456789".split("").map(function(c) { return c.charCodeAt(0) }),
        cipher = new Skip32(key),
        codelen = 6,
        radix = 36,
        max = Math.pow(radix,codelen);
    
    function numToCode(num) {
        while ((num = cipher.encrypt(num)) >= max) {}
        return num.toString(radix).toUpperCase();
    }
    
    function codeToNum(code) {
        var num = parseInt(code,radix);
        while ((num = cipher.decrypt(num)) >= max) {}
        return num;
    }
    

2 个答案:

答案 0 :(得分:2)

我将使用SKIP32密码,这是一个基于Skipjack的32位分组密码。只需选择一个随机密钥,加密整数,然后在基数36中输出结果。您可以在C here中找到一个实现。

答案 1 :(得分:1)

如果将1,2,3,...乘以相当大的奇数整数并使用基数36转换为字符串,您将获得一系列相当随机的代码。

例如,如果乘以123456789,则会得到以下1,2,3,4的序列:

1: 21i3v9
2: 4307qi
3: 64iblr
4: 860fh0

通过乘法逆来反转操作,例如在123456789的情况下为102505021。

要使序列看起来更“随机”,您可以使用xor或加法进一步加扰数字。

实际上,这就是linear congruential generator伪随机数的工作原理。

相关问题