問題:
RSA キー ペアの作成とパブリック キーの抽出キーは暗号化において一般的なタスクとなる場合があります。 OpenSSL の genrsa ユーティリティは、これを実現する便利な方法を提供します。しかし、Go を使用して同じ機能を実現するにはどうすればよいでしょうか?
解決策:
Go で RSA キー コンポーネントを生成および抽出するには、次の手順に従います。
1. RSA キー ペアの生成
rsa.GenerateKey を使用して RSA キー ペアを作成できます。この関数は、*rand.Rand ソースを入力として受け取ります。
2.公開キーを抽出します
秘密キーから公開コンポーネントを取得するには、rsa.PrivateKey.Public を使用します。 rsa.PublicKey インターフェイスが返されます。
3. PKCS#1 PEM 形式に変換
秘密鍵と公開鍵の両方を PKCS#1 ASN.1 DER 形式に変換する必要があります。この目的には、x509.MarshalPKCS1PrivateKey と x509.MarshalPKCS1PublicKey を使用します。
4. PEM ブロックへのエンコード
PEM エンコードは、変換されたキーを認識可能な PEM ブロックにラップするために使用されます。 pem.EncodeToMemory はこれを実現できます。
5.出力をファイルに書き込む
最後のステップでは、秘密鍵と公開鍵を別々のファイルに書き込みます。
例:
package main import ( "crypto/rand" "crypto/rsa" "crypto/x509" "encoding/pem" "io/ioutil" ) func main() { filename := "key" bitSize := 4096 // Generate RSA key pair. key, err := rsa.GenerateKey(rand.Reader, bitSize) if err != nil { panic(err) } // Extract public component. pub := key.Public() // Encode private key to PKCS#1 PEM. keyPEM := pem.EncodeToMemory( &pem.Block{ Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(key), }, ) // Encode public key to PKCS#1 PEM. pubPEM := pem.EncodeToMemory( &pem.Block{ Type: "RSA PUBLIC KEY", Bytes: x509.MarshalPKCS1PublicKey(pub.(*rsa.PublicKey)), }, ) // Write private key to file. if err := ioutil.WriteFile(filename+".rsa", keyPEM, 0700); err != nil { panic(err) } // Write public key to file. if err := ioutil.WriteFile(filename+".rsa.pub", pubPEM, 0755); err != nil { panic(err) } }
この例では、key.rsa (秘密鍵) と key.rsa.pub (公開鍵) の 2 つのファイルを生成します。
以上がGo で RSA キーを生成する方法: OpenSSL の「genrsa」と同等?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。