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

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

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

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

Python 3.x

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

暗号化

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

Python

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

Q&A

解決済

2回答

705閲覧

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

kmjy

総合スコア1

公開鍵認証

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

Python 3.x

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

暗号化

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

Python

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

0グッド

0クリップ

投稿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ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

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

総合スコア20884

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

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

0

ベストアンサー

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

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

投稿2023/01/25 22:51

y_waiwai

総合スコア87774

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

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

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)) ってのも、エラーは出なくなった、といっても、それで合ってるかどうかってのは別の問題ですね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問