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

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

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

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

Python

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

Q&A

解決済

1回答

450閲覧

opensslコマンドで暗号化したファイルをpythonコードで復号したい

828kk88

総合スコア61

OpenSSL

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

Python

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

0グッド

0クリップ

投稿2023/11/20 04:55

編集2023/11/20 06:31

「過去に投稿した質問と同じ内容の質問」という指摘を受けていますが、内容が異なるので予めご了承ください

openssl enc -e aes-256-cbc -base64 -iv iv値 -k 暗号鍵 ファイル -in 暗号化前ファイル名 -out 暗号化後ファイル名 -md sha256
上記コマンドで暗号化されたcsvファイルを、pythonコードで復号したいです

import base64 import hashlib from Crypto.Cipher import AES # 暗号化されたファイルを読み込み、Base64デコードする with open('encrypted.csv', 'rb') as f: encrypted_data = base64.b64decode(f.read()) # 暗号鍵とIVをセットアップ key = hashlib.sha256(キー.encode()).digetst() iv = bytes.fromhex(iv値) # 復号化 cipher = AES.new(key, AES.MODE_CBC, iv) decrypted_data = cipher.decrypt(encrypted_data) # PKCS#7パディングを除去 pad = decrypted_data[-1] decrypted_data = decrypted_data[:-pad] # 復号化されたデータを保存 with open('decrypted.csv', 'wb') as d: d.write(decrypted_data)

上記コードで復号化を試みていますが、文字化けしたようなファイルが生成されます

暗号化時に-kオプションを-Kにし、
key = hashlib.sha256(キー.encode()).digetst() の箇所を
key = bytes.fromhex(キー)
とする場合、復号ができることは確認済みです
よって、keyの復号に失敗していると思われます。

なにかお気づきの点があれば教えていただきたいです

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

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

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

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

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

y_waiwai

2023/11/20 05:09

で、それでどういう不具合があるんでしょうか 問題が見えません
828kk88

2023/11/20 05:27

問題点書き忘れてました。追記済みです 「過去に投稿した質問と同じ内容の質問」という指摘がありますが、同じ内容ではありません オプション変えた場合の復号についての質問です
bsdfan

2023/11/20 06:15

先頭の openssl のコマンドが正しくないようなので、オプション等を正確に記載いただけますか(-v は -iv の間違いなのか、そうだとしても -k と -iv を同時に指定するのに違和感があるので)
828kk88

2023/11/20 06:33

-vは誤字です。 正しく修正しました。 -Kオプションの場合であれば-ivと併用しても復号できたので問題ないかと思います
guest

回答1

0

ベストアンサー

これとか、
https://qiita.com/albatross/items/685f751549423efc9fbc
英語でよければここら辺が参考になると思います。
https://stackoverflow.com/questions/16761458/
https://security.stackexchange.com/questions/29106

ざっくり書くと、openssl は暗号化するとき、
コマンドオプションから -k で与えたパスフレーズと、中で生成した乱数列 (Salt) から、
ハッシュアルゴリズムを通して暗号化に使う key と iv を計算します。
(鍵導出関数)

Saltは暗号化の出力に埋め込まれているので(今回のでは 8-15バイト)、復号の時にも同じアルゴリズムでkey, ivを計算することができます。

今回は iv は指定しているので、keyだけを計算すればいいのではないでしょうか。
(通常は iv も鍵導出関数で作成されたものを使うことが多いと思います)

python

1# 暗号鍵とIVをセットアップ 2salt = encrypted_data[8:16] 3key = hashlib.sha256(キー.encode() + salt).digest() 4iv = bytes.fromhex(iv値) 5 6# 暗号文本体 7encrypted_data = encrypted_data[16:]

投稿2023/11/20 07:13

編集2023/11/20 07:17
bsdfan

総合スコア4576

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問