今流行りの twitter のクライアントが作りたい。
ユーザーのIDとパスワードをどこに置くか?
OAuthていうのを使うといいらしいけど、なんかややこしそうだし
セキュリティホールがあるってのも気になります。
やっぱレジストリに置こうかな。
ってことで、とりあえず可逆暗号書いてみました。
いろいろ調べたけど、結構簡単に使えそうなAPIがあったので
助かりました。
Windowsが関数の中で LocalAlloc する変数があるので忘れずに
LocalFree。恐ろしや。
#pragma comment(lib, "crypt32.lib")
#include <cstddef>
#include <string>
#include <windows.h>
#include <Wincrypt.h>
bool encrypt(const std::string& key, const std::string& plain, void* crypt, size_t* crypt_len )
{
DATA_BLOB key_bolb;
key_bolb.pbData = (BYTE*)key.c_str();
key_bolb.cbData = key.length()+1;
DATA_BLOB plain_bolb;
plain_bolb.pbData = (BYTE*)plain.c_str();
plain_bolb.cbData = plain.length()+1;
DATA_BLOB crypt_bolb; // must LocalFree
BOOL result
= CryptProtectData(
&plain_bolb,
L"",
&key_bolb,
NULL,
NULL,
0,
&crypt_bolb);
if(result)
{
*crypt_len = (size_t)crypt_bolb.cbData;
if(crypt != NULL )
::memcpy(crypt, crypt_bolb.pbData, *crypt_len);
}
LocalFree( crypt_bolb.pbData );
if(result)
return true;
else
return false;
}
bool decrypt(const std::string& key, const void* crypt, const size_t crypt_len, std::string& plain )
{
DATA_BLOB key_bolb;
key_bolb.pbData = (BYTE*)key.c_str();
key_bolb.cbData = key.length()+1;
DATA_BLOB crypt_bolb;
crypt_bolb.pbData = reinterpret_cast<BYTE*>(const_cast<void*>(crypt));
crypt_bolb.cbData = crypt_len;
DATA_BLOB plain_bolb; // must LocalFree
LPWSTR* desc = NULL; // must LocalFree
BOOL result
= CryptUnprotectData(
&crypt_bolb,
desc,
&key_bolb,
NULL,
NULL,
0,
&plain_bolb);
if(result)
{
plain = (char*)plain_bolb.pbData;
}
LocalFree( plain_bolb.pbData );
LocalFree( desc );
if(result)
return true;
else
return false;
}
使い方。
void main()
{
std::string plain = "あいうえおかきくけこさしすせそ";
std::string key = "1234"; //鍵。暗号化と復号で同じものを使う
size_t out_len; //まずは暗号化後の長さを得る
if(::encrypt(key, plain, NULL, &out_len))
std::cout << "encrypt len ok" << std::endl;
else
std::cout << "encrypt len ng" << std::endl;
char* out = new char[out_len]; //暗号化
if(::encrypt(key, plain, out, &out_len))
std::cout << "encrypt ok" << std::endl;
else
std::cout << "encrypt ng" << std::endl;
//outに暗号化後のデータが入ってるので、どっかに保存したりする
memdumpc(out, out_len);
std::string check; //復号
if(::decrypt(key, out, out_len, check))
std::cout << "decrypt ok" << std::endl;
else
std::cout << "decrypt ng" << std::endl;
delete [] out;
std::cout << check << std::endl;
return;
}
お!
リリースされてるね。
自分のワードリスト画面からクリックでURLへジャンプすることがあったので、
その機能がまたほしいな~。
あとは今後の発展に大期待です。
まずはよくジャンプするワードがトップ画面にリスト表示されるといいな~。