問題タブ [libcrypto]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - LibCrypt 低レベル API を使用して生成された公開鍵を取得する方法
私のプロジェクトでは、グループ鍵協定を実装するために、Diffie Hellman 用の OpenSSl の低レベル API を使用することにしました (ドキュメントから抜粋したコード スニペット) 。
しかし、生成されたDH
構造体から公開鍵を生成するにはどうすればよいでしょうか?
c++ - OpenSSL - コードで生成されたデジタル署名が、コマンド ラインで生成された署名と一致しない
アップデート
この質問がまだ注目を集めていることに気づきませんでした。
少し前に問題を見つけて修正しましたが、基本的には、物事を適切に行う方法を理解していませんでした。証明書に適切なファイル タイプを使用していなかった、秘密鍵を適切に読み取っていなかった (PEM_read_RSAPrivateKey
ではなくを使用する必要がPEM_read_PrivateKey
あった)、署名を適切に計算していなかった、など。
それを理解するのに必要以上に時間がかかりました。
時間を割いて回答してくださった皆様、ありがとうございました。
オリジナル
いくつかの要求にデジタル署名するためのコードに取り組んでいますが、コードから生成している署名が正しくなく、コマンド ラインから生成された署名と一致しません。問題は、秘密鍵を適切に読み取っていないことだと思いますが、その場合はエラーが返されると予想されますが、そうではありません。
私がopensslを扱うのはこれが初めてで、間違ったことをしていると確信していますが、知的な質問をするのに十分な理解はまだありません.
MessageSigner
libcrypto の雑用を処理するクラスを作成しました。秘密鍵と証明書は、クラスの属性です。
NULL
インスタンスの作成時にこれらを初期化します。
次のように秘密鍵をロードします。
そして、私は署名を次のように生成しています
繰り返しますが、このコードから生成された署名は、次の結果と一致しません。
問題は秘密鍵のロード方法にあると確信していますが、これまでに見たすべての例は、これが機能することを示しています。
私はこれを見つめて、2日間髪を引っ張っています. 提案、ヒント、ガイダンス、失礼な発言などは大歓迎です。
ありがとう。
編集
いくつかの例は、私が反対していることを示しているはずです。
以下SignedInfo
は、特定のメッセージに対して生成されたものです。
タイムスタンプからダイジェスト値が計算されます。
コマンドラインからそのタイムスタンプのダイジェストを計算すると、次のようになります。
同じダイジェスト値を取得します。
ここまでは順調ですね。そのハッシュが に追加されSignedInfo
、次のハッシュが取得されSignedInfo
ます。
そして、それを使用して署名を生成します。さて、ここで事態は完全に常軌を逸しています。上記のコードを使用して署名を生成すると、次のようになります。
コマンドライン ツールを使用すると、次のようになります。
コマンド ラインで生成された署名を検証すると、元のハッシュが返されます。
コードによって生成された署名を検証しようとすると、元のハッシュが返されません。
特にイライラするのは、署名を作成した後に署名を検証するためのコードを追加したことです。そのコードはパスします。しかし、明らかに間違っています。ハッシュが一致せず、openssl コマンド ライン ツールによって生成されたものと一致しないため、リモート サービスはリクエストを拒否します。使用しているコマンド ライン ツールとライブラリの両方が同じバージョン (1.0.1) であることを確認しました。
キーファイルの内容と比較するために秘密キーをダンプするコードを追加しましたが、一致するため、キーを正しく読み取っています。
libcrypto ルーチンを使用してメッセージに署名するには、EVP_Sign()、EVP_DigestSign()、EVP_PKEY_sign() の 3 つ以上の方法があるようですが、私の場合はどれを使用するのが正しいかわかりません。3 つすべてが悪い署名を与えます (つまり、公開鍵に対して復号化すると、元のハッシュ値にはなりません)。
繰り返しになりますが、誰かが私がしていることは明らかに間違っていると指摘できれば、私はそれを感謝します.
もっと編集
また、上記のブロックdgst
を使用して、次のように検証しようとしています。SignedInfo
私のコードが生成する署名を逆にする: