問題タブ [encryption-asymmetric]
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# - C# で RSA を使用してファイル (巨大なデータ) を暗号化する方法
私は暗号化が初めてです。秘密鍵/公開鍵を使用すると思われる非対称暗号化アルゴリズムを実装する必要があります。RSACryptoServiceProvider のサンプルを使い始めました。暗号化する小さなデータで問題ありませんでした。しかし、比較的大きなデータ "2 行" で使用すると、CryptographicException "Bad Length" という例外が発生します。
次に、CryptoStream を使用して大きなデータ (またはファイル) を暗号化するサンプルをいくつか見つけ、DES や 3DES などの対称アルゴリズムのみを使用します。これには、CryptoStream のコンストラクターへの入力の 1 つとして ICryptoTransform を返す関数 CreateEncryptor があります!!!
RSA を使用してファイルを暗号化する方法は何ですか?
encryption - ソフトウェア ライブラリを使用するよりもハードウェア暗号化デバイス (USB 暗号化ドングル/キーストアなど) を使用する正当な理由はありますか?
アプリケーションでデータを暗号化/復号化する必要がある場合 (さまざまな理由で)、ソフトウェア暗号化ライブラリ (.net Cryptography など) を使用する代わりに、ハードウェア デバイス (Marx CryptoBox などの USB 暗号化デバイスなど) を使用する理由はありますか?または自分で作成する)、キーを安全なキー ストアに保管しますか?
この件について客観的な意見を求めています。
提起された質問を絞り込むために: USB 暗号化ドングルを使用するシステムが物理的に安全なサーバー保管庫に収容されていて、存在するシステムが 1 つしかない場合 (つまり、配布されて実行されるソフトウェア製品ではない場合)、あなたの意見はどうなりますか?多くのデスクトップ) ? 非常に単純化して言えば、上記のシステムの目的は、受信した暗号化データの一部を検証 (復号化および比較) することです。
これまで素晴らしい回答をありがとうございました!
c# - 証明書公開鍵を使用したJavaでの署名の検証
いくつかのC#コードをJavaで同等のものに変換しようとしています。
C#コードは、いくつかの文字列コンテンツと署名(別のマシンで秘密鍵を使用して生成された)を受け取り、公開鍵と組み合わせて署名の一致を検証し、要求が改ざんされていないことをある程度保証します。
公開鍵自体はX509証明書です-.cerファイルから構築され、アセンブリリソースとして保存されます。
私が探しているのは、Javaでこの機能をエミュレートすることです。これにより、C#のコードによって生成された署名を検証できます... Javaの暗号機能の調査を開始しましたが、私はJava初心者です。 。これが私がこれまでに思いついたものです:
誰かが私が署名を検証する方法についての洞察を提供できますか?または、Java.cryptoとjava.security.certの使用法をミルjavaドキュメントの実行よりもよく説明する可能性のあるいくつかのリソースへのリンクを提供できますか?
c# - 既知のクライアントからのみ Web サービス呼び出しを強制することは可能ですか?
シナリオ:
私が完全に制御できる、公開されている Web サービス。しかし、この特定のデスクトップ アプリケーション (公開アプリケーション) だけが Web サービスにアクセスできるようにしたいと考えています。デスクトップクライアントに秘密のパスワードを保存することはできましたが、それは簡単に解読できてしまいます。
これを強制する既知の実装はありますか? PKI、非対称鍵?
signing - 非対称暗号システムで秘密鍵を使用して暗号化してはならないのはなぜですか?
非対称暗号システムの標準的な使用法では、暗号化は公開鍵で行われ、復号化は秘密鍵で行われます。
このプロセスを逆にして、「秘密鍵による暗号化」を「署名」と呼びます。
標準ツールは、用語や直接的なツールがないにもかかわらず、秘密鍵を暗号化に使用する暗号化システムを実装できます。
そのようなソリューションが脆弱である理由を誰かが明確に説明できますか?
ユーザーケース:
Alice が、従来とは異なる方法で Bob に何かを送信したいとします。
アリスとボブはかつて会い、アリスはボブに自分が作成した秘密鍵から生成された「公開鍵」を与えましたが、秘密にしておくようにボブに警告しました。そして、彼女は秘密鍵を秘密にして、他の誰にも公開鍵を渡さなかった.
ボブは、アリスから受信したメッセージ (これらがアリスの秘密鍵によって暗号化されている場合) だけが読み取れることを確信できますか (アリスの公開鍵のコピーを本当に秘密にしている場合)。
そして、この暗号化の堅牢性を従来の方法と比較するとどうなるでしょうか? この場合、Bob が (Alice の公開鍵で暗号化された) メッセージを Alice に送信します。
質問の内容
非対称キーが「プライベート」および「パブリック」と名付けられているという事実は、私の質問を理解するのに役立ちません。キーには基本的なプロパティがあり、「公開」プロパティを与える「公開キー」をブロードキャストするのは私です。回答する前に、この違いを明確にしてください。これらの鍵の「公開」と「秘密」のプロパティを考慮しているのではなく、「秘密鍵」暗号化と「公開鍵」暗号化の堅牢性を考慮しています。
この特殊なケースでは、誤解を招く可能性があるとしても、別の用語を使用することはできません。
このケースは非伝統的であり、いくつかの不一致につながる可能性があること、またはここでボブとアリスがある種の共通の秘密を共有しているため、非対称暗号システムのポイントではないことを知っていますが、それは非対称暗号のポイントではありません.
「秘密鍵」と「公開鍵」が交換可能であることを示唆するStackoverflowの回答をいくつか見ました(以下の回答を読んでください)。秘密鍵から公開鍵を生成するのは自明であり、これは逆に計算上実行可能ではないことが保証されているため、これは RSA には当てはまりません。信者でない場合、RSA を使用した openssl でのキー生成のプロセスは次のとおりです。
- 秘密鍵を生成する
- 秘密鍵から公開鍵を抽出します。
「秘密鍵」と「公開鍵」に大きな違いがある場合、「秘密鍵」暗号化と従来の「公開鍵」暗号化の間に堅固な違いはありますか?
長い選択された回答からの短い回答
「秘密鍵」とは何かについての誤解は、私を助けてくれませんでした。「秘密鍵」には 2 つの異なる定義があります。「実用的な秘密鍵」と「理論上の秘密鍵」です。
RSA 理論による理論上の秘密鍵は、公開鍵と数学的対称性を共有しています。
- 一方から他方を推測することはできません
- 暗号化はどちらの方法でも同様に堅牢です
RSA ツール (openssl など) からの実用的な秘密鍵には、効率上の理由から追加情報が含まれており、多くの場合、公開鍵の一部は規則によって設定されています。これらの仮定は対称性を破ります。
- 「実用的な秘密鍵」から公開鍵を取得するのは簡単です
- しかし、暗号化も同様に堅実なままです
詳細については、選択した回答を参照してください。誤解が残る場合はコメントしてください...
編集メモ:
- 非対称暗号システムのキー ペアは頻繁にスワップ可能であると宣伝されています (現在のスタック オーバーフローの回答でも)。実際のツールではそうではないため、危険な誤解である可能性があるという事実に反省を加えようとしています。
- ユーザーケースを追加しました。これで私の質問が明確になることを願っています
- 最終的な「短い回答」を追加
pgp - PGP - GnuPG - いくつかの質問
PGP の完全な代替となるオープン ソース ソフトウェアであるGnuPG ( http://www.gnupg.org/ )を使用したいと考えています。
私はこれまで使用したことがありませんが、ソフトウェアは見栄えがします。
このソフトウェアを使用して、ファイルを暗号化して Web 経由で転送する予定です。このソフトウェアを電子メールには使用していません。
いくつかの質問を聞きたいんです:
Windows と Ubuntu で使用できる推奨 GUI は何ですか?
RSA ではなく Diffee Hellman (DH/DSS) のキー ペアを生成したいと考えています。これを行うための行コマンドは何ですか? 同様に、2048 のキー長を使用します。
公開鍵と秘密鍵のペアを生成したら、コマンド ラインから他の人の公開鍵に署名するにはどうすればよいですか?
c# - RSA によるライセンス検証の実装
C# で作成したプログラムを販売しようとしていますが、そのライセンスを厳密に管理したいと考えています。つまり、クライアントが起動するたびにサーバーに接続できるようにしたいということです。これにより、キーを無効にすることもできます (paypal でのチャージバックまたはコードの配布の場合)。もちろん、これは他のユーザーにとっては面倒かもしれませんが、この場合は必要です。クラックされていない優れた .NET ライセンス システムを見つけることができなかったので、自分で小さなものを作成するというアプローチを取りたいと思いました。私の計画は、次のことを行うことでした。
- ソフトウェアに同梱される 1024 文字を含む key.dat を生成します (各ユーザーに個別に)
- アプリケーション エントリポイントで、暗号化された key.dat + 現在のタイムスタンプを送信する httprequest をサーバーに追加します。
- HTTP サーバー (PHP を実行) はリクエストを復号化し、キーが (データベース内で) 有効かどうかを確認し、「アクセス レベル」(ライセンス タイプ) で応答します。キーが無効または無効になっている場合、エラーコードが返されます。リクエストと同様に、応答はタイムスタンプでソルトされているため、誰かが有効なパケットを自分に送信してプログラムを検証することはできません。タイムスタンプはクライアントでチェックされています。返信は、RSA と以前に生成された公開鍵で暗号化されます。
- クライアントは応答を受け取り、秘密鍵で復号化して反応します。
RSA はこれに対する正しいアプローチなので、パケットが私によって送信され、(公開鍵を持っている他の人によって) 細工されていないことを保証できますか? この問題を解決するためのより良いアプローチはありますか?
c# - RSA 暗号化、長さが正しくありません
次の関数を呼び出す場合:
私は今、エラーが発生しています: 長さが正しくありません。
より小さな文字列で機能します。私が渡している文字列に問題がある可能性があるという考えは、200文字未満です。
c# - Java 暗号化 C# 復号化
RSA がデータを暗号化して C# に渡すモジュールを入手しました。C# は、公開キー (64 ビット エンコード) と渡されたトークンに基づいて暗号化を解除する必要があります。
私は token 、64 ビットでエンコードされた公開鍵を持っています。サンプルを使用して開始するのに役立つものがあります。私がJavaの終わりから知っているのは、それが使用していることだけです。Java エンドから結果を取得したので、これを解読するために C# でパーサーを作成する必要があります。公開鍵とトークンの両方を文字列値として取得します。
ありがとう
.net - x509証明書を使用するrsacryptoserviceproviderc#
秘密鍵と公開鍵の両方を持つmakecertによって生成された証明書を使用しています。Java側はこの公開鍵を使用してデータを暗号化し、.netはそれを復号化して戻します。
Javaの暗号化された64ビットエンコードされた文字列を復号化しようとしていますが、不正なデータを取得しています。
すべてがon.Netで問題ないかどうかを確認するために、最初に公開鍵で暗号化してから、同じ証明書を使用して秘密で復号化しようとしました。私のコードは次のようになります。
ここでもエラーが発生します。私は何かが足りませんか?
証明書は公開鍵と秘密鍵の両方で有効に見えます。