[解決済み] 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)(またはその逆)するだけで、同じ動作を得ることができるのかどうかを尋ねているのです。
このようなことをする場合、どのような解決策が提案されるのでしょうか?
ありがとうございました。
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でデータに対してハッシュを計算した後。
つまり、一般的な順序は
- をハッシュ化します。
- 署名生成のためにハッシュをパディングします。
- プライベート指数とモジュラスを使用したモジュラーエクスペクショナレーション。
暗号化と署名生成で使用するパディングが異なるため、暗号化を使用すると誤った署名が生成される可能性があります。
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と呼ばれています。
関連
-
[解決済み】Eclipseで「JUnitテストが見つかりませんでした。
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み] リフレクションとは何か、なぜ有用なのか?
-
[解決済み] JavaBeanとは何ですか?
-
[解決済み] Javaはパラメータのデフォルト値をサポートしていますか?
-
[解決済み] Could not find or load main class "とはどういう意味ですか?
-
[解決済み] シンクロナイズド」とはどういう意味ですか?
-
[解決済み】Javaではfinallyブロックは必ず実行されるのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] hibernateでResultSetを抽出できない。
-
[解決済み] java のクラス内のコンストラクタは、指定された型に適用できない
-
[解決済み] hibernate のプロパティが見つかりません。
-
[解決済み】Gradleがtools.jarを見つけ出さない
-
[解決済み】ソースルート外のJavaファイル intelliJ
-
[解決済み】Ubuntu: OpenJDK 8 - パッケージを見つけることができません。
-
[解決済み】javaで無効な文字定数
-
[解決済み】Javaの".class expected "について
-
[解決済み】Eclipseで「パッケージエクスプローラー」ビューが見つからない
-
[解決済み】 executeQuery()でデータ操作文が発行できない。)