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

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

新規登録して質問してみよう
ただいま回答率
86.02%
公開鍵認証

公開鍵認証とは、公開鍵と秘密鍵の2つの鍵の組を利用する、SSHで利用される認証方式です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

暗号化

ネットワークを通じてデジタルデータをやり取りする際に、第三者に解読されることのないよう、アルゴリズムを用いてデータを変換すること。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

ECDHで作成した公開鍵をpemファイルに保存する際の正しいエンコードとデコードを知りたい。

kmjy
kmjy

総合スコア1

公開鍵認証

公開鍵認証とは、公開鍵と秘密鍵の2つの鍵の組を利用する、SSHで利用される認証方式です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

暗号化

ネットワークを通じてデジタルデータをやり取りする際に、第三者に解読されることのないよう、アルゴリズムを用いてデータを変換すること。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

2回答

0グッド

0クリップ

196閲覧

投稿2023/01/25 19:16

前提

ECDHの公開鍵を生成した際に、その公開鍵をpemファイルに書き込もうしようと思ったのですが
with open("privA.pem", "w") as f:
f.write(alicePrivKey)
でprivA.pemファイルに公開鍵を保存しようとしました。
これの正しいエンコードとデコードが分からないため、エラーか中身が変化してしまいます。
f.write()とf.read()を教えていただきたいです。

実現したいこと

pemファイルで他の端末にECDHで作成した公開鍵を教えたい。

発生している問題・エラーメッセージ

エラーか中身が変化してしまう。

エラーメッセージ

TypeError: write() argument must be str, not int

該当のソースコード

python3

1ソースコード 2from cryptography.hazmat.primitives import hashes 3from cryptography.hazmat.primitives.asymmetric import ec 4from cryptography.hazmat.primitives.kdf.hkdf import HKDF 5import binascii 6import sys 7from tinyec import registry 8import secrets 9 10def compress(pubKey): 11 return hex(pubKey.x) + hex(pubKey.y % 2)[2:] 12 13curve = registry.get_curve('brainpoolP256r1') 14 15alicePrivKey = secrets.randbelow(curve.field.n) 16with open("privA.pem", "w") as f: 17 f.write(alicePrivKey) 18 19alicePubKey = alicePrivKey * curve.g 20print("Alice public key:", compress(alicePubKey)) 21 22### 試したこと 23 24様々なエンコード 25 26### 補足情報(FW/ツールのバージョンなど) 27 28ここにより詳細な情報を記載してください。

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答2

1

PEM形式は -----BEGIN ...-----"で始まるヘッダ、base64 でテキスト化されたバイナリ、-----END ...-----" で終わるフッタという構成です。RFC 7468 で定義されています。他のソフトとの相互運用性が必要なら、この形式に準拠させる必要があります。

secret.randbelow() の返り値が何なのかはマニュアルを参照しましょう。
それをPEM形式にするなら、その整数をどういうバイナリにすべきかを調べましょう。確認してませんが、PKCS のなにかでしょう。

使ったことありませんが、そもそもそんなプリミティブなAPIで乱数を生成しないで、ec. generate_private_key() ec.generate_public_key() で鍵を生成して serialization.Encoding.PEM でエンコードするんじゃないでしょうか。

投稿2023/01/26 02:22

編集2023/01/26 02:50
int32_t

総合スコア17125

melian😄を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

0

ベストアンサー

TypeError: write() argument must be str, not int

writeの引数は文字列で、intじゃありません。
とおっしゃってます。
エンコードがどーという問題ではないです。
まずは、writeの引数に何が入ってるのか確認してみることですねー

投稿2023/01/25 22:51

y_waiwai

総合スコア86031

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

2023/01/29 00:42

こちらの回答が複数のユーザーから「質問に対する回答となっていない投稿」という指摘を受けました。

回答へのコメント

kmjy

2023/01/25 23:22

ご回答ありがとうございます。 f.write(str(alicePrivKey))で引数をstrにしてpemファイルに保存できました。 そこで一つ質問が増えたのですが、最初のエラーであったf.write(alicePrivKey)の引数であるalicePrivKeyは、つまりintであったということでしょうか? またもしこの仮定があっているとして、pem保存しているalicePrivKeyをf.readする時にintの型に戻すにはどうすれば良いのでしょうか?
y_waiwai

2023/01/25 23:52

> つまりintであったということでしょうか? エラーメッセージはそう言ってますね。 文字列と整数の変換はぐぐると解説がたくさん出てきますよ f.write(str(alicePrivKey)) ってのも、エラーは出なくなった、といっても、それで合ってるかどうかってのは別の問題ですね

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

公開鍵認証

公開鍵認証とは、公開鍵と秘密鍵の2つの鍵の組を利用する、SSHで利用される認証方式です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

暗号化

ネットワークを通じてデジタルデータをやり取りする際に、第三者に解読されることのないよう、アルゴリズムを用いてデータを変換すること。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。