由于这是与此相关的第一个主题之一,我想我会分享我如何能够对密文进行编码。这是我第一次使用 Ruby,它专门用于 DUKPT
首先,我必须获得 ipek 和 pek(与解密相同)方法。然后解压明文字符串。将解压后的字符串转换为 72 字节数组(如果我的术语不正确,请再次原谅我)。
我注意到在 dukpt gem author 示例中,他使用了以下纯文本字符串
"%B5452300551227189^霍根/保罗^08043210000000725000000?\x00\x00\x00\x00"
我觉得这个字符串不正确,因为名称(AFAIK)后面不应该有空格..所以它应该是
"%B5452300551227189^霍根/保罗^08043210000000725000000?\x00\x00\x00\x00"
总而言之,这是我最终得到的解决方案,它可以加密一个字符串,然后使用 DUKPT 解密它
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
结尾
Boomedukpt FFFF9876543210E00008 "%B5452300551227189^HOGAN/PAUL^08043210000000725000000?"
(我的红宝石,KSN 和纯文本字符串)
2542353435323330303535313232373138395e484f47414e2f5041554c5e30383034333231303030303030303732353030303030303f00000000000000000000000000000
(我的 ruby gem 在调用 hex_string_from_unpacked 后对解压的字符串进行了放置)
C25C1D1197D31CAA87285D59A892047426D9182EC11353C0B82D407291CED53DA14FB107DC0AAB9974DB6E5943735BFFE7D72062708FB389E65A38C444432A6AF121B7F7EDD55
(我的 ruby gem 放在加密字符串上)
%B5452300551227189^霍根/保罗^08043210000000725000000?
(在 dukpt gem 上调用解密后,我的 ruby gem 做了一个 put)