質問するログイン新規登録

Q&A

解決済

1回答

1396閲覧

Import "cryptography.hazmat.primitives.ciphers" could not be resolved

ddweothd

総合スコア6

Python

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

0グッド

0クリップ

投稿2024/05/16 15:12

編集2024/05/16 16:03

0

0

実現したいこと

以下のURLを参考にPythonで暗号化をしたい。
https://ittrip.xyz/python/python-cryptography-basics

発生している問題・分からないこと

pip install cryptography
上記コマンドを実行したところ以下のようになりました。
Successfully installed cryptography-42.0.7

しかし、以下の2行でエラーが発生しています。
from cryptography.hazmat.primitives import algorithms, modes, backends
from cryptography.hazmat.primitives.ciphers import Cipher

発生しているエラーは
Import "cryptography.hazmat.primitives" could not be resolved Pylance(reportMissingImports)

該当のソースコード

Python

1from cryptography.hazmat.primitives import algorithms, modes, backends 2from cryptography.hazmat.primitives.ciphers import Cipher 3import os 4 5# キーと初期化ベクトルの生成 6key = os.urandom(32) # 256ビット 7iv = os.urandom(12) # 96ビット 8 9# AESアルゴリズムの設定 10algorithm = algorithms.AES(key) 11mode = modes.GCM(iv) 12cipher = Cipher(algorithm, mode, backend=backends.default_backend()) 13 14# 暗号化 15encryptor = cipher.encryptor() 16text = "Hello, world!" 17ciphertext = encryptor.update(text.encode()) + encryptor.finalize() 18 19# 復号 20decryptor = cipher.decryptor() 21decrypted_text = decryptor.update(ciphertext) + decryptor.finalize() 22decrypted_text = decrypted_text.decode() 23print("Decrypted text:", decrypted_text) 24

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

https://teratail.com/questions/342096
↑こちらを参考にしたところ、破線は消えましたが実行時に以下のエラーが出ます。
Exception has occurred: ImportError
cannot import name 'algorithms' from 'cryptography.hazmat.primitives' (C:\Users\xxxx\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\cryptography\hazmat\primitives_init_.py)
File "C:\Projects\crypt\1.py", line 1, in <module>
from cryptography.hazmat.primitives import algorithms, modes, backends
ImportError: cannot import name 'algorithms' from 'cryptography.hazmat.primitives' (C:\Users\xxxx\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\cryptography\hazmat\primitives_init_.py)

補足

意味がよくわかりません。

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

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

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

melian

2024/05/16 16:59

参考にしている記事が書かれた時点での cryptography パッケージのバージョンが古いのだと思います。現時点での最新版(42.0.7)では以下の様になります。 from cryptography.hazmat import backends from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
ddweothd

2024/05/16 21:31

コメントありがとうございます。 修正したところ、最初の2行ではエラーが出なくなりましたが、↓こちらの行でエラーが出ます。 decrypted_text = decryptor.update(ciphertext) + decryptor.finalize() Exception has occurred: ValueError Authentication tag must be provided when decrypting. File "C:\Projects\crypt\1.py", line 23, in <module> decrypted_text = decryptor.update(ciphertext) + decryptor.finalize() & 'c:\Users\xxxx\AppData\Local\Microsoft\WindowsApps\python3.11.exe' 'c:\Users\xxxx\.vscode\extensions\ms-python.debugpy-2024.6.0-win32-x64\bundled\libs\debugpy\adapter/../..\debugpy\launcher' '62195' '--' 'C:\Projects\crypt\1.py'
melian

2024/05/17 02:24

> Authentication tag must be provided when decrypting. と表示されています。この場合、decryptor.finalize() は不要です。 decrypted_text = decryptor.update(ciphertext) + decryptor.finalize() => decrypted_text = decryptor.update(ciphertext)
ddweothd

2024/05/20 09:48

コメントありがとうございます。⚪︎⚪︎を試したところ問題が解決しました! ベストアンサーに選びたいので同じ内容を回答欄に投稿いただけますでしょうか?
guest

回答1

0

ベストアンサー

※ コメントから転記

参考にしている記事が書かれた時点での cryptography パッケージのバージョンが古いのだと思います。現時点での最新版(42.0.7)では以下の様になります。

python

1from cryptography.hazmat import backends 2from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes

修正したところ、最初の2行ではエラーが出なくなりましたが、↓こちらの行でエラーが出ます。

decrypted_text = decryptor.update(ciphertext) + decryptor.finalize()

エラーメッセージには "Authentication tag must be provided when decrypting." と表示されています。この場合、decryptor.finalize() は不要です。

python

1decrypted_text = decryptor.update(ciphertext)

投稿2024/05/20 09:54

melian

総合スコア21745

ddweothd

2024/05/20 10:02

回答ありがとうございます。 試したところ問題が解決しました! ベストアンサーに選ばせていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.25%

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

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

質問する

関連した質問