問題タブ [elliptic-curve]
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.
java - Java6の楕円曲線暗号
デフォルトでJava6で楕円曲線暗号を使用することは可能ですか?バウンシーキャッスルのようなサードパーティのプロバイダーは使いたくありません。
bouncycastle - Java で対称鍵を生成するための PFX ファイル ECC PrivateKey へのアクセス
ONE ECキーペアによって生成されたキーを使用してAES-256 / GCMでファイルを暗号化するプログラムを(JavaでBouncy Castle APIを使用して)書いています。対称暗号化部分は完全に機能していますが、鍵の生成が困難であることがわかりました。javax.crypto.KeyAgreement.init() メソッドで ECPublicKey オブジェクトを使用しようとすると、次のエラーが返されます。
メソッドのソース コードは次のとおりです。
証明書の PrivateKey にアクセスするにはどうすればよいですか?
**更新: **更新されたソースコード
** 編集 ** 次のコマンドと手順を使用して、問題を実証するためのテスト ファイルを作成できます。
java - JKS KeyStore から ECPrivateKey を読み戻す
ECPrivateKey
以下のコードに示すように、JKS KeyStore から (証明書チェーンを含む) を読み戻そうとしています。
私が使用している曲線は、Sun/Oracle セキュリティ プロバイダではサポートされていないため、Bouncy Castle を使用しています。BC は、セキュリティ プロバイダーのリストの 0 の位置に挿入されます。保存は正常に機能しますが、読み戻しは失敗します。
どうやら、JKS KeyStore の実装は、セキュリティ プロバイダーのリストをループしないようです。ただし、これは BC:PKCS12
およびBKS
. BC を使用してキーを回復するときに KeyStore タイプとして使用する方法はありますか?JKS
上記createX509Certificate
のコードで使用されるメソッドは、次のようになります。
php - キーペアを生成し、PHPECCで暗号化する方法
MDanterのPHPECCパッケージを使用して、公開鍵と秘密鍵のペアを生成し、メッセージを暗号化するにはどうすればよいですか?
このライブラリはここで見つかりました:https ://github.com/mdanter/phpecc しかし、チュートリアルや説明は提供されていません。
次のことを試しましたが、動作しますが、公開鍵しか持っていないため、秘密鍵の入手先と鍵の長さの変更方法がわかりません。
どんな助けでもありがたいです、ありがとう
cryptography - 楕円曲線の例
ECCを使用してメッセージに署名したいと思います。グーグルで検索しようとしましたが、それがどのように機能するかを理解するためのコメント付きコードを見つけることができませんでした。
数学的基礎だけでなく、それを実装する方法も説明しているドキュメントを知っていますか?
rsa - .NET または BouncyCastle で証明書キーの種類 (RSA と EC) を決定しますか?
現在、証明書 (および秘密鍵) を指定して byte[] に署名するルーチンがあります。ただし、証明書/キーのタイプは「RSA キーを使用した証明書」としてハードコードされています。そのコードは次のとおりです。
証明書が RSA キーを使用している場合は 1 つの方法で処理し、EC キーを使用している場合は別の方法で処理するように、より柔軟にしたいと考えています。基本的に、Crypto Service Provider のタイプは別のタイプになります。
したがって、核となる質問は次のとおりです。
- 公開鍵と秘密鍵を含む証明書 (署名用) または公開鍵のみを含む証明書 (検証用) が与えられた場合、証明書で使用される鍵の種類をどのように判断しますか?
私は、標準の .NET ライブラリまたは BouncyCastle.Org ライブラリに対してもオープンです。
.net - 次のPKCS7/CMSコードで機能するECC証明書は何ですか?
PKCS#7 / CMSデータ形式標準を使用して、機密性の高いペイロードを暗号化/復号化/署名/検証しています。現在、PKCS7 / CMSとそのファインに2048ビットと4096ビットのRSA証明書(およびキー)を使用しています(以下のRSA作業コードを参照)。
ECC(特に、secp521曲線)のサポートを追加したいのですが、.NET 4.5は、NSA Suite Bの唯一のPKIアルゴリズム(256および384プライムモジュラス)であるにもかかわらず、ECCのサポートが不十分です。
質問
.NET 4.5および以下のコード(おそらくいくつかの編集を含む)と互換性のある、どのEC証明書+キーを使用できますか?私は特定の曲線を探しています。実際、OpenSSL(または他の一般的なツールまたは無料のツール)を介して証明書とキーを作成すると、非常に具体的な答えが得られます。
RSA-4096証明書+キーの動作する簡略化されたコード
ECC証明書+キーを使用する場合の例外
RSA-4096証明書+キーの動作する簡略化されたコード
ECC証明書+キーを使用する場合の例外
ECC証明書の作成
次のバッチファイルを使用してECC証明書を生成しています。その代表的なスニペットは、
追加の詳細
上記のリンクされたバッチファイルごとに証明書を(再)作成したくない場合は、次の方法で証明書をダンプします。
openssl asn1parse -in test-cert.pem -i -dump
PS:私は以前、問題を逆に解決しようとして質問をしました。BouncyCastleを介してECCPKCS7/ CMSを実行することについてですが、それはサボテンと同じくらい多くの抱擁を得ました。この質問は、はるかに異なるアプローチを追求しています...
ios - iOS の楕円曲線暗号
安全な通信に使用されているiPhoneアプリにECCを組み込もうとしていますが、目的のcでこれを行う方法に関する適切なライブラリ/チュートリアルを見つけるのに苦労しています. この投稿を読みました: iOS で ECC を使用する方法 しかし、ほぼ 1 年前に投稿されたもので、何の反応もありませんでした。ヒント/アドバイスをいただければ幸いです
ありがとう!
openssl - OpenSSL コマンド ライン secp384r1 / SHA-256 デジタル署名
OpenSSL コマンド ラインから secp384r1 / SHA-256 を使用してデジタル署名を生成することは可能ですか (バージョン 1.0.1c を使用しています)? いくつかの実験の後、以下を使用して SHA-1 で署名を生成できます。
しかし
「-ecdsa-with-SHA256」の既知のオプションを教えてくれるだけですか?
前もって感謝します
ios - OpenSSLとBouncyCastleから派生したECDH共有シークレットは、定数とドメインパラメータが両方で同じであるにもかかわらず、常に同じであるとは限りません。
iOSアプリとJavaサーブレットの間にAES暗号化を実装しようとしています。JavaサーブレットはBouncyCastleライブラリを使用し、iOSアプリはOpenSSLを使用します。両方の側で同じ公開/秘密鍵ペアとドメインパラメータを使用しましたが、OpenSSLによって生成された共有シークレットは、サーバー側のBouncyCastleによって生成されたものと異なる場合があります。
手順は次のとおりです。
- 指定されたドメインパラメータ(たとえば
server_public_key
、server_private_key
)を使用してサーバーで生成された公開鍵と秘密鍵のペア server_public_key
EC_POINT
XとYの形でiOSアプリに埋め込まれています- 実行時に、iOSアプリは独自の公開鍵と秘密鍵のペアを生成します(
client_key_curve
これはEC_KEY
)、および - 次に、server_public_keyとclient_key_curveに基づいて
server_public_key
共有秘密( )をロードして計算し、key_agreement
- 次に、
client_public_key
(から抽出されたclient_key_curve
)と、派生した共有シークレット()を使用して対称的に暗号化された暗号化メッセージがkey_agreement
サーバーに送信されます。 - サーバー側では、共有シークレットは
client_public_key
、クライアント側と同じサーバーECDHパラメーターを使用して計算されます。 - 次に、計算されたものを使用して復号化された暗号化されたメッセージ
key_agreement
ただし、復号化されたメッセージは、クライアントが送信したメッセージと常に同じであるとは限りません。
同じ手順を使用するが暗号化にBouncyCastleを使用するAndroidアプリも開発したので、OpenSSLを使用して実装されたコードの正確性を疑うので、他の人が問題の解決に役立つようにコードをここに公開します。共有シークレットを計算するために実装したものは次のとおりです
と
_clientPublicKey
_symmetricKey
クラスレベルで宣言されます
同じ曲線(prime256v1またはsecp256r1という名前)が両側で使用されますが、結果は常に同じとは限りません。
編集1:@PeterDettmanに応えて、サーバーを公開しました–より明確にするためのサイドコード
ここclient_public_key_hex
でclient_public_key
、それはバイトの配列に変換されます。期待される結果は、常にserver_calculatd_symmetric_key
等しいということですsymmetricKey
。しかし、それらは常に同じではありません。
編集2:@PeterDettmanの回答へのフィードバックとして、彼の提案を反映するためにいくつかの変更を加えました。不平等の割合は減少しますが、どちらの側でも生成された鍵共有(共有秘密)はすべての場合でまだ同じではありません。
以下のデータで不平等ケースの1つを再現することが可能です
- 公開鍵: 02E05C058C3DF6E8D63791660D9C5EA98B5A0822AB93339B0B8815322131119C4C
- プライベートキー: 062E8AC930BD6009CF929E51B37432498075D21C335BD00086BF68CE09933ACA
- OpenSSLによって生成された共有シークレット:51d027264f8540e5d0fde70000000000
- BouncyCastleによって生成された共有シークレット: 51d027264f8540e5d0fde700e5db0fab
では、実装されたコードや手順に間違いはありますか?
ありがとう