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

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

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

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

Q&A

解決済

1回答

2794閲覧

pycryptodome でAES.newするときにエラーが出てしまう

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

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

0グッド

0クリップ

投稿2019/07/13 02:48

やりたいこと

pythonでのAES暗号化をおこないたいので、サンプルコードを書いて実験しているところです。

環境
win10 64bit 
python3.6.1
pycryptodome==3.8.2

やったこと

コード

python

1 from Crypto import Random 2 import base64 3 from Crypto.Cipher import AES 4 5 def _pad(s): 6 bs = 32 7 return s + (bs - len(s) % bs) * chr(bs - len(s) % bs) 8 9 def my_encrypt(text,key): 10 text = _pad(text) 11 iv = "xxxxxyyyyyzzzzz0".encode("utf-8") 12 # iv = Random.new().read(AES.block_size) としても結果は同じ。 13 cipher = AES.new(key,AES.MODE_CBC,iv) 14 return base64.b64encode(iv + cipher.encrypt(text)) 15

実行結果

python

1Traceback (most recent call last): 2 File "----MYPATH----\sandbox\aes実験.py", line 108, in <module> 3 print(my_encrypt("abcde",pass_phrase)) 4 File "----MYPATH----\sandbox\aes実験.py", line 105, in my_encrypt 5 cipher = AES.new(key,AES.MODE_CBC,initial_vector) 6 File "----MYPATH----\venv\lib\site-packages\Crypto\Cipher\AES.py", line 232, in new 7 return _create_cipher(sys.modules[__name__], key, mode, *args, **kwargs) 8 File "----MYPATH----\venv\lib\site-packages\Crypto\Cipher\__init__.py", line 79, in _create_cipher 9 return modes[mode](factory, **kwargs) 10 File "----MYPATH----\venv\lib\site-packages\Crypto\Cipher\_mode_cbc.py", line 274, in _create_cbc_cipher 11 cipher_state = factory._create_base_cipher(kwargs) 12 File "----MYPATH----\venv\lib\site-packages\Crypto\Cipher\AES.py", line 103, in _create_base_cipher 13 result = start_operation(c_uint8_ptr(key), 14 File "----MYPATH----\venv\lib\site-packages\Crypto\Util\_raw_api.py", line 235, in c_uint8_ptr 15 raise TypeError("Object type %s cannot be passed to C code" % type(data)) 16TypeError: Object type <class 'str'> cannot be passed to C code

調査内容

pycrypto は非推奨であり、pycryptodome が推奨であるということは把握しています。
pip freeze => pycryptodome==3.8.2
が出ています。

上記のエラーは iv として、非バイト文字列を渡した際に生じるエラーとして指摘されていました。
https://ja.stackoverflow.com/questions/48764/pycrypto%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E6%9A%97%E5%8F%B7%E5%8C%96%E3%81%AB%E5%A4%B1%E6%95%97%E3%81%99%E3%82%8B

以上より、iv がバイト文字列でなくてはならないことは把握しており、
上記コードではそこもクリアできているつもりです。

質問

以上のような状況ですが、なぜこのようなエラーになってしまうのか理解できておりません。
ご指導よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

質問から時間がたってるので自己解決していると思いますが、ほかにこの情報が欲しい人がいるかもしれないので...

暗号対象の文字列もバイト型である必要があります。

python

1my_encrypt(b"secret", key)

or

python

1my_encrypt("secret".encode("utf-8"), key)

投稿2019/10/10 15:40

rtgsdfsdg

総合スコア174

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

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

退会済みユーザー

退会済みユーザー

2019/10/17 12:23

ありがとうございます! 不明のまま長いこと放置していました。bytesにしたらすぐに動きました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問