Java アプリケーションで Yubikey NEO OpenPGP スマート カード アプレットに基づく PGP 暗号化を実装しようとしています。それは暗い芸術のようで、このようなものをグーグルで検索するのは簡単ではありませんが、これまでのところ私が得た場所は次のとおりです。
カードが初期化され、キーが gpg ツールを使用して生成されます。それは一般的に機能します。公開鍵が
.ascフォーマットされていて、なんとかロードできましたorg.bouncycastle.openpgpjavax.smartcardioAPIを使用して USB ドングルのスマート カードに接続します。OpenPGP アプレットを選択します
val pgpAID = bytes(0xD2, 0x76, 0x00, 0x01, 0x24, 0x01) val answer = cardChannel.transmit(CommandAPDU(0x00, 0xA4, 0x04, 0x00, pgpAID))正しい PIN をカードに正しく提示する
val pin = "123456" return bytes(0x00, 0x20, 0x00, 0x82, pin.length) + pin.toByteArray(Charsets.UTF_8)準成功 (以下を参照)
decipherコマンドを送信するbytes(0x00, 0x2a, 0x80, 0x86, data.size) + data + bytes(0x00)の場合
data = "xxxx".toByteArray()、結果はSW=9000(= 成功) ですが、データは返されません。52ページのOpenPGPアプレットのドキュメントに次のように記載されているため、これは単純なテストです。コマンド入力 (パディング インジケータ バイトを除く) は、暗号化の前に PKCS#1 に従ってフォーマットされます。
データを暗号化して PKCS#1 形式にする方法がわかりません。
Yubico OpenPGP カードの実装テストも読んでみましたが、別の「失敗した」例 (196 行目) しか提供されていません。私はそれを実行しようとしましたが、結果は異なります: テストは期待してSW=0050います (例外を示していますか?) と、私が得たものは(このドキュメントSW=6f00によると、正確な診断はありません) です。
コード全体を含むGitHub リポジトリを作成しました。Kotlin で書かれていますが、読みやすいはずです。