วิธีเข้ารหัสไฟล์โดยไม่ใช้กุญแจ [ปิด]


21

สมมติว่าฉันสร้างโปรแกรมอย่างง่ายที่ใช้ไฟล์.datที่เข้ารหัสในรูปแบบ Binaryจากนั้นฉันถอดรหัสลงในอาร์เรย์ไบต์แล้วทุกอย่างจะถูกเขียนใหม่อีกครั้งลงในไฟล์ที่ถอดรหัส

ตัวอย่างเช่น:

ฉันได้สร้างอัลกอริทึมการเข้ารหัสแบบไบนารี => 0100100001100101001000000110100001100101011000 ...

แต่มันง่ายมากในการถอดรหัส ...

มีวิธีใดบ้างที่เป็นไปได้ถ้าไม่จำเป็นต้องใช้กุญแจในการเข้ารหัสความคืบหน้าการบันทึกของฉัน


15
คุณแน่ใจหรือว่าต้องการเข้ารหัสบันทึก มีวิธีที่ง่ายกว่าในการโกงเช่นเมื่อใช้การปรับเปลี่ยนหน่วยความจำ ฉันแค่อัดมันด้วย zlib (ใส่ลงใน. gz) มันจะลดขนาดและป้องกันไม่ให้คนขี้โกงที่เป็นไปได้แก้ไขมัน
HolyBlackCat

36
nitpicking: สิ่งที่คุณกำลังทำคือการเข้ารหัสที่ไม่เข้ารหัส
Philipp

13
(สมมติว่านี่สำหรับผู้เล่นคนเดียว) อย่าพยายามป้องกันการโกงในเกมผู้เล่นคนเดียวมันน่ารำคาญสำหรับคุณและผู้เล่น และในที่สุดก็ไร้ประโยชน์

6
มันเป็นไปไม่ได้ในการเข้ารหัสไฟล์ที่บันทึกเพื่อให้ผู้ใช้ไม่สามารถอ่านหรือแก้ไขได้ (เพราะเช่นพวกเขาสามารถหยุดเกมของคุณชั่วคราวในดีบักเกอร์ทันทีหลังจากทำการถอดรหัส!) อย่างไรก็ตามคุณสามารถทำให้มันยากขึ้น (เพราะการเปิดไฟล์ข้อความธรรมดานั้นง่ายมากเมื่อเทียบกับการหาช่วงเวลาที่เหมาะสมเพื่อหยุดเกมชั่วคราวในตัวดีบั๊ก) นั่นคือสิ่งที่คุณพยายามจะทำ?
253751

6
@DanielBejar ฉันเพิ่งบอกคุณว่าคุณไม่สามารถทำให้เป็นไปไม่ได้คุณทำได้ยากขึ้นเท่านั้น
user253751

คำตอบ:


77

โดยทั่วไปคุณไม่ควรคิดค้นอัลกอริทึมการเข้ารหัสลับของคุณเองเว้นแต่ว่าคุณจะมีปริญญาเอกอย่างน้อยทั้งคณิตศาสตร์และวิทยาศาสตร์คอมพิวเตอร์ แต่มีอัลกอริทึมสต็อคที่ดีจำนวนมากซึ่งไม่มีการโจมตีที่รู้จักและมีการใช้งานฟรีในหลายภาษาโปรแกรม ตัวอย่างเช่น RC5, AES หรือ Blowfish ขึ้นอยู่กับเทคโนโลยีที่คุณใช้ในการพัฒนาเกมของคุณมันอาจเสนอการเข้ารหัสที่ปลอดภัยนอกกรอบ

อย่างไรก็ตามคำถามคือหากการเข้ารหัส savegames เป็นความคิดที่ดี

ขั้นแรกเมื่อคุณมีเกมที่ปฏิบัติการได้ของคุณทำการเข้ารหัสและถอดรหัสคุณจะต้องรวมทั้งอัลกอริทึมและกุญแจในเกมของคุณ นั่นหมายถึงแฮ็กเกอร์ที่ถูกกำหนดสามารถค้นหาแยกและใช้เพื่อสร้างตัวแก้ไข savegame ดังนั้นมันจึงไม่สามารถปลอดภัยได้ 100%

