基本的に私は辞書を実装していますが、ユーザーが自分の辞書 .txt ファイルにアクセスすることを望んでいません。プログラムからファイルにアクセスする必要があります。txt ファイルが大きすぎるため、暗号化方式では復号化に時間がかかります。他にどのような方法がありますか?
4 に答える
あなたはほとんど不可能な仕事を自分自身に課しました。
「読み取り」のいくつかの定義によれば、プログラムにルックアップを要求するだけで、プログラムのすべてのユーザーがファイルを「読み取る」ことができます。
プログラム以外の方法でファイルへの読み取りアクセスを防ぎたい場合、唯一の効果的なオプションは、ファイルへの物理的なアクセスを拒否することです (サーバー上でホストし、その前にクエリのみを許可する API を配置することによって)。 . プログラムとデータ ファイルの両方にアクセスできる、知識が豊富で断固たるユーザーなら誰でも、それを解読することができます。データ ファイルを暗号化すると、これが非常に困難になる場合がありますが、キーがプログラムに組み込まれておらず、ユーザーが手動で入力する必要がある場合に限られます。次に、キーを持っている人だけが、データ ファイルを解読する合理的な可能性を持ちます。
バートの答えは完全に有効です。しかし、問題には解決策がある可能性があります。
辞書が実際に何をするかに応じて、ブルームフィルターまたは他の確率的ハッシュデータ構造を使用して、その内容を直接的な方法で保存することを回避できる場合があります。ただし、その場合、単語にアクセスすることはできず、単語が存在するかどうかを確認するだけです。
このような辞書は、プログラムにすべての可能な単語を照会することにより、攻撃に対して脆弱です。それは実行可能かどうかはわかりません。あなたが実際に何をしているのかは不明です。
多くの人がすでに気づいているように、100% の確率でユーザーからデータを保護することは不可能です。十分な時間があれば、十分に決心したユーザーなら誰でもそれに到達します。
ただし、ユーザーが辞書ファイルのデータを「台無し」にしないようにするための「簡単な」方法があります。バイナリ ファイル I/O を使用できます。
ofstream out("dictionary.dat",ios::binary);
out.write((char*) &your_data, sizeof(your_data));
そして、読むために、あなたは似たようなことをします:
ifstream in("dictionary.dat",ios::binary);
in.read((char*) &your_data, sizeof(your_data));
これは本当の意味での「暗号化」ではなく、人々がデータを「いじる」ことをより困難にする代替表現にすぎません。
また、ユーザーがデータ ファイルをいじらないか心配するよりも、ファイルが改ざんされていないかどうかを検出し (チェックサム、ファイル ハッシュなど)、読み込みを拒否する方法を実装する方が理にかなっています。
セキュリティを真剣に考えているのであれば、適切な長いキーの暗号化を使用する必要があります。[しかし、「鍵をどこに保管するか」に関するコメントを参照してください - これを安全に行うことはできません]。
ただし、ファイルをテキスト エディターで少し読みにくくしたいだけの場合は、なんらかの形式の単純な圧縮を使用することができます [スペースが少なくて済むという追加の利点があります]。バイトペア エンコーディングは、実装が簡単です。ハフマンコーディングはもう少し手間がかかります。gzip、bzip2、xz などの既存のエンコーディング技術を使用することは明らかであり、誰かが破るのがいくらか難しくないため、同じ保護特性はありません。
通常のユーザー (たとえば、コードの解読やソフトウェアへの侵入に精通していない人) を困難にすることが目的である場合は、単純な「ビット操作」でキーを保存します。文字を逆にするとchar ch = (orig_ch >> 4) | ((orig_ch & (1<<4)-1) << 4);
、通常のユーザーにはコンテンツがほとんど読めなくなります。