1

ゲーム内のデータの暗号化/復号化にxxteaを使用したいと考えています。

ライブラリの使用例は次のとおりです。

#include <stdio.h>
#include <string.h>
#include <xxtea.h>

int main() {
    const char *text = "Hello World! 你好,中国!";
    const char *key = "1234567890";
    size_t len;
    unsigned char *encrypt_data = xxtea_encrypt(text, strlen(text), key, &len);
    char *decrypt_data = xxtea_decrypt(encrypt_data, len, key, &len);
    if (strncmp(text, decrypt_data, len) == 0) {
        printf("success!\n");
    }
    else {
        printf("fail!\n");
    }
    free(encrypt_data);
    free(decrypt_data);
    return 0;
}

では、キー自体を安全に保管するにはどうすればよいでしょうか。

4

5 に答える 5

12

@ArtjomBが指摘しているように、キーをプログラムに入れないようにして、キーを安全に保ちます。起動時に、許可されたユーザーまたはセキュリティ デバイスがキーを提供する必要があります。

そのように見えないものは、もはや暗号化やセキュリティではなく、ある種の難読化です。難読化 (または「DRM」) は、どれだけの労力を費やすか、それを解読することにどれだけの関心があるかに応じて、役に立たないか、ある程度効果的である可能性があります。新しい攻撃が発生したときに、これを改善するための継続的な予算はどれくらいですか? 予想される攻撃者の巧妙さは?

Apple (一例として) は、ハードウェア、ファームウェア、および OS を非常に厳密に管理しており、常にそれを改善することに専念するチームを持っています。iPhone は通常、新しいリリースから数週間から数か月以内にジェイルブレイクされます。魅力的なターゲットの最良のシナリオを考慮する必要があります。

「えーと、午後に何をまとめれば、足首を噛むのを止めることができますか?」と考えている場合。頭に浮かぶことは何でもします。他のハードコードされた値と XOR します。多分それをビットシフトするか何か。気にする人に対してはあまり役に立ちませんが、最もカジュアルな攻撃者を阻止し、少なくとも時間とお金を無駄にすることはありません.

そこからステップアップして、プラットフォームの組み込みソリューションを見てください。OS アシスタンスは大きな助けになります。特に、WindowsのSLP サービスを見てください。Mac App Store を使用している場合、Mac はライセンス強制を提供します。または、独自のソリューションを持つ eSellerate のような商用ベンダーを見ることもできます。SafeNet にはいくつかの製品があります。もちろん、これらすべてを打ち負かすことができます (そして、通常は打ち負かすことができます)。しかし、彼らはあなたが数日間で開発しようとしているものよりもはるかに強力です.

StackOverflowから得た特定のアプローチは、定義上、役に立たないでしょう。難読化が行われている唯一のことは、その詳細が秘密であることです. 仕組みを知っていれば、それを打ち負かすことができます。それが暗号化との違いです。優れた暗号化は、攻撃者がアルゴリズム全体を知っている場合でも、同じように強力になるように設計されています。そのため、難読化技術は独自のものです。彼らはほとんどそうでなければなりません。つまり、(a) お粗末なものをすぐに作成するか、(b) 多くの時間とお金を費やして少しだけお粗末なものを作成するか、または (c) かなり多くのお金を費やして多少の-これらのことを専門とするベンダーからのまずまずのもの。

(StackOverflow でこの質問をしている場合、自分で良いものを構築する可能性はまったくありません。自分でいくつかのプログラムをクラックしていない場合は、何かを構築して停止する立場にはありません。その他)

于 2015-12-17T19:41:15.607 に答える
3

最適な難読化は、実行時にキーを計算することです。たとえば、「Press any key...」や「Error loading file」などのシステム文字列で SHA1 または MD5 を計算できます。次に、ハッシュを XXTEA キーとして使用します。

于 2015-12-17T19:43:01.077 に答える
3

それはできません。ほとんどの場合、できることは、キーを壊したり、単語を分割したり、分割したり、ミックスしたり、ビットシフトしたり、xor したりすることです。しかし、非常に意欲的なハッカーがコードをリバース エンジニアリングしてキーを取得するのを防ぐことはできません。

この場合の最適なソリューションは、ホワイト ボックス暗号化と呼ばれます: https://en.wikipedia.org/wiki/Obfuscation#White_box_cryptography

アイデアは、同じ結果を返すことで関数decrypt(cypher, key)を置き換える、暗号化用にパーソナライズされたバイナリ コードを生成するようなものです。whitebox_decrypt(cypher)2 番目の関数whitebox_decryptにはキー自体は含まれていませんが、元の復号化関数と同じ結果をもたらすパーソナライズされたアルゴリズムが含まれています。繰り返しますが、すべてのことをリバース エンジニアリングすることはできますが、非常に難しいため、誰もそうする気にはなりません。

ただし、これは通常非常に高価なものです。無料の良さがわからない。DRM コンテンツを保護するために非常に使用されます。

于 2015-12-17T19:40:52.577 に答える
1

これは簡単ではありません。少し前に似たような回答をしました。状況が許せば、ユーザーが入力するパスワードを使用してキーを暗号化し、暗号化されたキーをどこかに保存することができます。

次に、キーが必要な場合は、パスワードを入力し、キーを復号化して使用できます。

このようにして、キーが暗号化された形式で保存されている間、誰かがそれが何であるかを知ることを恐れることはありません.

于 2015-12-17T19:38:05.087 に答える
1

暗号化キーは秘密です (これは、知っておくべき人だけが知っていることを表す専門用語です)。

プログラムにシークレットを保存することは、それを紙に書き留めて、世界中のすべての人にファックスすることと同じです。

つまり、もう秘密ではありません。

キーを秘密にしておく方法は、ユーザーにキーの入力を要求し、復号化を実行したらキーのすべての痕跡を削除することです。

于 2015-12-17T19:41:12.950 に答える