我需要生成将用作代金券或类似物品的兑换代码的数字代码。要求是代码是数字的,并且对于收款机操作员的数据输入速度而言相对较短。大约 6 个字符长和数字。我们知道这是一个很小的数字,因此我们制定了一个流程,以便代码可以过期并被重新使用。
我们一开始只使用顺序整数生成器,它在生成唯一代码方面效果很好。这样做的问题是生成的代码是连续的,因此可以预测,这意味着客户可以猜测我们生成的代码并兑换不适合他们的代金券。
我一直在阅读Format Preserving Encryption这似乎对我们有用。我们不需要在任何时候解密代码,因为代码本身是任意的,我们只需要确保它是不可预测的(由普通人)。这对安全并不重要,只是让诚实的人保持诚实。
维基百科文章中引用了各种密码,但我有非常基本的密码学和数学技能,无法编写自己的代码来基于密码实现这一目标。
我想我的问题是,有没有人知道 ac# 的实现,它将一个整数加密为另一个整数并保持相同的长度?
FPE 似乎可以很好地用于将 16 位信用卡号码加密为另一个 16 位号码。我们需要相同类型的东西,但不一定固定为长度,但只要纯值长度与加密值长度匹配即可。
所以以下四个整数将被加密
从 123456 123457 123458 123459
像这样不连续的东西
521482 265012 961450 346582
我对实现此 FPE 的任何其他建议持开放态度,这似乎是一个不错的选择。
编辑
感谢有关仅生成唯一代码并存储它们并检查重复项的建议。现在我们避免这样做,因为我们不想在生成时检查存储。这就是我们使用顺序整数生成器的原因,因此我们不需要检查代码是否唯一。我将重新研究这样做,但现在仍在寻找避免每次生成代码时都必须去存储的方法。