暗号化などに関しては、私はまったくの初心者です。 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"です。
"SHA256withRSA"
は、SHA256を使用してデータのハッシュを計算した後、正式名 RSASSA-PKCS1-v1_5 でPKCS#1 v1.5パディングとモジュラ指数を実装します。
したがって、一般的な順序は次のとおりです。
暗号化と署名生成に使用されるパディングは異なるため、暗号化を使用すると、署名が誤ったものになる可能性があります。
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
ノート: