用于将PIN码(4个纯随机数字)加密成相同大小的密文的算法

时间:2014-12-31 07:37:58

标签: python encryption cryptography

我们的PIN码需要加密,纯粹是随机的,用户无法选择。

它们必须通过带宽是真正问题的连接在第三世界国家发送。所以我们不想发送256字节的加密数据。大多数加密算法都是针对具有大量模式的自然语言设计的,因此算法试图模糊这些模式。我们需要更简单但仍然标准的东西。

E.g。

密码:1234

key:'任何长度的密钥'

示例密文:7301

XOR是一个问题,因为任何拥有两个PIN码和相应密文的人都可以猜出密钥。

我们可以使用什么算法?我们正在寻找Python实现。

编辑:

抱歉我不清楚;

  • 我们正在寻找对称加密。目标是保护PIN码不被我们自己的员工轻易发现。
  • 带宽是一个问题。一个现实的案例:我们可能需要通过GPRS发送500,000张卡的数据。例如,如果填充的密码文本每个卡增加256个字节,则需要额外的5个小时才能下载。因此,我们正在寻找简短的密文。
  • "大多数加密算法都是针对自然语言而设计的。 - >是的,这不是真的,但我想说的是,最流行的加密算法会假设明文不是随机的,这与我们的情况不符。此外,我所看到的所有产生块输出,其中每个块是特定的字节数,因此短明文的长度不明显。我们不需要,每个人都知道大多数个人识别码都是4位数。
  • " Python实现" - >只是意味着我们希望能够在python中使用它,即它存在一个包。

2 个答案:

答案 0 :(得分:1)

根据你所写的内容,你显然没有很好地研究这个话题......我建议这样做,让某人知道他/她在做什么。

简单地寻找python实现并不能解决你的问题。

加密只是不能以这种方式安全地实施到任何项目中。

但是......如果您有一些值(如序列号,帐号)可能会用作每个PIN的密钥派生(因此每个引脚都有不同),流密码可能适合您的场景...

我写可能因为没有其他信息并仔细查看您的项目就无法分辨

所以请将此视为可能适合的解决方案,但不保证是合适的

所以你要做的是:像PBKDF这样的功能提供静态密钥,每个PIN值,以获得每个引脚的唯一密钥

将该密钥输入到像RC4这样的流密码中,并从密码输出中删除一个方便的字节数,就像RC4的前256字节一样(简单地将它们扔掉,对密码进行一些可能的攻击有点难度) )...

现在接受下一个14位密码输出,并将它们与您的PIN相对应,视为数字

结果数字将在0到16384之间

如果所需范围必须为0000至9999,

将14位输出视为一个数字,只需将其添加到您的PIN模数10000

要取回您的PIN码,再次计算该14位值,从密文中减去它,添加20000模数10000以弥补负值,并且您有PIN码

作为旁注......你真的不需要流密码,因为你已经可以使用PBKDF的输出,因为你的纯文本真的很小......但是PBKDF意味着派生一个密钥。 ..不是一个密码本身

答案 1 :(得分:0)

另一种答案:Hasty Pudding cipher可以加密您想要的任何数字范围。你可以设置一个Hasty Pudding实现来加密[0000,9999]到[0000,9999]。