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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

OpenSSL

OpenSSLはSSL/TLSのプロトコルと一般的な暗号のライブラリを導入するオープンソースのソフトウェアのツールキットです。

Python 3.x

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

Q&A

0回答

691閲覧

M2Cryptoで復号時にエラーが発生する

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

OpenSSL

OpenSSLはSSL/TLSのプロトコルと一般的な暗号のライブラリを導入するオープンソースのソフトウェアのツールキットです。

Python 3.x

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

0グッド

0クリップ

投稿2019/06/12 05:55

編集2019/06/22 14:13

M2Crypto について質問です。

発生している問題

RSA.load_key(), X509.load_cert() などでパスフレーズを求められた場合、必ず復号に失敗します。
Linux, Mac どちらも同様の挙動でした。

例:

bash

1# 秘密鍵を作成 2$ openssl genrsa -aes128 -out privkey.pem

python3

1rsa = RSA.load_key('privkey.pem') 2Enter passphrase: 3RuntimeError: Result of callback is not bytes(). 4 5The above exception was the direct cause of the following exception: 6 7Traceback (most recent call last): 8 File "<stdin>", line 1, in <module> 9 File "/usr/lib64/python3.6/site-packages/M2Crypto/RSA.py", line 376, in load_key 10 return load_key_bio(bio, callback) 11 File "/usr/lib64/python3.6/site-packages/M2Crypto/RSA.py", line 393, in load_key_bio 12 rsa = m2.rsa_read_key(bio._ptr(), callback) 13SystemError: <built-in function rsa_read_key> returned a result with an error set

調べたこと

コードを追ってゆくと、RSA.load_key() に callback を指定しない場合
util.passphrase_callback() が呼ばれ入力されたパスフレーズがstr型として m2.rsa_read_key() に渡されます。

python3

1def load_key_bio(bio, callback=util.passphrase_callback): 2 ... 3 rsa = m2.rsa_read_key(bio._ptr(), callback)

しかし m2.rsa_read_key は callback の戻り値をbytes型として扱っていました。
上記で出ているエラー文とも合致しています。

c

1_m2crypto_wrap.c 2int passphrase_callback(char *buf, int num, int v, void *arg) { 3 ... 4 /* PyEval_CallObject sets exception, if needed. */ 5 ret = PyEval_CallObject(cbfunc, argv); 6 ... 7 if (!PyBytes_Check(ret)) { 8 PyErr_SetString(PyExc_RuntimeError, 9 "Result of callback is not bytes().");

入力したパスフレーズを bytes で返せば良いので、例えばこのような回避は可能です。

python3

1RSA.load_key('privkey.pem', lambda *_: util.passphrase_callback(*_).encode())

これは M2Crypto の不具合でしょうか?
あるいは、私の使い方が誤っているのでしょうか?

ご存知の方おりましたら、アドバイスいただけると助かります。
よろしくお願いいたします。

確認環境

・Gentoo Linux
Python 3.6.5, dev-python/m2crypto-0.31.0-r2
・Mac OSX
Python 3.7.3, pip M2Crypto 0.35.2

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問