【问题标题】:Want to generate numeric coupon codes?想要生成数字优惠券代码?
【发布时间】:2016-10-20 14:28:16
【问题描述】:

我们想生成优惠券代码系列,然后仅以数字加密这些优惠券代码,并且还必须能够解密。

我们将与客户分享加密代码作为优惠券代码。

这些是条件:

  1. 加密代码不得串联或不易猜到。它必须是 NUMERIC
  2. 加密的代码必须有特定的位数。

示例:

我们生成从 1 到 100 的优惠券代码(需要数百万,plainCode 是数字或字母数字都没有关系)。

我们希望与用户共享具有特定数字的加密数字优惠券代码。 即如果代码是 52,那么加密的代码给我们 10000 到 99999 之间(如果指定了 5 位或需要固定位数)

我们也可以解密。

我们如何做到这一点。有什么想法或建议吗?

谢谢。

注意:

  1. 以上只是一个例子。可能性以百万计。
  2. 安全不是主要问题。只是无法猜测很重要。
  3. 加密的代码必须是数字。

【问题讨论】:

  • 你可以生成uuids和encode-decode
  • "如果代码为 52,则加密代码为我们提供 10000 到 99999 之间的值" - 这已经很安全了,因为只有 知道与 52 相关的值. 为什么不使用查找表只有 100 种可能性。
  • 如果您只有 100 张优惠券,只需为每张优惠券选择一个不同的随机“加密”数字。如果只有您有表格从“加密”数字映射回“解密”数字,它基本上是牢不可破的(除非橡胶软管密码学或粗心大意)。
  • 1 到 100 只是一个例子。可能性以百万计。是的,查找表是他们的,但试图获得更好的方法......
  • 您应该查找Format-preserving encryption的主题以了解此类问题。

标签: java encryption numeric series coupon


【解决方案1】:

如果您不关心安全...

int key=123456;

List<int> availableNumbers=new List<int>();
for(int i=10000;i<100000;i++)
    availableNumbers.Add(i);

Dictionary<int,int> forwards=new Dictionary<int,int>();
Dictionary<int,int> backwards=new Dictionary<int,int>();

for(int i=1;i<1000;i++){
    var rnd=new System.Random(key+i);
    int pos=rnd.Next(availableNumbers.Count);
    int number=availableNumbers[pos];
    availableNumbers.RemoveAt(pos);
    forwards[i]=number;
    backwards[number]=i;
}

foreach(var kvp in forwards)
{
    Console.Out.WriteLine("{0,5}=>{1}",kvp.Key,kvp.Value);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-01
    • 1970-01-01
    • 2014-11-26
    • 1970-01-01
    • 1970-01-01
    • 2013-04-22
    • 2012-01-03
    相关资源
    最近更新 更多