1. ホーム
  2. java

[解決済み] SHA256withRSAは何をどのような順番で行うのか?

2022-02-05 11:29:37

質問内容

私は暗号技術などに関しては全くの初心者です。SHA256やRSAの詳細については知らない(知りたくない)です。私は、それらが何をするかは知っていますが、どのようにするかは知りませんし、今のところそれで十分です。

SHA256withRSA"-アルゴリズム(と呼べるなら)が実際に何をどのような順序で行うのかが気になるところです。例えば、SHA256でハッシュ化してからRSAで暗号化するのか、その逆なのか、それとも何か別のものなのか。

なぜ私が質問しているかというと、Javaで同等のことをしたいからです。

Signature.getInstance("SHA256withRSA")
signature.initSign(privateKey); //privateKey == a key extracted from a .p12 file

をiOSのObjective-Cで作成しました。そのため、データをハッシュ化(SHA256)してから暗号化(RSA)(またはその逆)するだけで、同じ動作を得ることができるのかどうかを尋ねているのです。

このようなことをする場合、どのような解決策が提案されるのでしょうか?

ありがとうございました。

EDIT して取得した秘密鍵で署名していることを書きそびれました。

KeyStore keystore = KeyStore.getInstance("PKCS12");
keystore.load(new FileInputStream(new File(filename)), password.toCharArray());
PrivateKey privateKey = (PrivateKey)keystore.getKey(alias, password.toCharArray());

ここで、ファイル名は、例えば、"/somewhere/mykey.p12"です。

解決方法は?

"SHA256withRSA" は、PKCS#1 v1.5 のパディングとモジュラーエキスポーネントを実装しており、正式名称は「PKCS#1 v1.5 padding and modular exponentiation」です。 RSASSA-PKCS1-v1_5 SHA256でデータに対してハッシュを計算した後。

つまり、一般的な順序は

  1. をハッシュ化します。
  2. 署名生成のためにハッシュをパディングします。
  3. プライベート指数とモジュラスを使用したモジュラーエクスペクショナレーション。

暗号化と署名生成で使用するパディングが異なるため、暗号化を使用すると誤った署名が生成される可能性があります。


PKCS#1 v1.5のパディングスキームは、PSSに取って代わられました。新しいプロトコルでは、代わりにPSSスキームを使用することが推奨されます。RSAについては、非常に読みやすい公開標準が存在します。この規格は、以下の規格のベースとしても使用されています。 RFC 3447:公開鍵暗号方式標準(PKCS)#1:RSA暗号方式仕様バージョン2.1 (基本的にはコピーです)。


iOSのpaddingに関しては、以下をご確認ください。 この回答 Thomas Porninによるものです。基本的には、SHA-256ハッシュを作成し、静的なデータブロック(PKCS#1仕様で定義されている)をプレフィックスにした上で SecKeyRawSign を使って kSecPaddingPKCS1 .

便宜上、PKCS#1 で定義されている SHA-256 の 16 進表記でプレフィックスが必要なデータブロック (標準文書で見つけるのは少し難しいかもしれません) を示します。 セクション9.2 ):

30 31 30 0D 06 09 60 86 48 01 65 03 04 02 01 05 00 04 20


注意事項

  • 上記の手順には、バイトから整数への変換、およびその逆は含まれない。RSA の生の演算結果は、一般に、モジュラスのバイトサイズと同じ符号なしビッグエンディアンに変換される(鍵のサイズはすでに 8 の倍数であるため、これは一般に鍵のサイズと同じである)。これらの変換は、RFCではI2OSPおよびOS2IPと呼ばれています。