Java アプリケーションで Yubikey NEO OpenPGP スマート カード アプレットに基づく PGP 暗号化を実装しようとしています。それは暗い芸術のようで、このようなものをグーグルで検索するのは簡単ではありませんが、これまでのところ私が得た場所は次のとおりです。
カードが初期化され、キーが gpg ツールを使用して生成されます。それは一般的に機能します。公開鍵が
.asc
フォーマットされていて、なんとかロードできましたorg.bouncycastle.openpgp
javax.smartcardio
APIを使用して 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 で書かれていますが、読みやすいはずです。