Katakanlah saya membuat program sederhana yang mengambil file .dat
yang dienkripsi dalam Binary Format , lalu saya mendekripsi menjadi array byte dan kemudian semuanya ditulis ulang lagi ke dalam file yang didekripsi.
Sebagai contoh:
Saya telah membuat algoritma enkripsi biner. => 0100100001100101001000000110100001100101011000 ...
Tapi ini sangat sangat mudah untuk didekripsi ...
Apakah ada cara, bahwa, jika mungkin tidak memerlukan kunci apa pun, untuk mengenkripsi progres save saya?
encryption
binary
Daniel Béjar
sumber
sumber
Jawaban:
Secara umum Anda tidak boleh menemukan algoritma kriptografi Anda sendiri, kecuali jika Anda memiliki setidaknya PhD dalam matematika dan ilmu komputer. Tetapi ada banyak algoritma persediaan yang baik yang tidak memiliki serangan yang diketahui dan memiliki implementasi gratis dalam banyak bahasa pemrograman. Misalnya RC5, AES atau Blowfish. Bergantung pada teknologi yang Anda gunakan untuk mengembangkan game Anda, itu mungkin bahkan menawarkan enkripsi aman out-of-the-box.
Namun, pertanyaannya adalah apakah mengenkripsi savegame adalah ide yang bagus.
Pertama, ketika Anda membuat game Anda dapat dieksekusi melakukan enkripsi dan dekripsi, Anda harus menyertakan algoritma dan kunci dalam game Anda yang dapat dieksekusi. Itu berarti peretas yang gigih dapat menemukan mereka, mengekstraknya, dan menggunakannya untuk membangun editor savegame. Jadi tidak akan pernah bisa 100% aman.
Kedua, mengapa Anda tetap ingin melakukan ini? Ketika ini adalah game online, Anda harus menyimpan gamestate online di mana para pemain tidak dapat memodifikasinya. Ketika itu adalah game offline, lalu mengapa repot-repot? Seorang penipu hanya bisa melukai pengalaman gim mereka sendiri paling buruk. Para pemain jujur yang ingin menikmati permainan Anda sebagaimana dimaksud tidak akan terpengaruh oleh ini sama sekali. Di sisi lain, mengizinkan pemain untuk menipu dapat menambah nilai pada gim Anda. Hal ini memungkinkan pemain untuk mengalami permainan dengan cara yang berbeda yang hanya dapat meningkatkan kesenangan jangka panjang dari permainan Anda.
sumber
Untuk mengenkripsi dan mendekripsi secara lokal, Anda perlu menyimpan kunci dalam program Anda, sehingga orang-orang akan dapat memecahkan enkripsi jika mereka membongkar kode Anda. Ada trik untuk mengaburkan kunci, tetapi bahkan dengan penyerang yang berdedikasi akan menemukan kunci dan kemudian mempostingnya secara online untuk semua orang yang kurang berdedikasi untuk melihat. Satu-satunya hal yang tidak dicegah oleh enkripsi adalah orang yang menggunakan hex editor - Anda dapat dengan mudah menggagalkannya dengan kompresi dan apa pun yang membuat file tidak dapat dibaca oleh program unzip. Misalnya menambahkan satu byte di depan data.
Atau Anda dapat menambahkan md5 dari savefile di akhir file, jadi Anda akan melihat jika file telah dirusak. Anda kemudian dapat menggunakan ini untuk menolak memuat savegame, atau untuk menandai tiket dukungan secara tepat sehingga Anda tidak membuang waktu untuk masalah yang disebabkan oleh savegame yang dimodifikasi secara manual. Sekali lagi, ini mudah untuk dielakkan oleh siapa saja yang dapat membaca kode Anda.
Jika Anda menginginkan sesuatu yang tidak dapat dielakkan oleh seseorang yang memiliki akses ke binari pada perangkat mereka, Anda perlu menjalankan sebagian program di server, yang berada di bawah kendali Anda.
Untuk menjawab pertanyaan terakhir Anda, kunci dan tipe enkripsi hanya mengidentifikasi algoritma yang tepat yang perlu diterapkan untuk mengenkripsi / mendekripsi. Anda tidak dapat mengenkripsi / mendekripsi data tanpa algoritme yang menetapkan cara melakukannya.
sumber
Menyimpan hash SHA256 yang telah diubah dari data penyimpanan aktual dalam file simpan.
Bandingkan hash yang disimpan dengan nilai SHA256 data saat Anda memuatnya.
Jika itu tidak cocok, mereka telah menipu atau merusak file.
Sunting untuk memperjelas: ini membuatnya lebih sulit untuk memecahkan sistem anti-cheat tetapi masih memungkinkan .
sumber
Saya akan menggunakan algoritma enkripsi standar (karena membuatnya lebih sulit untuk melakukan analisis kripto pada file yang disimpan) tetapi bukan salah satu dari lima teratas yang paling banyak digunakan, dan menyembunyikannya di seluruh kode Anda (karena itu membuat lebih sulit untuk memahami algoritma apa itu adalah dan di mana kuncinya.)
Untuk menyembunyikan algoritma enkripsi ke dalam kode Anda: ambil versi open source, pahami alirannya (yang memanggil orang lain dengan urutan apa), lalu ganti nama semua variabel, bidang bidang, dan nama fungsi (hanya untuk memastikan) dan sebarkan fungsinya di seluruh basis kode Anda, dalam objek dan modul yang berbeda, mungkin memisahkan eksekusi mereka untuk sementara juga (melakukan satu bagian enkripsi, kemudian melakukan sesuatu yang lain, kemudian setelah beberapa ms kembali ke sana dari sepotong kode yang tampaknya tidak terkait dan melakukan fase lain enkripsi, dan sebagainya.) Kuncinya dapat disembunyikan dengan cara yang sama, karena sejumlah konstanta yang tampaknya tidak terkait di seluruh kelas Anda, yang diakses saat runtime oleh berbagai bagian tersembunyi dari algoritma enkripsi.
Apakah semua ini masuk akal secara ekonomis adalah topik lain.
sumber