2

ある種の基本的なファイル暗号化を探していると思いますが、どこから始めればよいかわかりません。

どこから始めればよいか教えてくれる人、あるいはコードを提供してくれる人を探しています。

現在、データを一般的なテキスト ファイルに保存するゲームを作成しました。もちろん、これは変更したい人なら誰でも変更できます。

私が必要としているのは、ゲーム外で編集することが不可能ではないにしても難しい整数と文字列を格納できるファイルを作成することです。

私の検索では、.dat ファイルに出くわしましたが、探しているものよりも複雑に見えました。

すべての助けに感謝します、アレックス。

4

4 に答える 4

2

データを ByteBuffer に書き込んでから、単純なアルゴリズムでデータを歪めることができます。たとえば、保存するデータが String 配列であると仮定すると、次のように実行できます。

String[] data; // the data you want to save
int byteLength = 0;
byte[][] bytes = new byte[data.length][];

// Calculate the length of the content.
for(int i=0; i<data.length; i++) {
    bytes[i] = data[i].getBytes();
    byteLength += bytes[i].length;
    byteLength += 4; // this is for an integer, which is for the length of the String
}

// Transfer the content to a ByteBuffer object
ByteBuffer buffer = ByteBuffer.allocate(byteLength);
for(int i=0; i<bytes.length; i++) {
    // Put the length of the current byte array
    buffer.putInt(bytes[i].length);
    for(int j=0; j<bytes[i].length; j++) {
        // Reverse the byte so that it can't be understood
        buffer.put((byte)(~bytes[i][j])); 
    }
}

すべてのコンテンツを ByteBuffer オブジェクトに書き込んだ後、結果のバイト配列を取得してファイルに書き出すことができます。

FileOutputStream fos = new FileOutputStream("YourFileName.anyExtension");
fos.write(buffer.array());
fos.close();

ファイルを読み戻すときは、最初にバイト配列として読み取るデータの長さである整数を読み取る必要があります。次に、このバイト配列を読み取る必要があります。

FileInputStream fis = new FileInputStream("YourFileName.anyExtension");
DataInputStream dis = new DataInputStream(fis);
ArrayList<String> list = new ArrayList<String>();
byte[] bytes;
while(dis.available()) {
    int length = dis.readInt();
    bytes = new byte[length];
    for(int i=0; i<length; i++) {
        // Those bytes were reversed, right?
        bytes[i] = (byte)(~dis.readByte());
    }
    // Convert byte array to String
    String str = new String(bytes);
    list.add(str);
}

これで、String データの ArrayList ができました。

もちろん、これは最良、最も安全、最速のアルゴリズムではありません。いつでもより速く検索または作成できます。しかし、これはそのようなことをする良い例だと思います。

于 2012-08-09T23:25:28.667 に答える
0

Java を使用している場合は、Serializable を実装するクラスを試して作成することができます。この方法では、すべてのメタ情報を内部に格納してオブジェクトを作成し、それをシリアル化し、ロードしたいときに再度逆シリアル化することができます。

ただし、逆シリアル化するには、それが作成されたクラスを知っているだけでよいため、あまり安全ではありません。しかし、それは始めるためのものです。

于 2012-08-09T23:09:31.920 に答える
0

デジタル署名、特に HMAC を調べます。これらはまさにあなたが必要としているものであり、Java Crypto フレームワークは物事をかなり簡単にするはずです。関連する可能性のある SO エントリは次のとおりです: How to generate an HMAC in Java equal to a Python example?

于 2012-08-09T23:10:29.283 に答える
0

ファイル書き込みストリームをCipherOutputStream

ランダムな文字列や数値などを生成します。そのバイト配列を取得し、キーを生成し、それを使用してファイルを暗号化します。

    byte password[] = (WHAT YOUR WANT. STRING, NUMBER, etc.).getBytes();
    DESKeySpec desKeySpec;
    try {

        desKeySpec = new DESKeySpec(password);
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
        SecretKey key = keyFactory.generateSecret(desKeySpec);

        Cipher desCipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
        desCipher.init(Cipher.ENCRYPT_MODE, key);

        // Create stream
        FileOutputStream fos = new FileOutputStream("Your file here");
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        CipherOutputStream cos = new CipherOutputStream(bos, desCipher);
    }

これで、次を使用してファイルに書き込むことができますcos

ファイルの読み取りは、SecretKeyオブジェクトを使用して同じ方法で行われます

SecretKey key = loadKey(); // Deserialize your SecretKey object
try {
            Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
            cipher.init(Cipher.DECRYPT_MODE, key);
            FileInputStream fis = new FileInputStream("Your file here");
            BufferedInputStream bis = new BufferedInputStream(fis);
            CipherInputStream cis = new CipherInputStream(bis, cipher);

今、あなたは使用して読むことができますcis

欠点は、オブジェクトを保持する必要があることですSecretKey(シリアル化するか何か)、低レベルのハッカーがデータを取得することは問題になりません(キーはデバイスに保存されるため)が、単に変更することはできませんテキストエディタを使用してデータを編集します。

于 2012-08-09T23:20:07.277 に答える