この質問のエッセイのような性質についてお詫び申し上げます。私はこれを理解するのに苦労しており、私が持っている特定の質問で何が必要かについての私の理解を要約しようとしました.
ヨーロッパの DTCO 企業カードからのデータの読み取りに関するこの質問では、以下のスクリーンショット (このドキュメントの付録 11 から) のアルゴリズムに従うことを含むアドバイスを受けましたが、2つの強調表示された手順を実行する方法が明確ではありません。
Signは証明書を含む配列の一部であることがわかりますが、公開鍵で開くとはどういう意味ですか? カードから CA_Certificate を読み取り、CAR´ を使用してMANAGE SECURITY ENVIRONMENT APDU を発行することで、前のステップを正常に実行できます(アルゴリズムの最初のステップを参照)。しかし、そのように公開鍵を選択したので、 open Signステップでどの公開鍵を使用すればよいでしょうか。MSE は 1 つを選択しますが、私はそれを持っていません。ERCA からのヨーロッパの公開鍵しか持っていませんが、カードで選択したのと同じ鍵ですか? 秘密鍵はありませんが、必要ですか。
Hash(C´) = H´であることを確認するステップでは、ハッシュをどのように計算すればよいですか? 暗号化/復号化/ハッシュを行うには非常に多くの異なる方法があるようです (フォーマットは正しい言葉ですか?) ので、私はかなり混乱しています。
必要なデータを読み取るために本当に必要なのは、8 バイトのチャレンジを返すGET CHALLENGEの直後に、EXTERNAL AUTHENTICATEを使用して認証することだけです。EXTERNAL AUTHENTICATEの暗号を計算するには、それを使用する必要があると思います。以下のサンプル コードを見つけました (完全な投稿を参照)。C に似たスクリプト言語 (私は C# を使用しています) のように見えますが、別の種類のスマートカードの場合は、私が使用しなければならないものと非常に似ているようです。
//
// Authenticate against CardOS card
//
var card = new Card(_scsh3.reader);
var crypto = new Crypto();
var key = new Key();
key.setComponent(Key.DES,
new ByteString("01010101010101010101010101010101", HEX));
// Get challenge
var challenge = card.sendApdu(0x00, 0x84, 0x00, 0x00, 8, [0x9000]);
// Crypto.DES_MAC_EMV is a CBC generated Retail-MAC
var cipher = crypto.sign(key, Crypto.DES_MAC_EMV, challenge);
card.sendApdu(0x00, 0x82, 0x00, 0x81, cipher);
print("Card returns " + card.SW.toString(16) + " - " + card.SWMSG);
違いは
MANAGE SECURITY ENVIRONMENT が行われたことを示す追加の P2 パラメータは、おそらくCard_Certificateからの CAR' を使用して行われましたが、 CA_CertificateからのCAR' では機能しますが、これは機能しません。
サンプル コードの 0x81 の代わりに 0x80 のLc 。
ここで使用するために計算する暗号は、サンプルの暗号の長さが不明ですが、128 バイトの長さにする必要があります。