Encryption 如何使用DUKPT加密在读卡器中生成密文?

Encryption 如何使用DUKPT加密在读卡器中生成密文?,encryption,cryptography,3des,Encryption,Cryptography,3des,为了 生成的密文如下所示 `BDK = "0123456789ABCDEFFEDCBA9876543210"` `KSN = "FFFF9876543210E00008"` 我找到了。我知道这个密码文本是基于BDK和KSN的,但是这个128长度的密码文本是如何生成的呢?它涉及哪些步骤或用于此目的的算法?有人能用简单的步骤解释一下吗。我发现很难理解谷歌搜索时得到的文档。首先,让我引用您链接的完整源代码,其中您只提供了3行 需要“捆绑机/设置” 需要“测试/单元” 需要“dukpt” 类DUKP

为了

生成的密文如下所示

`BDK = "0123456789ABCDEFFEDCBA9876543210"` `KSN = "FFFF9876543210E00008"` 

我找到了。我知道这个密码文本是基于BDK和KSN的,但是这个128长度的密码文本是如何生成的呢?它涉及哪些步骤或用于此目的的算法?有人能用简单的步骤解释一下吗。我发现很难理解谷歌搜索时得到的文档。

首先,让我引用您链接的完整源代码,其中您只提供了3行

需要“捆绑机/设置”
需要“测试/单元”
需要“dukpt”
类DUKPT::DecrypterTest
现在,你要问的是“密文”是如何产生的

首先,我们知道它是基于“明文”的,在代码中用来验证解密是否有效

明文是0填充的-这适合通过使用DecrypterTest测试用例验证解密来测试的加密

让我们看看编码代码,然后

我在找到了相关的加密代码

当DecrypterTEst使用“cbc”时,显然加密使用:

@cipher\u type\u des=“des cbc”
@密码\u type\u tdes=“des ede cbc”
在加密代码的基础上,以下解决了我们对答案的要求:

ciphertext=des_encrypt(。。。
这表明我们确实看到了DES加密的结果

现在,DES的块大小为64位,即(64/8=)8字节二进制,或者-因为“密文”是字节的十六进制编码文本表示形式-16个十六进制字符

“密文”长度为128个十六进制字符,这意味着它拥有(128个十六进制字符/16个十六进制字符=)8个DES块,每个块包含64位加密信息

用一个简单的答案来概括这一切:

当查看“密文”时,您看到的是(8块)DES加密数据,该数据使用人类可读的十六进制(2个十六进制字符=1字节)符号表示,而不是DES加密将产生的原始二进制字节


至于“重新创建”密文所涉及的步骤,我倾向于告诉您只需使用ruby项目的相关部分,您可以根据这些部分提出问题。只需查看源代码即可。文件位于“”基本上可以解释这一切,我确信您需要的所有功能都可以在项目的GitHub存储库中找到。或者,您可以尝试自己重新创建它-使用您选择的首选编程语言。您只需要处理两件事:DES加密/解密和bin-to-hex/hex-to-bin转换。

关于DUKPT,在上给出了一些解释。如果这还不够,这里有一些简单的解释

引用

什么是DUKPT?

每事务派生唯一密钥(DUKPT)是一种密钥管理方案。它使用从加密实体(或设备)和解密数据的实体(或设备)共享的密钥主密钥派生的一次性加密密钥。 为什么是DUKPT? 任何加密算法都只与密钥一样安全。如果用于加密算法数据的密钥不安全,则最强的算法是无用的。这就像用最大、最强的锁锁住你的门,但如果你把钥匙藏在门垫下,锁本身就是无用的。当我们谈论加密时,我们还需要keep记住,数据必须在另一端解密。 通常,任何加密方案中最薄弱的环节是加密方和解密方之间的密钥共享。DUKPT是一种尝试,旨在确保双方都可以加密和解密数据,而无需传递加密/解密密钥。 VISA国际组织发布的加密最佳实践文件还建议在PCI DSS合规性方面使用DUKPT

DUKPT的工作原理

DUKPT使用为每个事务生成然后丢弃的一次性密钥。其优点是,如果这些密钥中的一个被泄露,则只有一个事务会被泄露。使用DUKPT,发起方(例如Pin输入设备或PED)和接收方(处理器、网关等)各方共享一个密钥。该密钥实际上不用于加密。相反,从该主密钥派生的另一个一次性密钥用于加密和解密数据。需要注意的是,主密钥不应从派生的一次性密钥中恢复。 要解密数据,接收端必须知道使用哪个主密钥生成一次性密钥。这意味着接收端必须存储并跟踪每个设备的主密钥。对于支持许多设备的人来说,这可能是一项大量工作。需要更好的方法来处理此问题。 这就是它在现实生活中的工作方式:接收方有一个称为基本派生密钥(BDK)的主密钥。BDK应该是机密的,不会与任何人共享。该密钥用于生成称为初始Pin加密密钥(IPEK)的密钥.由此生成一组称为未来密钥的密钥,并丢弃IPEK。设备制造商将每个未来密钥嵌入PED中,并与之共享。此附加派生步骤意味着接收器不必跟踪进入PED的每个密钥。当需要时,可以重新生成这些密钥乌瑞德<
"C25C1D1197D31CAA87285D59A892047426D9182EC11353C051ADD6D0F072A6CB3436560B3071FC1FD11D9F7E74886742D9BEE0CFD1EA1064C213BB55278B2F12"`
class Encrypt
include DUKPT::Encryption
attr_reader :bdk

def initialize(bdk, mode=nil)
  @bdk = bdk
  self.cipher_mode = mode.nil? ? 'cbc' : mode
end

def encrypt(plaintext, ksn)
  ipek = derive_IPEK(bdk, ksn)
  pek = derive_PEK(ipek, ksn)
  message =  plaintext.unpack("H*").first
  message = hex_string_from_unpacked(message, 72)
  encrypted_cryptogram = triple_des_encrypt(pek,message).upcase
  encrypted_cryptogram
end
def hex_string_from_unpacked val, bytes
  val.ljust(bytes * 2, "0")
end