ประการที่สองทำไมคุณถึงต้องการทำเช่นนี้? เมื่อเป็นเกมออนไลน์คุณควรจัดเก็บเกมออนไลน์ไว้โดยที่ผู้เล่นไม่สามารถแก้ไขได้ เมื่อมันเป็นเกมออฟไลน์ทำไมต้องรำคาญ? สิบแปดมงกุฎสามารถทำร้ายประสบการณ์การเล่นเกมของตัวเองได้อย่างแย่ที่สุด ผู้เล่นที่ซื่อสัตย์ที่ต้องการสนุกกับเกมของคุณตามที่ตั้งใจไว้จะไม่ได้รับผลกระทบใด ๆ จากเรื่องนี้ ในทางกลับกันการอนุญาตให้ผู้เล่นโกงสามารถเพิ่มคุณค่าให้กับเกมของคุณ ช่วยให้ผู้เล่นได้สัมผัสกับเกมในรูปแบบที่แตกต่างกันซึ่งสามารถเพิ่มความเพลิดเพลินในระยะยาวของเกม


5
แม้ว่าฉันจะไม่สามารถจินตนาการได้ว่ามีใครบางคนกำลังคิดอะไรบางอย่างที่ดีในเวลาไม่กี่ชั่วโมง และคุณจะสูญเสียทรัพยากรในสิ่งที่คุณอาจไม่ต้องการ
Aistis

6
"เมื่อมันเป็นเกมออฟไลน์ทำไมต้องรำคาญ" เกิดอะไรขึ้นถ้ามันเป็นเกมที่มีผู้เล่นคนเดียวที่มีคะแนนสูงสุดออนไลน์
The Guy with The Hat

19
"การอนุญาตให้ผู้เล่นโกงสามารถเพิ่มคุณค่าให้กับเกมของคุณ" - เพิ่มขึ้นสำหรับคำสั่งนี้ ฉันรู้สึกรำคาญกับเกมที่ตัดสินใจล็อคประสบการณ์บางส่วนที่ฉันจ่ายไปจนกว่าจะได้ระดับผู้เชี่ยวชาญและฉันดีใจที่ในกรณีเหล่านี้มีกลโกงเพื่อปลดล็อกเกมเต็มรูปแบบ ยกตัวอย่างเช่นฉันหายไปโดยสิ้นเชิงในการแข่งทัวร์นาเมนต์กับ AI ในเก่าNeed for Speedส่วน; สำหรับฉันแล้วความเพลิดเพลินในการขับรถผ่านภูมิประเทศที่หลากหลายดังนั้นฉันมักจะข้ามการแข่งและปลดล็อกแผนที่และรถยนต์ทั้งหมด เกมที่ป้องกันสิ่งนี้จะทำให้ฉันรำคาญใจ
หรือผู้ทำแผนที่

6
ฉันต้องการ "ถ้าคุณมีปริญญาเอกอย่างน้อยทั้งคณิตศาสตร์และวิทยาศาสตร์คอมพิวเตอร์" เขียนใหม่เป็น "เว้นแต่ว่าคุณมีความรู้อย่างน้อยที่จะต้องได้รับปริญญาเอกทั้งในวิชาคณิตศาสตร์และวิทยาศาสตร์คอมพิวเตอร์" (และอย่างน้อยก็อย่างนั้น ในเยอรมนีหลักสูตรมักเต็มไปด้วยเนื้อหาที่ไม่เกี่ยวข้องกับ crypto) หนึ่งไม่จำเป็นต้องมีปริญญาเพื่อมีประสิทธิภาพสูงกว่าปริญญาเอก
phresnel

