algorithm - 从连续的整数生成随机代码

标签 algorithm random cryptography

<分区>

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

  1. A3SJ8D
  2. G54FGS
  3. ...

此代码必须是可逆的,以便 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;
}

最佳答案

我会选择 SKIP32 密码,这是一种基于 Skipjack 的 32 位分组密码。只需选择一个随 secret 钥,加密整数,并以 36 进制输出结果。您可以在 C here 中找到实现。 .

关于algorithm - 从连续的整数生成随机代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15073971/

相关文章:

c# - 模拟离散房间中的减压

c++ - 将球体移动到平面永远不会预测 future 的碰撞

haskell - 在 Haskell 中映射 IO

node.js - Nodejs/Golang aes 256解密

c# - 为什么完全使用 C# 类 System.Random 而不是 System.Security.Cryptography.RandomNumberGenerator?

javascript - WebCrypto API,来自 ATECC508A 安全芯片的原始数据(64 字节十六进制)中的公钥的 importKey() 错误 : Data provided does not meet requirements

algorithm - 如何生成每个种子字符串都相同的uuid?

algorithm - 求算法的运行成本

python - Python/Django 中的个性化/随机 URL

java - 生成两个相同的随机数和一个不同的随机数