私は恐ろしいX9.24の仕様を勉強あまりにも多くの時間を費やし、最終的には、暗号化と復号化私のベンダーの例を使用した作業とマーケティングの両方が速やかにベンダーを切り替えることを決めました。それは標準的なものなので、誰の実装も同じであると思います。私は望む。とにかく、物事がどのように実装されるかにはバリエーションがあります。あなたはあなたの反対側と同じように仕事をしていることを確認するために細かい刷りを勉強しなければなりません。
しかし、それはあなたの質問ではありません。
最初にクレジットカードからデータトラックを復号化する必要がある場合は、元のスーパーシークレットベース導出キーに基づいてデータを復号化するキーを作成することに興味があります。それはMAC世代とは無関係であり、恐ろしいスペックでしか言及されていません。そのキーのシリアル番号とデバイスIDに対してIPEKを生成し、HSMからのフルキーシリアル番号のカウンタ部分にビットが設定されている場合、仕様から「非可逆キー生成プロセス」を繰り返し適用する必要があります。
は、私のコードの一部は次のように見えること:(申し訳ありません投稿で長いリストのため。)
/*
* Bit "zero" set (this is a 21 bit register)(ANSI counts from the left)
* This will be used to test each bit of the encryption counter
* to decide when to find another key.
*/
testBit=0x00100000;
/*
* We have to "encrypt" the IPEK repeatedly to find the current key
* (See Section A.3). Each time we encrypt (generate a new key),
* we need to use the all prior bits to the left of the current bit.
* The Spec says we will have a maximum of ten bits set at any time
* so we should not have to generate more than ten keys to find the
* current encryption key.
*/
cumBits=0;
/*
* For each of the 21 possible key bits,
* if it is set, we need to OR that bit into the cumulative bit
* variable and set that as the KSN count and "encrypt" again.
* The encryption we are using the goofy ANSI Key Generation
* subroutine from page 50.
*/
for(int ii=0; ii<21; ii++)
{
if((keyNumber&testBit) != 0)
{
char ksr[10];
char eightByte[8]={0};
cumBits |= testBit;
ksn.count=cumBits; /* all bits processed to date */
memcpy(ksr, &ksn,10); /* copy bit structure to char array*/
memcpy(crypt,&ksr[2],8); /* copy bytes 2 through 9 */
/*
* Generate the new Key overwriting the old.
* This will apply the "Non-reversible Key Generation Process"
* to the lower 64 bits of the KSN.
*/
keyGen(&key, &crypt, &key);
}
testBit>>=1;
}
keyNumberがKSN KSNから現在のカウンタである
が含まれている80ビット構成でありますHSM cryptからの80ビット鍵シリアル番号は、私がopenSSLを使用しているので、タイプDES_cblockのデータの64ビットブロックです。 keyは128ビットのdouble DES_cblock構造体です。 keyGenルーチンは、仕様の50ページの「非可逆キー生成プロセス」ローカルサブルーチンからほぼそのままです。
最後に、鍵変数には復号化に使用できる鍵がほとんど含まれています。スペックを書いた同僚は、私たちのつま先で私たちを保つためにキーにいくつかの "異形"の行動を加えました。クレジットカード・トラックなどのデータ・ストリームを解読するために鍵を使用する場合は、0xFFでXORバイト5と13を、トリプルDES自体で鍵を暗号化する必要があります(ECBモード)。あなたはPINブロックを復号化するためにこれを使用している場合は、あなたが0xFFでXORバイト7と15にする必要があります
DOUBLE_KEY keyCopy;
char *p;
p=(char*)&key;
p[ 5]^=0xff;
p[13]^=0xff;
keyCopy=key;
des3(&keyCopy, (DES_cblock *)&key.left, &key.left);
des3(&keyCopy, (DES_cblock *)&key.right, &key.right);
:私のコードは次のようになります。 (私は100%がストリームモードにも適用されるべきではないと確信していませんが、私のベンダーはそれを放棄しています)。
PINブロックの場合、3-DESでECBモードで暗号化されます。データストリームの場合は、初期化ベクトルがゼロのCBCモードで暗号化されます。
(仕様についてはあまり気にしないと言いましたか?)サーバー側(上記)が覚えていれば、暗号化側はハードウェアでない耐タンパーなセキュリティモジュールで使用できます以前に使用されたキーは拒否されます。この技術はきれいです。 ANSI仕様には何かが残されていますが、技術は大丈夫です。
幸運。 /Bob Bryan
で関連するコードです。このような詳細で対応する時間をとっていただきありがとうございます。私はあなたの提供された仕事に確実に前進します。 – bdeetz
私はあなたに千枚以上の投票権を与えることを望みます。インターネット上のベストリソース。 – Jonathan