私はRSA-SHA1について混乱しています。私はそれがRSA_private_encrypt(SHA1(メッセージ))だと思っていました。 しかし、私は正しい署名値を得ることができません。 間違い有りますか?OpenSSLでRSA-SHA1(sha1WithRSAEncryption)の値を計算する方法
答えて
はい、PKCS#1暗号化とPKCS#1署名はdifferentです。暗号化の場合(試したもの)、入力メッセージは単に累乗される前に埋められます。再び埋め込まれこれは符号化されたメッセージEM
EM = 0x00 || 0x01 || PS || 0x00 || T
形成する
DigestInfo ::= SEQUENCE {
digestAlgorithm AlgorithmIdentifier,
digest OCTET STRING
}
のPKCS#一方、1 signagturesは、最初の形式のASN.1のDER構造を計算しますPSは十分な長さの0xffのパディングストリングです。このEMを再現してRSA_private_encrypt
を使用すると、適切なPKCS#1 v1.5シグネチャエンコーディングが得られます。これは、RSA_sign
と同じ、またはより一般的なEVP_PKEY_signを使用した場合と同じです。次のように
require 'openssl'
require 'pp'
data = "test"
digest = OpenSSL::Digest::SHA256.new
hash = digest.digest("test")
key = OpenSSL::PKey::RSA.generate 512
signed = key.sign(digest, data)
dec_signed = key.public_decrypt(signed)
p hash
pp OpenSSL::ASN1.decode dec_signed
SHA-256ハッシュプリントアウト: - これは、与え
"\x9F\x86\xD0\x81\x88L}e\x9A/..."
dec_signed
は、公開鍵で再び暗号化解除RSA_sign
の結果であり、ここで
はRubyで少しのデモンストレーションですパディングが取り除かれたRSA関数への入力を正確に返します。これはまさに前述のDigestInfo
構造です:
#<OpenSSL::ASN1::Sequence:0x007f60dc36b250
@infinite_length=false,
@tag=16,
@tag_class=:UNIVERSAL,
@tagging=nil,
@value=
[#<OpenSSL::ASN1::Sequence:0x007f60dc36b318
@infinite_length=false,
@tag=16,
@tag_class=:UNIVERSAL,
@tagging=nil,
@value=
[#<OpenSSL::ASN1::ObjectId:0x007f60dc36b390
@infinite_length=false,
@tag=6,
@tag_class=:UNIVERSAL,
@tagging=nil,
@value="SHA256">,
#<OpenSSL::ASN1::Null:0x007f60dc36b340
@infinite_length=false,
@tag=5,
@tag_class=:UNIVERSAL,
@tagging=nil,
@value=nil>]>,
#<OpenSSL::ASN1::OctetString:0x007f60dc36b2a0
@infinite_length=false,
@tag=4,
@tag_class=:UNIVERSAL,
@tagging=nil,
@value="\x9F\x86\xD0\x81\x88L}e\x9A/...">]>
ご覧のとおり、digest
フィールドの値はDigestInfo
です。私たちが計算したSHA-256ハッシュと同じです。
あなたは間違ったOpenSSL抽象化レベルで作業していると思います。おそらくrsa.h
- 宣言された関数とRSA_verify()
を使用していて、これはPKCS#1準拠の署名で使用することを想定しているはずです。
ありがとうございます。私はまだ、RSA_sign()がハッシュとRSA暗号化機能を期待していることは何かを理解していませんか?これらの2つで十分ではありませんか? –
また、PKCS#1パディングとASN.1エンコードを処理します。パディングなしでコンテンツに署名するだけであれば、RSAの弱点につながり、エンコーディングは他のプログラムと確実に相互運用できます。 – sarnold
私はRSA_sign(NID_SHA1、...)を使用しましたが、結果はxmlsec(xml signature API)の場合と同じではありません。私はRSA_sign(NID_SHA1、...)がRSASSA-PKCS1-v1_5をやっているのだろうか? –
- 1. システムスクロールバーを計算する方法SmallChange値
- 2. jqueryのドロップダウンメニューの合計値を計算する方法
- 3. 複数の列の合計値を計算する方法は?
- 4. ATSで数値の平方根を計算する方法は?
- 5. 配列の合計値を計算する方法
- 6. 数値(最大値)をパーセンテージで計算する方法は?
- 7. 2つのテーブルを計算する方法AngularjsでのTotalsum値?
- 8. キーを押したときに計算値を再計算する方法は?
- 9. 計算で `desc`の配列値をソートする方法は?
- 10. OpenCVでMatの最大ピクセル値を計算する方法
- 11. リストボックスで2つの数値を計算する方法
- 12. Observableのフィールド値をAngular 4 Firestoreアレイで計算する方法
- 13. クライアントサイドでRadGridセルの値を計算する方法は?
- 14. 同じキーでハッシュマップ値の平均を計算する方法
- 15. C#.netでファイルのCRC値を計算する方法は?
- 16. SARIMAXモデルの数値計算方法R
- 17. クライアントデータセットで計算フィールドと内部計算フィールドを再計算する方法
- 18. 分散アーキテクチャでの集計値の計算方法
- 19. 2つの数値を計算する方法、また計算ボタンから結果を得る方法
- 20. 方程式の値を計算する方法
- 21. 月の値に基づいて合計値を計算する方法
- 22. PHPのwhileループ内で乗算値を計算する方法は?
- 23. 実行合計を計算するときに行間の計算値を保持する方法は?
- 24. nansでgeomatic平均値を計算する方法は?
- 25. 標準偏差を「数値」列で計算する方法は?
- 26. IronPythonで数値計算を実行する方法
- 27. 送信ボタンなしでテキストフィールド値を計算する方法
- 28. 同じ知覚輝度でRGB値を計算する方法
- 29. CSS計算による高さ計算()計算方法
- 30. djangoで計算された値でソートする方法
詳細な回答ありがとうございます。私はNID_sha1(NID_sha1WithRSAは間違ったもの)でRSA_signを使って正しい署名を得ています。そして、私はOpenSSLのRSA_sign関数を変更してRSA_private_encryptの入力である符号化された値を得ることができると思います。再度ありがとう! –
申し訳ありませんが、別の質問、私はOpenSSLでEMを手に入れることができますか?私はRSA_sign()をトレースして見つけました。 i = RSA_private_encrypt(i、s、sigret、rsa、RSA_PKCS1_PADDING); これは、他にどこにも見つからない関数rsa_priv_encにつながります。ありがとうございます –
そして、ここでRSA_PKCS1_PADDINGは何をしますか? –