私の会社は、カードリーダーを現場に置くプロジェクトに取り組んでいます。リーダーは DUKPT TripleDES 暗号化を使用するため、サーバー上のカード データを復号化するソフトウェアを開発する必要があります。
私はこの問題の表面をなぞり始めたばかりですが、一見単純な問題に行き詰まっていることに気付きます... IPEK を生成しようとしている (対称鍵を再作成するための最初のステップ)。
IPEK は、2 つのトリプル DES で暗号化された 8 バイトの 16 進文字列を連結して作成された 16 バイトの 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
また、平文の16進メッセージをbase64としてエンコードしようとしました(キーがそうであるように)。上記の例では、次の結果が返されます。
DE5BCC68EB1B2E14CEC35EB22AF04EFC。
NoPadding フラグを使用する以外は同じことを行うと、「入力長が 8 バイトの倍数ではありません」というエラーが表示されます。
私は暗号化に慣れていないので、ここで非常に基本的なエラーを犯していることを願っています。これらのブロック暗号アルゴリズムによって生成された暗号文が平文メッセージと同じ長さでないのはなぜですか?
もう少し背景を知るために、「それを実行する」演習として、ここで説明されている作業を複製しようとしました。
https://www.parthenonsoftware.com/blog/how-to-decrypt-magnetic-stripe-scanner-data-with-dukpt/