「実行ファイルは機械語だから読めない。大丈夫」そう思っている人はいませんか?
逆アセンブラという機械語を読む作業をしなくても、バイナリエディタを使う事で誰でも簡単にある程度のデータが見えてしまいます。
例えば
#include <stdio.h>
int main(){
char str[5][64]={
"1面のパスワードはAAAAA",
"2面のパスワードはBBBBB",
"3面のパスワードはCCCCC",
"4面のパスワードはDDDDD",
"5面のパスワードはEEEEE",
};
return 0;
}
このように、ユーザーから見えてはいけないデータを文字列で直に持っているとしましょう。
これをコンパイルした時に出来た実行ファイルをバイナリエディタで見てみます。
なんと完全に見えてしまいます。
これではパスワードの意味を成しませんね。
また、Debugコンパイルをすると・・・
ユーザー名が入ってしまったり、思わぬところから情報が漏れます。
(コンパイル方法にはDebugとReleaseがあります。詳しくはこちらをご覧ください)
しかし文字コードは1つでも違うとさっぱり分からない文字になります。
先ほど代入していた文字列の文字コードを1バイトずつ増やして代入してみましょう。
#include <stdio.h>
#include <string.h>
int main(){
char str[5][64]={
{50,-105,-53,-125,-51,-124,113,-124,89,-124,-112,-126,92,-124,105,-125,-50,66,66,66,66,66,},
{51,-105,-53,-125,-51,-124,113,-124,89,-124,-112,-126,92,-124,105,-125,-50,67,67,67,67,67,},
{52,-105,-53,-125,-51,-124,113,-124,89,-124,-112,-126,92,-124,105,-125,-50,68,68,68,68,68,},
{53,-105,-53,-125,-51,-124,113,-124,89,-124,-112,-126,92,-124,105,-125,-50,69,69,69,69,69,},
{54,-105,-53,-125,-51,-124,113,-124,89,-124,-112,-126,92,-124,105,-125,-50,70,70,70,70,70,},
};
for( int i=0; i<5; i++ ){
printf("%s\n",str);
}
return 0;
}
実行結果
2陵οбШю・・πBBBBB
2陵οбШю・・πCCCCC
2陵οбШю・・πDDDDD
2陵οбШю・・πEEEEE
2陵οбШю・・πFFFFF
バイナリエディタからも見つけられなくなりました。
このように文字コードを特定の数だけずらすことで暗号化する方法をシーザー暗号といって、手軽で割と確実なので良く使われます。
とは言え、本当に解析しようとする人からしたらシーザー暗号はいとも簡単に解ける暗号化なので、他の暗号化が必要になります。
暗号化についてはまた別の章で紹介しますが、今回のような内容であればシーザー暗号で問題無いでしょう。
- Remical Soft -