« Qt Designerを使ってみる その2 | トップページ | 進捗記録 2014.6.5 »

2014年6月 5日 (木)

暗号化についても考えてみる その6

crypto++を利用して、パスワードを暗号化、復号化するためのクラスを作ってみました。名前は「Cipher」、まんまですね。といっても公開されていたサンプルを焼き直しただけです。

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.exe
3MBちょっとですか。やはり、まだ大きいですね…。使っている".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 »

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: 暗号化についても考えてみる その6:

« Qt Designerを使ってみる その2 | トップページ | 進捗記録 2014.6.5 »