7

この質問のエッセイのような性質についてお詫び申し上げます。私はこれを理解するのに苦労しており、私が持っている特定の質問で何が必要かについての私の理解を要約しようとしました.

ヨーロッパの DTCO 企業カードからのデータの読み取りに関するこの質問では、以下のスクリーンショット (このドキュメントの付録 11 から) のアルゴリズムに従うことを含むアドバイスを受けましたが2つの強調表示された手順を実行する方法が明確ではありません。

  1. Signは証明書を含む配列の一部であることがわかりますが、公開鍵で開くとはどういう意味ですか? カードから CA_Certificate を読み取り、CAR´ を使用してMANAGE SECURITY ENVIRONMENT APDU を発行することで、前のステップを正常に実行できます(アルゴリズムの最初のステップを参照)しかし、そのように公開鍵を選択したので、 open Signステップでどの公開鍵を使用すればよいでしょうか。MSE は 1 つを選択しますが、私はそれを持っていません。ERCA からのヨーロッパの公開鍵しか持っていませんが、カードで選択したのと同じ鍵ですか? 秘密鍵はありませんが、必要ですか。

  2. 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);

違いは

  1. MANAGE SECURITY ENVIRONMENT が行われたことを示す追加の P2 パラメータは、おそらくCard_Certificateからの CAR' を使用して行われましたが、 CA_CertificateからのCAR' では機能しますが、これは機能しません。

  2. サンプル コードの 0x81 の代わりに 0x80 のLc 。

  3. ここで使用するために計算する暗号は、サンプルの暗号の長さが不明ですが、128 バイトの長さにする必要があります。

4

2 に答える 2

4

自分でこれをしないでください。多くのことがうまくいかない可能性があります。弾む城の暗号ライブラリは、ISO 9706-2 署名をサポートしています。C# と Java の両方で動作します。

この論文の冒頭で、何が起こっているのかが明確になります。本来カードから返ってくるのは

x_c = sign || c_n || c_ar 

Sign は、メッセージのエンコーディング/パディング/ハッシュ関数の出力に対する RSA 署名です (この場合、メッセージは証明書のように見えます)。c_n はメッセージの残りの部分で、c_ar は署名署名を作成した認証局の識別子です。

使用されるエンコード関数は µ(m) = 6A || です。m[1] || ハッシュ(m) ||BC

|| どこで || は連結であり、6A はバイト 0x6A であり、0xBC の場合も同様です。Hash は何らかのハッシュ関数で、m 1は最初の k - ハッシュ関数の長さ - 16 ビットのメッセージです。m[2] は残りのメッセージで、c_n として保存されます。

DES はここでは関与しません。

あなたがここですべきことは、

  1. \m 1と c_nを連結してメッセージ/証明書を取得します
  2. µ(m[1] || c_n) を計算します
  3. sign が、c_ar に示されている認証局による µ(m[1] || c_n) の RSA 署名であることを確認します。
于 2012-05-30T16:47:05.453 に答える
3

誤解を説明する必要があるため、この回答も少し長くなります。上記のテキストの抜粋は、非対称鍵ペアによる認証を扱っています。公開鍵に対応する秘密鍵を所有する以外に何も証明できないため、追加の資格情報が必要です。証明書の発行者は通常、あなたの身元を確認したと主張し、これは証明書の署名によって文書化されます (署名は、発行者の公開鍵がインターネットでよく知られている場合、または既にカードに保存されている場合にのみ役立ちます)。通常、スマートカードは、そのような目的のために「証明書の検証」モードで「セキュリティ操作の実行」コマンドを提供します。発行者の署名を検証します。

コード スニペットは、秘密鍵とも呼ばれる対称鍵による認証を処理します。この秘密は、許可された人だけが知っていると想定されています。LC と見なされる 0x81 は実際には P2 であり、この秘密鍵を使用した MAC 計算の検証のために「ローカル キー #1 を取得してください」という意味です。実際、(小売またはその他の)MAC を計算するための入力として 8 バイトの乱数を使用すると、通常は(つまり、標準のパディング スキームを適用して)16 バイトの結果が得られます。ところで、この例の DES キーは恐ろしいものです。各バイトの最下位ビットはパリティ ビットであるため、キーはゼロ バイトのみで構成されます。

両方のスキームには、何らかの方法で認証を行うという目的以外に共通点はありません。

詳細については、ISO 7816-8 (Perform Security Operation)、ISO 7816-4 (External Authenticate、Get Challenge、およびその他のほとんどのスマート カード コマンド) を参照してください。これらはお金を使わずに入手するのは難しく、古いバージョンは www にあるかもしれません。詳細な説明は Rankl/Effing の "Handbuch der Chipkarten" にありますが、英訳版の "Smart Card Handbook" は時々特別であると報告されています。証明書については、Schneier の Applied Cryptography をお勧めします。これには、さらに何百もの参照があります。

于 2012-06-05T18:28:28.960 に答える