5
@phresnel ในขณะที่คุณพูดถูกเทคนิคปริญญาเอกเป็นตัวชี้วัดมาตรฐานของความเชี่ยวชาญในวิชาทฤษฎีที่ได้รับรางวัลจากสถาบันที่เชื่อถือได้ ดังนั้นจึงเหมาะสมที่จะใช้เป็นชวเลขสำหรับจำนวนความรู้และทักษะที่จำเป็นสำหรับการเรียนระดับปริญญาเอก กล่าวอีกนัยหนึ่ง: ความหมายของ OP หมายถึงอะไรที่ชัดเจนพอ :-)
Tobia

10

ในการเข้ารหัสและถอดรหัสในพื้นที่คุณจะต้องเก็บรหัสไว้ในโปรแกรมของคุณดังนั้นผู้คนจะสามารถถอดรหัสได้หากพวกเขาแยกรหัสของคุณ มีเทคนิคในการทำให้งงงวยกุญแจ แต่ถึงแม้จะมีผู้โจมตีโดยเฉพาะจะพบกุญแจแล้วโพสต์แบบออนไลน์สำหรับทุกคนที่มีความทุ่มเทน้อยกว่าที่จะเห็น สิ่งเดียวที่ป้องกันการเข้ารหัสคือผู้ที่ใช้โปรแกรมแก้ไขฐานสิบหก - คุณสามารถทำลายไฟล์นั้นด้วยการบีบอัดและสิ่งใดก็ตามที่ทำให้ไฟล์อ่านไม่ได้ด้วยโปรแกรมเปิดเครื่องรูด เช่นเพิ่มหนึ่งไบต์ต่อหน้าข้อมูล

หรือคุณสามารถต่อท้าย md5 ของ savefile ที่ท้ายไฟล์ดังนั้นคุณจะสังเกตเห็นว่าไฟล์ถูกแก้ไข จากนั้นคุณสามารถใช้สิ่งนี้เพื่อปฏิเสธการโหลดเกมหรือตั้งค่าสถานะตั๋วการสนับสนุนอย่างเหมาะสมเพื่อให้คุณไม่ต้องเสียเวลากับปัญหาที่เกิดจากการบันทึกเกมด้วยตนเอง อีกครั้งนี่เป็นเรื่องเล็กน้อยที่จะหลีกเลี่ยงใครก็ตามที่สามารถอ่านรหัสของคุณได้

หากคุณต้องการบางสิ่งที่ไม่สามารถหลีกเลี่ยงได้โดยบุคคลที่สามารถเข้าถึงไบนารีในอุปกรณ์ของพวกเขาคุณต้องเรียกใช้บางส่วนของโปรแกรมบนเซิร์ฟเวอร์ซึ่งอยู่ภายใต้การควบคุมของคุณ

ในการตอบคำถามสุดท้ายของคุณคีย์บวกประเภทการเข้ารหัสเพียงระบุอัลกอริทึมที่แน่นอนซึ่งจำเป็นต้องใช้กับการเข้ารหัส / ถอดรหัส คุณไม่สามารถเข้ารหัส / ถอดรหัสข้อมูลโดยไม่มีอัลกอริทึมที่กำหนดวิธีการดังกล่าว


ประเด็นที่สองของคุณดีมาก นอกจากนี้ยังสามารถช่วยติดตามปัญหาในกรณีที่ไฟล์เสียหาย
knowledge_is_power

4

เก็บแฮช SHA256 ที่แปลงสภาพของข้อมูลบันทึกจริงในไฟล์บันทึก

เปรียบเทียบแฮชที่เก็บไว้กับค่า SHA256 ของข้อมูลเมื่อคุณโหลด

หากไม่ตรงกับที่พวกเขาโกงหรือเสียหายไฟล์

แก้ไขเพื่อชี้แจง:นี้จะทำให้มันยากขึ้นที่จะแตกระบบป้องกันการโกง แต่คงเป็นไปได้


