私は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. 同じキーでハッシュマップ値の平均を計算する方法
- 2. OpenCVでMatの最大ピクセル値を計算する方法
- 3. C#.netでファイルのCRC値を計算する方法は?
- 4. クライアントサイドでRadGridセルの値を計算する方法は?
- 5. 月の値に基づいて合計値を計算する方法
- 6. クライアントデータセットで計算フィールドと内部計算フィールドを再計算する方法
- 7. PHPのwhileループ内で乗算値を計算する方法は?
- 8. 標準偏差を「数値」列で計算する方法は?
- 9. djangoで計算された値でソートする方法
- 10. DQLで計算された値で注文する方法
- 11. elasticsearchで計算された値でソートする方法
- 12. Java POI:計算式を計算するのではなく、Excelセルの値を読み取る方法は?
- 13. asp.netのテキストボックスの値を計算する方法
- 14. glslでgl_FragCoordを計算する方法
- 15. JavaでCRC8を計算する方法
- 16. PHPでcrc16を計算する方法
- 17. ポストグルでパーセンタイルを計算する方法
- 18. cvMatの平均値を計算して使用する方法
- 19. Djangoのカスタム値と計算値の推奨方法
- 20. UIFontのサイズを計算する方法
- 21. 計算機の数値を再帰的に加算、減算、除算、または乗算する方法は?
- 22. 列の異なる値の%差の計算方法
- 23. 以前の値で計算
- 24. WITH MEMBERの計算で現在の行の値を取得する方法MDX?
- 25. Djangoで2つの値を計算し、パーセンテージの差を計算する
- 26. bashで2つの変数の最小値を計算する方法は?
- 27. python numpyで合計計算を並列化する方法は?
- 28. serialversionuidの計算方法
- 29. タイムコードの計算方法は?
- 30. TCPチェックサムの計算方法
詳細な回答ありがとうございます。私は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は何をしますか? –