web-dev-qa-db-ja.com

SHA256withRSAそれは何をどのような順序で行うのですか?

暗号化などに関しては、私はまったくの初心者です。 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)(またはその逆)して同じ動作を得ることができますか?

この種のことを行うための推奨される解決策は何ですか?

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

編集:私は次のようにして取得した秘密鍵を使用してデータに署名することについて言及することに失敗しました:

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"です。

19
Whyser

"SHA256withRSA"は、SHA256を使用してデータのハッシュを計算した後、正式名 RSASSA-PKCS1-v1_5 でPKCS#1 v1.5パディングとモジュラ指数を実装します。

したがって、一般的な順序は次のとおりです。

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

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


PKCS#1 v1.5パディングスキームはPSSに置き換えられました。新しいプロトコルの場合は、代わりにPSSスキームを使用することをお勧めします。 RSAには、非常に読みやすいパブリックスタンダードが存在します。この標準は RFC 3447:公開鍵暗号化標準(PKCS)#1:RSA暗号化仕様バージョン2.1 (基本的にはコピー)のベースとしても使用されています。


IOSのパディングに関しては、Thomas Porninの this answer を確認してください。基本的には、SHA-256ハッシュを作成し、データの静的ブロック(PKCS#1仕様で定義)にプレフィックスを付け、SecKeyRawSignを使用してkSecPaddingPKCS1を使用する必要があります。

あなたの便宜のために、SHA-256の16進表記でプレフィックスを付ける必要があるPKCS#1定義のデータブロック(標準のドキュメントでは見つけにくいかもしれません セクション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と呼ばれています。
18
Maarten Bodewes