我的公司正在开展一个将读卡器投入现场的项目。读卡器使用 DUKPT TripleDES 加密,因此我们需要开发软件来解密我们服务器上的卡数据。
我刚刚开始触及这个问题的表面,但我发现自己陷入了一个看似简单的问题……在尝试生成 IPEK(重新创建对称密钥的第一步)时。
IPEK 是通过连接两个三重 DES 加密的 8 字节十六进制字符串创建的 16 字节十六进制值。
我已经尝试过带填充和不带填充的 ECB 和 CBC(IV 为零)模式,但是当我需要与输入大小相同的结果时,每个单独编码的结果总是 16 字节或更多(2 个或更多块)。事实上,在整个过程中,密文应该与被编码的明文大小相同。
<cfset x = encrypt("FFFF9876543210E0",binaryEncode(binaryDecode("0123456789ABCDEFFEDCBA98765432100123456789ABCDEF", "hex"), "base64") ,"DESEDE/CBC/PKCS5Padding","hex",BinaryDecode("0000000000000000","hex"))>
结果:3C65DEC44CC216A686B2481BECE788D197F730A72D4A8CDD
如果您使用 NoPadding 标志,则结果是:
3C65DEC44CC216A686B2481BECE788D1
我还尝试将纯文本十六进制消息编码为 base64(因为密钥是)。在上面的示例中,返回结果为:
DE5BCC68EB1B2E14CEC35EB22AF04EFC。
如果您这样做,除了使用 NoPadding 标志外,它会出现“输入长度不是 8 字节的倍数”的错误。
我是密码学的新手,所以希望我在这里犯了一些非常基本的错误。为什么这些分组密码算法生成的密文与明文消息的长度不同?
对于更多背景知识,作为“通过它工作”练习,我一直在尝试复制此处列出的工作:
https://www.parthenonsoftware.com/blog/how-to-decrypt-magnetic-stripe-scanner-data-with-dukpt/