7
ไม่มีอะไรหยุดผู้คนจากการคำนวณค่าแฮชอีกครั้งหลังจากทำการแก้ไข นอกจากนี้ฉันไม่เข้าใจว่าทำไมยังมีคนที่สนับสนุนอัลกอริทึม MD5 ที่เสียด้วยจุดอ่อนการเข้ารหัสที่รู้จักทั้งหมดเมื่อมีทางเลือกที่ดีกว่าเช่น SHA-256 (สำหรับลายเซ็น) หรือ bcrypt (สำหรับรหัสผ่าน)
Philipp

1
ง่ายรวดเร็วและเสียอย่างสมบูรณ์
DeadMG

2
@DeadMG มันถูกทำลายเนื่องจากการออกแบบเนื่องจากผู้ใช้มีการเข้าถึงไบนารีซึ่งจะต้องมีคีย์ การใช้แฮชที่แรงกว่าหรือการเข้ารหัสไฟล์ด้วย AES จะเป็นการสิ้นเปลืองทรัพยากรและการออกแบบที่ไม่ดีเพราะมันไม่ได้เพิ่มความปลอดภัยแต่เพิ่มค่าใช้จ่าย +1 เนื่องจาก downvote นั้นไม่สมควร
ปีเตอร์ - ยกเลิกการห้ามโรเบิร์ตฮาร์วีย์

7
@Phippipp เพราะในกรณีนี้ MD5 นั้นเหนือกว่า SHA-256 อย่างชัดเจน สิ่งที่ต้องการโดยวิธีการที่อธิบายไว้คืออัลกอริธึมการตรวจสอบราคาถูกซึ่งเป็นสิ่งที่ MD5 ต้องการ
ปีเตอร์ - Unban Robert Harvey

3
@ transistor09 ถ้าเป็นฝั่งไคลเอ็นต์ล้วน ๆ เราไม่สามารถรับประกันได้ว่าจะมีอะไรและการตรวจสอบการทำงานเช่นเดียวกับการมีลูกค้าเข้ารหัสทุกสิ่ง วิธีใดก็สามารถแตกได้
Lolums

1

ฉันจะใช้อัลกอริธึมการเข้ารหัสมาตรฐาน (เพราะทำให้ยากต่อการวิเคราะห์ crypto ในไฟล์ที่บันทึกไว้) แต่ไม่ใช่หนึ่งในห้าอันดับแรกที่ใช้มากที่สุดและซ่อนไว้ในรหัสของคุณ (เพราะทำให้ยากที่จะเข้าใจอัลกอริธึมอะไร คือและที่เป็นกุญแจสำคัญ)

ในการซ่อนอัลกอริธึมการเข้ารหัสไว้ในรหัสของคุณ: นำเวอร์ชั่นโอเพ่นซอร์สให้เข้าใจโฟลว์ของมัน (ฟังก์ชั่นที่เรียกคนอื่นว่าเป็นลำดับใด) จากนั้นเปลี่ยนชื่อตัวแปรทั้งหมด struct ฟิลด์และชื่อฟังก์ชั่น ทั่ว codebase ของคุณในวัตถุที่แตกต่างกันและโมดูลอาจแยกการดำเนินการของพวกเขาชั่วคราวเช่นกัน (ดำเนินการเข้ารหัสชิ้นหนึ่งแล้วทำอย่างอื่นแล้วหลังจากที่ ms บางคนกลับมาจากชิ้นส่วนของรหัสที่ไม่เกี่ยวข้อง ของการเข้ารหัสและอื่น ๆ .) คีย์สามารถซ่อนในลักษณะเดียวกันเนื่องจากจำนวนของค่าคงที่ที่ไม่เกี่ยวข้องดูเหมือนจะตลอดคลาสของคุณที่เข้าถึงได้ในขณะรันไทม์โดยส่วนต่าง ๆ ของอัลกอริทึมการเข้ารหัส

ไม่ว่าทั้งหมดนี้ทำให้รู้สึกประหยัดเป็นหัวข้ออื่นโดยสิ้นเชิง


ฉันไม่รู้ ... ทำให้มันยากขึ้นสำหรับแค่เกม ... แต่ขอบคุณสำหรับความช่วยเหลือ! ฉันจะพยายามอย่างดีที่สุด!
Daniel Béjar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.