6

Java/Android と .Net 環境で作成された ATEC108A チップで署名を検証する必要があります。(SunEC と AndroidOpenSSL を使用)

署名は BCrypt を使用して .Net で作成され、キーも BCrypt を使用して作成され、Microsoft キー ストアに保存されます。署名と公開鍵を AT チップに送信して検証できますが、Android では機能しません。

キー/署名プロセス:

  1. 公開鍵は、SHA256-ECDSA の識別子と曲線 prime256v1 を含む x.509 鍵形式で BCrypt からエクスポートされ、次のようになります。

    3059301306072A8648CE3D020106082A
     8648CE3D03010703420004368711132B
     BDB4C6D03F7DF4F4688F5F4F21A3B30B
     EB1016648555A25B27C915CAB5C26B98
     0FF792A0090BF1E131C175D9C66C8D79
     3476489770869E09273816
  2. BCrypt からの署名は 64 バイト形式ですが、android では次のような署名になるシーケンスと長さの識別子が必要です。

    304502201
     BD91B39A7447724223A4B3E9070A6FD5
     33360F96B072998058AA73E572F48D80
     22100
     ED0BDC731080CFC82C8B8FB37D74CC18
     3820343C2756671F0E1D813E469DD3D7
  3. 署名と検証に使用されたメッセージは、ハッシュされた「Hello World」です。

    A591A6D40BF420404A011733CFB7B190
     D62C65BF0BCDA32B57B277D9AD9F146E

Android プロセス:

  1. 上記の鍵バイト配列から X509 鍵仕様と公開鍵を作成します。

    X509EncodedKeySpec keySpec = new X509EncodedKeySpec(encoded);
     KeyFactory kf = KeyFactory.getInstance("EC", "AndroidOpenSSL");
     pubKey = kf.generatePublic(keySpec);
  2. AndroidOpenSSL プロバイダーを使用して署名を作成します。

    署名署名;
     signature = Signature.getInstance("SHA256withECDSA", "AndroidOpenSSL");
     signature.initVerify(pubKey);
  3. 上記のハッシュ配列をロードします。

    signature.update(ハッシュ);
  4. 上記の署名を確認します。

    signature.verify(署名);

上記の署名とキーは AT チップでチェックアウトされますが (JavaScript-OpenSSL を実行する ECDSA サンプルでも検証されています)、AndroidOpenSSL では検証されません。簡単なものが不足していますか、それともどこに問題があるのでしょうか?

公開鍵構造は ASN.1 デコーダーでチェックアウトされ、コード内で正常に読み込まれ (公開鍵から抽出およびチェックされます)、署名は Java で想定される形式であり、ハッシュ値は両側で同じです。

4

0 に答える 0