まず、あなたがリンクした完全なソースコードを引用させてください.3行だけを提供しました...
require 'bundler/setup'
require 'test/unit'
require 'dukpt'
class DUKPT::DecrypterTest < Test::Unit::TestCase
def test_decrypt_track_data
bdk = "0123456789ABCDEFFEDCBA9876543210"
ksn = "FFFF9876543210E00008"
ciphertext = "C25C1D1197D31CAA87285D59A892047426D9182EC11353C051ADD6D0F072A6CB3436560B3071FC1FD11D9F7E74886742D9BEE0CFD1EA1064C213BB55278B2F12"
plaintext = "%B5452300551227189^HOGAN/PAUL ^08043210000000725000000?\x00\x00\x00\x00"
decrypter = DUKPT::Decrypter.new(bdk, "cbc")
assert_equal plaintext, decrypter.decrypt(ciphertext, ksn)
end
end
さて、あなたは「暗号文」がどのように作成されたかを尋ねています...
まず最初にわかっているのは、それが「平文」に基づいており、復号化が機能するかどうかを検証するためにコードで使用されているということです。
平文は 0 で埋められます - これは、この DecrypterTest TestCase で復号化を検証することによってテストされている暗号化に適合します。
それではエンコーディングコードを見てみましょう...
関連する暗号化コードはhttps://github.com/Shopify/dukpt/blob/master/lib/dukpt/encryption.rbで見つかりました。
DecrypterTEst は「cbc」を使用するため、暗号化に次のものが使用されることが明らかになります。
@cipher_type_des = "des-cbc"
@cipher_type_tdes = "des-ede-cbc"
その暗号化コードをもう少し掘り下げると、次のように答えを求める私たちの探求が解決されます。
ciphertext = des_encrypt(...
これは、DES 暗号化の結果を見ていることを示しています。
現在、DES のブロック サイズは 64 ビットです。それは(64/8 =)8バイトのバイナリ、または- 「暗号文」はバイトの16進数でエンコードされたテキスト表現であるため-16文字の16進数です。
「暗号文」の長さは 128 の 16 進文字です。つまり、暗号化された情報の各 64 ビットを含む 8 つの DES ブロック (128 の 16 進文字/16 の 16 進文字 =) を保持します。
これらすべてを簡単な答えにまとめます。
"ciphertext"を見ると、(8 ブロックの) DES 暗号化データが表示されます。これは、DES 暗号化が元のバイナリ バイトになる代わりに、人間が読める 16 進数 (2 16 進文字 = 1 バイト) 表記を使用して表されます。生産。
暗号文の「再作成」に含まれる手順については、質問の基になったルビープロジェクトの関連部分を使用するように言う傾向があります。ソースコードを見るだけです。「https://github.com/Shopify/dukpt/blob/master/lib/dukpt/encryption.rb」のファイルは、ほとんどすべてを説明しており、必要なすべての機能はプロジェクトの GitHub で見つけることができると確信しています。リポジトリ。または、好みのプログラミング言語を使用して、自分で再作成することもできます。処理する必要があるのは、DES 暗号化/復号化と、ビンから 16 進数/16 進数からビンへの変換の 2 つだけです。