我们想要生成优惠券代码系列,然后加密这些优惠券代码的数字,这也必须是可解密的。
我们将与客户共享加密代码作为优惠券代码。
这些都是条件:
我们生成从1到100的优惠券代码(以百万计的需求,plainCode将要么是数字,要么字母数字不重要)。
我们希望将加密的数字优惠券代码与特定数字共享给用户。也就是说,如果代码是52,那么加密的代码给我们10000到99999 (如果指定了5位数字,或者它需要固定的数字数)。
我们也能解密同样的。
是否有一种已建立的、加密的安全方法来做到这一点?如果没有,我们需要做些什么来处理这件事?
任何建议或想法都是受欢迎的。
我们已经查过了。任何好的algo,对于同样的建议,返回特定的数字数。我们有一个提供低于指定数字的加密数字,但我们希望在特定的范围内保持不附加0的数字数。
发布于 2016-10-21 02:18:27
对于我在定制库存系统中使用的位置标识符,我有一个几乎相同的要求。我有一个35位的代码,它显示为7个5位的元素,需要人类的可读性和独特性。生成代码的方法不一定要保留格式,这可能只是所使用算法的副作用。
我使用的方法生成一个7个字符代码,每个字符都是字母数字0-9和A,省略了OIZS,因为它们在视觉上与0125太相似。该算法是一种基于高分组密码圆结构的广义Feistel网络中5位7位元素的分组密码算法。输入是数字序列,输出是伪随机字母数字序列:
JE4HV9W
JPNJ4NE
V20MUP3
QCKCVWU
QTR7FUC
5E94W9J
4HYWH14
9W1229T
PT6JJTV
MEWTT68
91ACL19
....因为输入序列是数字的,所以对于给定的343.6亿个35位值的可能性,只有1000万个输出组合。这限制了可用于反向工程算法或确定所用密钥的密文数量。该算法简单,但在密钥大小(理论上)的情况下,有足够多的圆环来保证安全。use环境对这种安全性没有要求,但它允许在需要时将其用于其他应用程序。数字输入是安全和可用性的要求,而不是算法的限制。
如果用于生成优惠券码,则可以固定某些输入元素或比特,而这些固定位可以定义优惠券类型或折扣。系统只需跟踪使用过的优惠券代码,并对其进行解码以确定其类型和有效性。仅随机输入的1/3436码将解码为有效输入,有效输入的优惠券数量也可以进一步限制。
例如,您的输入可以构造为XXYYYYZ,其中XX是优惠券类型,YYYY是值,Z是一个固定元素,如0。优惠券01将被分配到5%的折扣,只有100个允许的优惠券使用在到期之前。当进入系统时,它被解码,其结构有效性被确定(为数值和Z=0),XX被确定为有效的优惠券,而YYYY被确定尚未被用于给定的XX。如果满足所有要求,则提供折扣,并节省XXYYYY,以便与进一步的优惠券进行比较。此示例格式中只有0.003%符合所需结构,其中只有1%符合所需的优惠券类型。
如果需要较长的代码,则此类密码的变体很容易在其他大小中生成。40位版本将子字扩展到8位,并显示为8字符代码.通过将5子字7位Feistel结构扩展到6个子字,而48位版本将子字扩展到8位,创建了一个42位版本,显示为6位7位字符代码。
发布于 2016-10-20 19:42:51
如果我正确地理解了这一点,你想要“加密”一个数字,把它变成另一个数字,并逆转这个过程?我认为这个算法可以用于这个目的,…。
伪码:(您的“从1号到100号”示例)
int i = 1
int key
int max = 100
list(of int) intList
read value for key
do until i = max
if i mod 2 = 0
intList.add(i * (i + key))
else
intList.add(round((i + _key) * i / 3))
end if
i+=1
loop我在VB中实现了这个算法,得到了一些非常随机的数字https://s22.postimg.org/42m3uoy01/bitmap.jpg
你可以倒转算法来“解密”这些数字。
我没有碰撞(两个数字产生相同的值),但有些非常接近。现在,如果要按长度(甚至是随机排序它们的顺序)对值进行排序,那么就会有相当数量的优惠券可以倒转到它们的初始数量。注意,对于每个数字,最小的加密数不等于最小的解密数等。

https://crypto.stackexchange.com/questions/40834
复制相似问题