5

32ビットの正の整数から6文字の英数字コード(A3SJ8Dなど)を生成したいと思います。この場合、シーケンス内の各コードは前のコードと同じようには表示されません。

  1. A3SJ8D
  2. G54FGS
  3. ..。

たとえば、G54FGSを2に戻すことができるように、このコードはリバーシブルである必要があります(1:1マッピング)。

この「ランダム性」は、セキュリティを目的としたものではなく、非常に単純な難読化を目的としたものです。言い換えれば、メソッドは「安全」である必要はありません。

編集

明確にするために、符号なし32ビット整数の最大可能値(2 ^ 32)-1は、10桁と26文字を使用する6文字の英数字コードの最大可能値(36 ^)を超えていることを理解しています。 6)-1。したがって、エンコードされる正の整数は、コードセットで使用可能な文字数によって確立された境界をオーバーフローしてはなりません。

答えた!

以下は、@nwellnhofが受け入れた回答に基づくJavascriptの簡単なコード例です。


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;
}
4

2 に答える 2

2

Skipjackをベースにした32ビットのブロック暗号であるSKIP32暗号を使用します。ランダムキーを選択し、整数を暗号化して、結果をベース36に出力するだけです。Cの実装はここにあります。

于 2013-02-25T19:09:21.150 に答える
1

1,2,3、...にかなり大きな奇数の整数を掛け、基数36を使用して文字列に変換すると、かなりランダムに見えるコードのシーケンスが得られます。

たとえば、123456789を掛けると、1、2、3、4に対して次のシーケンスが得られます。

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

演算を逆にするには、乗法逆数を掛けます。たとえば、123456789の場合は102505021です。

シーケンスをもう少し「ランダム」に見せるために、xorまたは加算を使用して数値をさらにスクランブルすることができます。

実際、これは疑似乱数の線形合同法のジェネレーターがどのように機能するかです。

于 2013-02-25T20:07:36.730 に答える