質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Q&A

1回答

1822閲覧

GoでECDSAの秘密鍵(big.Int)から公開鍵を生成したい

sgt

総合スコア0

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

0グッド

0クリップ

投稿2022/03/09 18:27

タイトルの通りです。
Go言語でESDSAを使用したいのですが、実現方法がわかりません。

https://pkg.go.dev/crypto/ecdsa
こちらを参照しても、秘密鍵をランダム値から生成するロジックや検証にまつわるものはありますが、
生の秘密鍵の値から公開鍵を生成する方法の情報が見つからず困っています。

Go

1type Keys struct { 2 PrivateKey *big.Int 3 PublicKey struct { 4 X, Y *big.Int 5 } 6 Hsid string 7} 8 9func (k *Keys)GenAllFromPrivKey(in *big.Int) error { 10 priv, err := x509.ParseECPrivateKey(in.Bytes()) 11 if err != nil { 12 return err 13 } 14 k.PrivateKey = priv.D 15 16 return nil 17}

上記のコードを作って試してみましたが、下記のエラーでうまく動きませんでした。

panic: x509: failed to parse EC private key: asn1: structure error: tags don't match (16 vs {class:3 tag:27 length:127 isCompound:false}) {optional:false explicit:false application:false private:false defaultValue:<nil> tag:<nil> stringType:0 timeType:0 set:false omitEmpty:false} ecPrivateKey @2

ご助言いただけると幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kiino

2022/03/19 10:51 編集

間違えました
kiino

2022/03/19 10:51 編集

質問欄に書いてしまった。。。
guest

回答1

0

質問欄に書いてしまった。。。

GenAllFromPrivKey の引数 in にはどのような値を入れられてますでしょうか?
もし秘密鍵の byte code をそのまま渡しているようでしたら、pem.Decode を1回かます必要があると思います。
秘密鍵が BEGIN EC PRIVATE KEY から始まるファイルになっているかも確認が必要になると思うのですが、問題ないでしょうか。

私の環境では以下の手順・コードで生成できることを確認しました。

ec private key をつくる。

# ssh-keygen -t ecdsa -b 256 -C "" -N "" -f ssh-ec.key # more ssh-ec.key -----BEGIN EC PRIVATE KEY----- MHcCAQEEILGL1c6s+Gw0IMYBLmhvrIMlftMPlV0dGaGhe/QIY3QioAoGCCqGSM49 AwEHoUQDQgAEKU9rrcYccLZOOsjYmBiPKGPq7Alg0Ha2bJoUB8LDZVz0AYUdKX3Z OFsSD8fPpjW8tf32MzUENSQP+pdF3ttaYw== -----END EC PRIVATE KEY-----

golang

1 // さっき作った秘密鍵の文字列 2 pemBytes := `-----BEGIN EC PRIVATE KEY----- 3MHcCAQEEILGL1c6s+Gw0IMYBLmhvrIMlftMPlV0dGaGhe/QIY3QioAoGCCqGSM49 4AwEHoUQDQgAEKU9rrcYccLZOOsjYmBiPKGPq7Alg0Ha2bJoUB8LDZVz0AYUdKX3Z 5OFsSD8fPpjW8tf32MzUENSQP+pdF3ttaYw== 6-----END EC PRIVATE KEY-----` 7 8 block, _ := pem.Decode([]byte(pemBytes)) 9 10 11 privateKey, err := x509.ParseECPrivateKey(block.Bytes) 12 13 if err != nil { 14 fmt.Println(err) 15 os.Exit(1) 16 } 17 18 fmt.Printf("Public Key : : %x\n", privateKey.PublicKey) 19 fmt.Printf("Private Key D : : %x\n", privateKey.D)

投稿2022/03/19 10:51

kiino

総合スコア539

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問