お知恵をお貸しください。お願いします。
追記: ソースコードを下に開示いたします。
[概要] 該当のソースコードを使うと例外が飛んでくる. この例外をどうにかしたい.
現在、CryptoPPを使って、暗号化・復号をしようとしています。
しかし、上記のソースコードでは、復号の部分で、
"StreamTransformationFilter: ciphertext length is not a multiple of block size" (CryptoPP::InvalidCiphertext)
という例外が飛んできているようです。
documenationで、(私なりに)色々調べた結果、(TrippleDESの)復号時に例外
(上記のメッセージ付き)が飛んできているようです。
ただ、これ以上の知識がないため、どうやって対処すればいいのかがわかりません。
メッセージ的には「暗号文の長さがブロックサイズに合わない」系であることはわかりますが...
(長さはどのぐらいがベストなのかが不明瞭...)
どうやら decryptor->decrypt(...) 辺りで例外が飛んできているようです。
ここまではなんとかわかりましたが、
その解決策が思い浮かびません。
CryptoPP::Exceptionが持つメンバの中にGetErrorTypeメンバ関数があったので、
それで覗くと CryptoPP::Exception::INVALID_DATA_FORMAT のようです。
documentationを読むと
Input data was received that did not conform to expected format.
(= フォーマットに適合できない入力データを受け取った )
とあります。
もしかして「暗号化したりする対象データ群」がブロックサイズより大きいとできないのかなぁ。
と思い、
1. (バイナリモードで)1バイト分読み込む 2. 1で読み込んだcharデータを文字列としてencryptor->encrypt() に渡して暗号化 3. 2で取得した文字列を別のファイルに書き込む
みたいな感じにしてみました。
しかし、その場合はそもそもファイルサイズが大きいため、
(試したところ1時間経っても終わりそうにない...)
実用的ではないなぁと。
そのため、読み込むバイト数を1バイトから100バイトに変えてみても、
今回の最初のメッセージになります。
できればファイルを暗号化したいのですが...
[情報]
言語: C++
ライブラリ: cryptopp 8.3
OS: Windows 10
コンパイラ: MinGW (g++ (i686-win32-dwarf-rev0, Built by MinGW-W64 project) 8.1.0)
デバッガ: GDB
[追記1]
ご指摘があったので、zipファイルではなく、ここで開示します。
(そのため、Cryptoppは別途、ご用意してください。)
main.cpp: 字数制限のため、Pastebinに記述しています。
Basis.h: 字数制限のため、Pastebinに記述しています。
// お読みください.txt [注意] Cryptoppを(コンパイルした状態で)そのまま同梱していますが, 質問のためなのでご容赦を. [Problems] sample1.exeを起動すると"StreamTransformationFilter: ciphertext length is not a multiple of block size" というメッセージが出てクラッシュする. ただし, original.mp4 は適当なMP4ファイルとしている. [ソースの概要] Cryptoppを独自のDLLにして、例えば myencrytion.dll等のようにして、DLL内にあるクラスオブジェクトを使う 方式でやろうとしています。 なのでデザインパターンのFactoryパターン...でいいのでしょうか。一旦 CryptionManagerというクラスオブジェクトを生成し、 これが FactoryMethodパターン...?適用で、Ecryptorとかそういうのを生成する... という状態にしようとしています。 ただ、まずは実行ファイルすら作れないならDLLは作れないので、実行ファイルとして書いています。 [Compile] Cryptoppをmain.cppと同じディレクトリに置いた状態で、 以下のようにした. ( -lole32 とかはこのコードでは使っていないですが、後から使う可能性があるので付与しているとします... ) $ g++ -g -o sample1.exe main.cpp -I./cryptopp/include -L./cryptopp/lib -lcryptopp -lshlwapi -lwinmm -lole32 -lshell32 -luuid -lgdi32 -lurlmon -static-libgcc -static-libstdc++ -static -lpthread -DUNICODE
回答1件
あなたの回答
tips
プレビュー