問題タブ [cryptoapi]
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.
encryption - WinCrypt で公開鍵暗号を生成して使用する方法
現在、Windows 暗号化 API を試していて、公開鍵暗号化でいくつかの問題が発生しています。アイテムを暗号化する方法の例はたくさんありますが、最初から最後までの公開鍵モデルに直接対処するものはありません。
現在のコードで暗号化キー ペアを生成する方法の大まかな概要を次に示します。読みやすくするためにエラー チェック コードを削除しました。
エクスポートした 2 つのキーは異なりますが、どちらも他のキーを読み込まなくてもメッセージを復号化できます。さらに、エクスポートされた公開鍵をロードする新しいセッションで新しいメッセージを暗号化すると、どちらの鍵でも復号化できます。
私が間違っていることや行方不明になっている可能性があることについて、誰かが私にアドバイスできますか? 私は完全に間違った道を進んでいますか?
openssl - CryptoAPI:CryptVerifySignatureを使用して、公開鍵を使用してopensslからの署名を検証します
Mac用のAquaticPrimeフレームワークをWindowsに移植しようとしています。
Macでは、opensllライブラリを使用しており、これをWindowsに移植する方法を理解しようとしています。Windowsでは、CryptoAPIを使用する必要があると思います。
主に、特定の公開鍵を使用して生成された署名を検証するためのコードが必要です。
opensslを使用して検証を行う方法は次のとおりです。
- 入力:ライセンスデータ、公開鍵、署名、どちらも128バイト長。
- SHA1ダイジェストは、ライセンスデータから計算されます。
- RSAコンテキストは公開鍵データで設定されます
- RSAキーと署名が与えられるとRSA_public_decrypt()が呼び出され、20バイト長のSHA1ダイジェストが返されます。このダイジェストはステップ2のダイジェストと同じであり、署名は有効です。
では、CryptoAPIでこれを行うにはどうすればよいですか?私はこれまでに得ました:
- CryptAcquireContext(ctx、0、0、PROV_RSA_FULL、CRYPT_VERIFYCONTEXT)で開始します
- この投稿を利用して、pubexp=3およびbitlen=1024でCryptImportKeyを使用します。それはすべて機能します。つまり、エラーは発生しません。バイナリデータを調べて、MSDNの記事に示されているものと一致することを確認しました。
- ライセンスデータからSHA1ダイジェストを作成します。結果の20バイトのハッシュ値を取得し、Macのopensslで取得したものと一致することを確認しました。
この時点で、私は次のように呼びます。
これはエラーコードERROR_INVALID_PARAMETERで失敗します。
奇妙なことに、最初に誤って2倍の大きさの公開鍵をPUBLICKEYBLOB構造に格納したときに、代わりにNTE_BAD_SIGNATUREエラーが発生しました。これは、私が渡した公開鍵が正しいことを示唆している可能性があります。
では、なぜ今ERROR_INVALID_PARAMETERエラーが発生するのでしょうか。ハッシュ値が正しいことを確認しましたが、キーも受け入れられているようです。また、「sig」パラメータは署名の128バイトへの単なるポインタであり、sigLenは128です。
だから、私はここで何が欠けていますか?
openssl - CryptoAPI: CryptVerifySignature を使用して OpenSSL または Java から DSA 署名を検証する方法
Microsoft CryptoAPI を使用して、OpenSSL で生成された DSA 署名を検証できるようにしたいと考えています。
次の入力があるとします。
- 既存の DSA 公開鍵:
- 検証するデータ
- バイナリ署名
署名は既に Base64 から一連の 48 バイトに変換されています。
session - CryptoAPI の CryptImportKey は、暗号化されたセッション キーをインポートするために 0 の hPubKey を受け入れます
別のコンピューターから暗号化されたセッションタイプのキーブロブをインポートするときに、CryptImportKey 関数が 0 (復号化キーハンドル) の hPubKey を受け入れる理由を誰か説明できますか?
環境は次のとおりです。
PC #1: ローカル鍵コンテナ (AT_KEYEXCHANGE を使用) で鍵交換鍵ペア (公開/秘密) を生成しCryptGenKey
、公開部分を PUBLICKEYBLOB としてエクスポートし、PC #2 に送信します。
PC #2: PC #1 から公開鍵ブロブを取得し、それをローカルの鍵コンテナーにインポートします。同じローカル キー コンテナーにセッション キーを作成します。クライアントの鍵ブロブからインポートされた公開鍵を使用して、ローカルの鍵コンテナー セッション鍵を SIMPLEBLOB ( CryptExportKey
) にエクスポートします (これはセッション鍵の暗号化に使用されます)。
PC #1: PC #2 から暗号化されたセッション キー ブロブを取得して を呼び出しCryptImportKey
、ローカル キー コンテナー hProv、キー ブロブ バッファー ポインターと長さ、hPubKey とフラグの 0 (ゼロ)、および HCRYPTKEY ハンドルへのポインターを提供します。 .
上記を実行した後、有効なハンドルが返され、返されたハンドルを呼び出しCryptEncrypt
てCryptDecrypt
使用できます。はい、CryptImportKey で、PC #1 で上記の最初の手順から生成された鍵交換鍵ペアのハンドルを指定すると、それも機能します。hPubKey の 0 が機能する理由がわかりません。CryptoAPI がデータを暗号化するための秘密鍵を「知っている」かのようです。
ありがとう。
c# - adwapi.dll のピンボーク - cryptDecrypt および cryptEncrypt 関数、奇妙な問題
この関数の奇妙な動作を観察しています。暗号化したい文字列に 14 バイトが含まれています。この関数を使用してバッファの長さ = 14 を送信すると、失敗します (「内部エラー」 - 非常に説明的で最も役立つエラー コード)。ですが、バッファ長 (およびバッファ自体) が 128 バイトの場合に機能します。
サイズが 128 バイトの配列を作成することでこの問題を克服し、(暗号化したい) プレーン テキストから 14 バイトをコピーしました。
これらのバイトを復号化するときは、もう一度関数に 128 バイト配列全体を渡す必要があります (これで、#13 から #127 までのすべてのバイトが暗号化されます (これは当然のことだと思います))。幸いなことに、最初の 14 バイトは正常に復号化され、残りは意味不明です。
着信バッファが 128 バイトではない場合に暗号化メソッドが失敗する理由と、復号化関数にも 128 バイト配列が必要な理由を知りたいのですが、それはパディングですか?
これは、暗号化関数を呼び出す方法です。
// この場合、MyKey は暗号鍵へのポインタ、2 番目の引数は null、3 番目は「true」(これ以上データがない)、フラグなし、バッファ バイト配列 (128)、Testing.Length この場合は 7 、128
これは私がそれを解読する方法です:
結果は次のようになります: Testing?R????7?q?????$??uj??m%?b??e?a?74p?)?n9??w?R*O )え?i?+?
>[?S???}Ct?n?&??b?P!?u1??%?JQ???/?mP?5wB????
ほぼ意図したとおりに機能しますが、サブストリングなどのトリックを使用せずに、文字列の「テスト」部分のみを取得できるようにする必要があります。
私がやろうとしていること(おそらく別の方法があるかもしれません)はこれです; SmartCard からエクスポートした証明書から取得した公開鍵で暗号化された「テスト」を含むバイナリ (ファイル) があります。秘密鍵を使用して SmartCard (私はその適切な CSP を使用しています) を使用して、このファイルを検証 (復号化) する必要があります。ご覧のとおり、ほとんど機能します。
前もって感謝します。
c# - 個々の単語やドキュメント全体を暗号化するには、どのような暗号化方法が適していますか?
いくつかのドキュメントをクラウドに保存する必要があり、検索用にドキュメント、ドキュメントメタデータ、単語/フレーズを保存する必要があります。
私の計画では、ドキュメント全体を暗号化するために対称暗号を使用する予定ですが、各単語をハッシュする正しい方法がわかりません。安全なものが欲しいのですが、不必要に各単語の文字数を増やしたくありません。
ドキュメントに対して対称暗号化を行うのに最適な実装はどれですか。また、単語やフレーズを必要以上に大きくすることなくハッシュするための最良の方法は何ですか。
c# - CryptoAPIとSystem.Security.CryptographyとBouncycastleはいつ使用する必要がありますか?
私が言えることから、BouncyCastle&System.Security.Cryptographyは、CryptoAPIがやや低レベルであるのに対し、高レベルのタスクを実行する機能を提供します。
BouncyCastleはFIPSに準拠していないと言われていますが、CryptoAPIではこれが可能です。これは本当ですか?
いつ使用する必要がありますか?
.net - .NET + OpenSSL + スマートカード
私は .NET と OpenSSL を使用して CA とクライアント証明書を生成しています。
次のコードは、クライアント証明書を生成し、CA 証明書で署名します。
このコードは問題なく動作しますが、1 つ問題があります。スマートカードでキーと PFX を生成したいので、証明書の生成手順は次のとおりです。
1.) スマート カードで公開鍵と秘密鍵のペアを生成します。
2.) OpenSLL で証明書署名要求を作成し、スマートカードの秘密鍵で署名します。
3.) 証明書署名要求を CA 機関サービスに送信し、CA 証明書で署名します。
4.) 証明書 (CA 機関によって署名されたもの) を取得し、スマートカードに保存されている秘密鍵で署名し、スマートカードで pfx を生成します。
スマート カードを操作するために、Microsoft CryptoAPI と NCryptoki を使用しました。NET ライブラリを使用していますが、私ができることは、スマートカードで公開キーと秘密キーのペアを生成し、スマートカードで CA チェーンを使用して pfx 証明書をインポートすることだけです。自身の CA 機関から取得した証明書要求と証明書に署名できません。
Microsoft CryptoAPI の使用:
NCryptokiを使用。NET ライブラリ:
(Open SLL で生成された) 証明書要求に署名し、スマートカードに保存されている秘密鍵を使用して、独自の CA 機関から取得した証明書に署名するのを手伝ってくれる人はいますか?
一部のテキストに署名するための NCryptoki Sign メソッドの使用:
encryption - CryptAcquireCertificatePrivateKey - 証明書にアクセスする永続的なキー コンテナーを作成します。
cryptoAPI
PFX 自己署名証明書を使用して永続キー コンテナーを作成するにはどうすればよいですか?
呼び出しを介して PFX の秘密鍵にアクセスできますが、秘密鍵CryptAcquireCertificatePrivateKey
と公開鍵のペアをキー コンテナーにインポートするにはどうすればよいですか? このキー コンテナーは、インポート プロセスの完了後、USER キー ストアに永続的に存在する必要があります。
提案を楽しみにしています。
ありがとう
c++ - openssl で公開鍵を使用してデジタル署名を検証する
wincrypt cryptoapi (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING) を使用して Windows でデータに署名しました。Linux では、x509 証明書と署名済みメッセージを確認する必要があります。
. 署名されたメッセージを確認する方法を誰か教えてもらえますか
x509 pem 証明書と署名されたメッセージを Linux の入力として取得します。これを確認する必要があります。