暗号化についても考えてみる その6
crypto++を利用して、パスワードを暗号化、復号化するためのクラスを作ってみました。名前は「Cipher」、まんまですね。といっても公開されていたサンプルを焼き直しただけです。
crypto++のフォルダにある"*.h"をすべて、ディレクトリ"./include"にコピーして、作ったライブラリ"libcryptopp.a"をディレクトリ"./lib"にコピーしました。
クラスの実装コードにテスト用のmain()を書きまして、生のパスワードと暗号化して16進数表示に直した文字列を表示するようにしてみました。
コンパイルしますと(実際は何度もコンパイルエラーを出して、直しました…)。
なんとなく暗号化、復号化できてるっぽいですね。実行ファイルのサイズは、どれくらいですかね…
12MB…もある。たった数10行のコードでですか?crypto++のGNUmakefileを確認すると、
変更して、"libcryptopp.a"を作りなおして、もう一度cipher.exeをコンパイルしますと、
と、ここまでやって、思い直しました。
「パスワード保存しなくていいのでは?」と。「保存すると、危険なだけかも」
というわけで、大きなライブラリをリンクして、わざわざ危険なパスワードの保存をすることに意味があるのか、というところに落ち着いてしまいました。このようにしてregistryへのパスワード保存をやめました…(^-^;
#この記事必要なの?っていうツッコミは気にしない。
現在のリリースバージョンのファイルサイズは、200KB(MinGW-4.8.2)です。
[cipher.cpp]
crypto++のフォルダにある"*.h"をすべて、ディレクトリ"./include"にコピーして、作ったライブラリ"libcryptopp.a"をディレクトリ"./lib"にコピーしました。
クラスの実装コードにテスト用のmain()を書きまして、生のパスワードと暗号化して16進数表示に直した文字列を表示するようにしてみました。
コンパイルしますと(実際は何度もコンパイルエラーを出して、直しました…)。
g++ -O2 -v -I./include cipher.cpp -L./lib -lcryptopp -o cipher
$ ./cipher plain text: mcz-xoxo encode text: F48BF948DC9763F783A75275011D8C75 encode text: F48BF948DC9763F783A75275011D8C75 plain text: mcz-xoxo
なんとなく暗号化、復号化できてるっぽいですね。実行ファイルのサイズは、どれくらいですかね…
$ ls -al cipher.exe -rwxrwxr-x 1 masaaki masaaki 12865908 6月 5 08:14 cipher.exe
12MB…もある。たった数10行のコードでですか?crypto++のGNUmakefileを確認すると、
CXXFLAGS = -DNDEBUG -g -O2となってますね。"-g"なのでデバッグコードが入ってます。リリース時は外していいのではないでしょうかね…
CXXFLAGS = -DNDEBUG -O2
変更して、"libcryptopp.a"を作りなおして、もう一度cipher.exeをコンパイルしますと、
$ ls -al ./cipher.exe -rwxrwxr-x 1 masaaki masaaki 3400324 6月 5 08:17 ./cipher.exe3MBちょっとですか。やはり、まだ大きいですね…。使っている".o"だけがリンクされるはずですが、それだけいろいろな処理をしているということらしいですね。
と、ここまでやって、思い直しました。
「パスワード保存しなくていいのでは?」と。「保存すると、危険なだけかも」
というわけで、大きなライブラリをリンクして、わざわざ危険なパスワードの保存をすることに意味があるのか、というところに落ち着いてしまいました。このようにしてregistryへのパスワード保存をやめました…(^-^;
#この記事必要なの?っていうツッコミは気にしない。
現在のリリースバージョンのファイルサイズは、200KB(MinGW-4.8.2)です。
$ ls -al release/qtbrynhildr.exe -rwxrwxr-x 1 masaaki masaaki 203776 6月 4 22:16 release/qtbrynhildr.exe以下のコードはご参考ということで。 [cipher.h]
#ifndef CIPHER_H #define CIPHER_H // CryptoPP Header #include "cryptlib.h" #include "modes.h" #include "filters.h" #include "hex.h" #include "des.h" using namespace CryptoPP; namespace brynhildr { class Cipher { public: // Contructor Cipher(const char *key); string encodeString(string plain); string decodeString(string decoded); private: ECB_Mode<DES>::Encryption encctx; ECB_Mode<DES>::Decryption decctx; }; } // end of namespace brynhildr #endif // CIPHER_H
[cipher.cpp]
// Common Header #include "common.h" // System Header #include <cstring> #include <iostream> // Local Header #include "cipher.h" using namespace std; namespace brynhildr { // Constructor Cipher::Cipher(const char* key) { byte cryptkey[DES::DEFAULT_KEYLENGTH]; memcpy(cryptkey, key, DES::DEFAULT_KEYLENGTH ); encctx.SetKey(cryptkey, DES::DEFAULT_KEYLENGTH ); decctx.SetKey(cryptkey, DES::DEFAULT_KEYLENGTH ); } string Cipher::encodeString(string plain) { string cipher, encoded; // cipher StringSource(plain, true, new StreamTransformationFilter(encctx, new StringSink( cipher ) ) ); // hex encode StringSource(cipher, true, new HexEncoder(new StringSink(encoded) ) ); cout << "plain text: " << plain << endl; cout << "encode text: " << encoded << endl; return encoded; } string Cipher::decodeString(string encoded) { string decoded, recovered; // hex decode StringSource(encoded, true, new HexDecoder(new StringSink(decoded) ) ); // cipher decode StringSource(decoded, true, new StreamTransformationFilter(decctx, new StringSink( recovered ) ) ); return recovered; } } // end of namespace brynhildr using namespace brynhildr; int main(int argc, char* argv[]) { Cipher cipher("Soul Gem"); string encoded = cipher.encodeString("mcz-xoxo"); cout << "encode text: " << encoded << endl; string plain = cipher.decodeString(encoded); cout << "plain text: " << plain << endl; }
« Qt Designerを使ってみる その2 | トップページ | 進捗記録 2014.6.5 »
コメント