Bagaimana cara mengenkripsi Simpan File tanpa menggunakan kunci? [Tutup]


21

Katakanlah saya membuat program sederhana yang mengambil file .datyang 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?


15
Anda yakin ingin mengenkripsi penyimpanan? Ada cara yang lebih mudah untuk menipu, misalnya saat menggunakan modifikasi memori. Saya hanya akan memampatkan mereka dengan zlib (memasukkannya ke .gz), itu akan mengurangi ukuran dan mencegah beberapa kemungkinan curang mengubahnya.
HolyBlackCat

36
Nitpicking: Apa yang Anda lakukan adalah penyandian , bukan penyandian .
Philipp

13
(dengan asumsi ini adalah untuk pemain tunggal) Jangan mencoba untuk mencegah kecurangan dalam permainan pemain tunggal, itu mengganggu bagi Anda dan pemain. Dan pada akhirnya tidak berguna.

6
Hal ini tidak mungkin untuk mengenkripsi menyimpan file sehingga pengguna tidak dapat membaca atau memodifikasi mereka. (Karena, misalnya, mereka bisa menjeda game Anda di debugger segera setelah itu melakukan dekripsi!). Namun, Anda dapat membuatnya lebih sulit (karena membuka file teks biasa sangat mudah dibandingkan dengan menemukan momen yang tepat untuk menghentikan game dalam debugger). Itukah yang kamu coba lakukan?
user253751

6
@DanielBejar Saya baru saja mengatakan kepada Anda, Anda tidak bisa membuatnya mustahil, Anda hanya bisa membuatnya lebih sulit.
user253751

Jawaban:


77

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.


5
Meskipun aku tidak bisa membayangkan seseorang menghasilkan sesuatu yang baik dalam beberapa jam. Dan Anda akan membuang-buang sumber daya untuk sesuatu yang mungkin tidak Anda butuhkan.
Aistis

6
"Ketika itu adalah game offline, lalu mengapa repot-repot?" Bagaimana jika itu adalah permainan pemain tunggal dengan skor tinggi online?
The Guy with The Hat

19
"Mengizinkan pemain untuk menipu dapat menambah nilai ke gim Anda" - terunggah untuk pernyataan ini. Saya benar-benar terganggu oleh permainan yang memutuskan untuk mengunci bagian dari pengalaman yang saya bayarkan sampai saya mencapai tingkat penguasaan tertentu, dan saya senang bahwa dalam kasus ini, ada cheat yang tersedia untuk membuka kunci permainan penuh. Sebagai contoh, saya benar-benar tersesat di turnamen balap melawan AI di Need for Speed parts; bagi saya, kenikmatannya agak dalam berkendara melalui beragam pemandangan, oleh karena itu saya biasanya melewatkan balap dan membuka semua peta dan mobil. Gim yang mencegah ini hanya akan mengganggu saya.
ATAU Mapper

6
Saya ingin "kecuali Anda memiliki setidaknya PhD dalam matematika dan ilmu komputer" ditulis ulang sebagai "kecuali Anda memiliki setidaknya pengetahuan yang diperlukan untuk mendapatkan PhD dalam matematika dan ilmu komputer" (dan bahkan kemudian, setidaknya di Jerman, kursus sering penuh dengan hal-hal yang tidak terkait dengan crypto). Seseorang secara inheren tidak membutuhkan gelar untuk mengungguli PhD.
phresnel

5
@phennel Meskipun secara teknis Anda benar, gelar PhD adalah metrik standar penguasaan seseorang atas subjek teoretis, seperti yang diberikan oleh institusi tepercaya. Jadi masuk akal untuk menggunakannya sebagai singkatan untuk jumlah pengetahuan dan keterampilan yang dibutuhkan untuk mencapai PhD. Dengan kata lain: apa yang dimaksud OP cukup jelas :-)
Tobia

10

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.


Poin kedua Anda bagus. Itu juga bisa membantu melacak masalah dalam kasus korupsi file.
knowledge_is_power

4

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 .


7
Tidak ada yang menghentikan orang untuk menghitung ulang hash setelah mereka melakukan modifikasi. Juga, saya tidak mengerti mengapa masih ada orang yang mendukung algoritma MD5 yang rusak dengan semua kelemahan kriptografik yang dikenal ketika ada alternatif yang jauh lebih baik seperti SHA-256 (untuk tanda tangan) atau bcrypt (untuk kata sandi).
Philipp

1
Sederhana, cepat, dan benar-benar rusak.
DeadMG

2
@DeadMG Ini rusak oleh desain, karena pengguna memiliki akses ke binari yang harus berisi kunci. Menggunakan hash yang lebih kuat atau mengenkripsi file dengan sesuatu seperti AES akan menjadi pemborosan sumber daya, dan desain yang buruk, karena tidak memberikan keamanan tambahan , tetapi menambah biaya. +1 karena downvote tidak pantas.
Peter - Unban Robert Harvey

7
@ Pilip karena dalam hal ini MD5 jelas lebih unggul daripada SHA-256. Apa yang diperlukan oleh pendekatan yang dijelaskan adalah algoritma checksum murah, yang persis seperti MD5.
Peter - Unban Robert Harvey

3
@ transistor09 jika ini murni sisi klien, kami tidak dapat memastikan apa pun dan sebuah checksum berfungsi sama baiknya dengan membuat klien mengenkripsi semuanya. Either way, itu bisa retak.
Lolums

1

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.


Saya tidak tahu ... Membuatnya lebih sulit hanya untuk permainan ... Tapi terima kasih atas bantuannya! Aku akan mencoba yang terbaik!
Daniel Béjar
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.