ホームページ >バックエンド開発 >Golang >Go を使用してカスタム io.Reader で RSA 秘密キーを決定的に生成する

Go を使用してカスタム io.Reader で RSA 秘密キーを決定的に生成する

WBOY
WBOY転載
2024-02-09 14:12:10406ブラウズ

使用 Go 通过自定义 io.Reader 确定性生成 RSA 私钥

php エディタ Baicao は、Go 言語を使用して、カスタム io.Reader インターフェイスを通じて RSA 秘密キーを決定的に生成する方法を紹介します。 RSA は、データ暗号化とデジタル署名に一般的に使用される非対称暗号化アルゴリズムです。 RSA 秘密キーを生成するときは、通常、ランダムなソースから乱数を取得する必要がありますが、場合によっては、特定のルールに従って決定論的な秘密キーを生成する必要があります。この記事では、カスタム io.Reader インターフェイスを実装し、このインターフェイスを使用して決定論的な RSA 秘密キーを生成する方法を詳しく説明します。この記事を読むことで、暗号化アプリケーションの柔軟性と制御性を高めるためのこの便利なテクニックを学ぶことができます。

質問の内容

おそらく答えないほうがよい理由により、無制限の rsa 公開鍵/秘密鍵を生成する必要があります。これは安全性の高い目的で使用されるわけではないので、「使用しないでください」とは言わないでください。もちろん、それが理想的ではないことは承知しています。 「無限」とは、未知の数 (数十億から兆) が必要であり、使用する前にそれらを作成することは不可能であるということです。

これは無限のスペースを消費し、生成に無限の時間がかかるため、実行時にこれを行う必要があります。

ただし、特定の入力に対して同じキー ペアも必要です。これは、入力に基づいて rsa キーを決定的に再作成する必要があることを意味します。

私は go を使用します。通常は次のコマンドを使用してキーを作成します。

リーリー

もちろん、問題は、rand.readercrypto/rand によって提供されるため、シードできないことです。

目標を達成するために、独自のリーダー実装を提供できるのではないかと考えました。 generatekey のソース コードを見て、素数を探していることに気づきました。そこで、返される「ランダムな」素数を制御できるように独自のリーダーを実装し、同じものを生成できるようにしました。必要なキー、

リーリー

その後、次のように生成キーを呼び出すことができます

リーリー

コンパイルは完了しますが、ゼロ ポインターが原因で実行時にクラッシュします。 go にはかなり満足していますが、rsa の実装は私の理解を超えています。これを達成するためのより良い方法を探したり、読者のために機能させるために何をする必要があるかを探したりします。

ここでの唯一の難しい要件は、rsa.generatekey または互換性のある置換を使用して、特定の入力に対して同じキーを生成できることであることに注意してください。出力と同じキーを取得する限り、入力は文字通り何でも構いません。

これは、現在の場所を示す go playground のリンクです https://go.dev/play/p/jd1naopr5ad

回避策

read メソッドは失敗しました期待された操作を実行します。入力 p バイト スライスにランダムなバイトを埋め込むことはありません。 crypto/rand.read メソッドの UNIX 実装を見ると、入力バイトのスライスが別のリーダーに渡されます。したがって、基本的にはバイトスライスを乱数で埋める必要があります。例えば:### リーリー

これは、プレイグラウンド

への リンクです。

更新

erwin が回答で述べたように、

maybereadrand という関数があり、これは 50% の確率で rand リーダーから 1 バイトを読み取ることができ、この関数を一意の Certainty にします。ただし、read メソッドに if ステートメントを追加することで問題を解決できます。入力スライスの長さが 1 の場合、すべてを無視して戻ります。それ以外の場合は、入力スライスに素数を指定します: リーリー

この

スニペットでは 2 つのキーを作成しますが、それらは両方とも等しいです。

以上がGo を使用してカスタム io.Reader で RSA 秘密キーを決定的に生成するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。