由于这是与此相关的首个主题之一,我想分享一下我如何对密文进行编码。这是我第一次使用Ruby,而且是专门为了使用DUKPT而使用它。
首先,我必须获取ipek和pek(与解密中相同)方法。然后将纯文本字符串解包。将解包的字符串转换为一个72字节的数组(如果我的术语不正确,请原谅我)。
我注意到在dukpt gem作者的示例中,他使用了以下纯文本字符串
"%B5452300551227189^HOGAN/PAUL ^08043210000000725000000?\x00\x00\x00\x00"
我认为该字符串不正确,因为名字后面不应该有空格(据我所知)...所以应该是
"%B5452300551227189^HOGAN/PAUL^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?"
(我的Ruby宝石,KSN和纯文本字符串)
2542353435323330303535313232373138395e484f47414e2f5041554c5e30383034333231303030303030303732353030303030303f000000000000000000000000000000000000
(我的Ruby宝石调用hex_string_from_unpacked后在未打包的字符串上进行puts)
C25C1D1197D31CAA87285D59A892047426D9182EC11353C0B82D407291CED53DA14FB107DC0AAB9974DB6E5943735BFFE7D72062708FB389E65A38C444432A6421B7F7EDD559AF11
(我的Ruby宝石在加密字符串上进行puts)
%B5452300551227189^HOGAN/PAUL^08043210000000725000000?
(我的Ruby宝石在调用dukpt gem解密后进行puts)