Làm cách nào để mã hóa Save Files mà không cần sử dụng khóa? [đóng cửa]


21

Giả sử tôi đã tạo một chương trình đơn giản lấy một tệp .datđược mã hóa ở Định dạng nhị phân , sau đó tôi giải mã nó thành một mảng byte và sau đó mọi thứ được viết lại vào tệp được giải mã.

Ví dụ:

Tôi đã thực hiện một thuật toán mã hóa nhị phân. => 0100100001100101001000000110100001100101011000 ...

Nhưng điều này rất dễ giải mã ...

Có cách nào không, nếu có thể, không cần bất kỳ loại khóa nào, để mã hóa tiến trình lưu của tôi?


15
Bạn có chắc chắn rằng bạn muốn mã hóa tiết kiệm? Có nhiều cách dễ dàng hơn để gian lận, ví dụ như khi sử dụng sửa đổi bộ nhớ. Tôi sẽ chỉ nén chúng bằng zlib (đặt chúng vào .gz), nó sẽ giảm kích thước và ngăn một số kẻ gian lận có thể sửa đổi nó.
HolyBlackCat

36
Nitpicking: Những gì bạn đang làm là một mã hóa , không phải là mã hóa .
Philipp

13
(giả sử điều này là dành cho một người chơi) Đừng cố gắng ngăn chặn gian lận trong một trò chơi một người chơi, điều đó gây khó chịu cho cả bạn và người chơi. Và cuối cùng là vô dụng.

6
Không thể mã hóa các tệp lưu để người dùng không thể đọc hoặc sửa đổi chúng. (Bởi vì, ví dụ, họ chỉ có thể tạm dừng trò chơi của bạn trong trình gỡ lỗi ngay sau khi giải mã!). Tuy nhiên, bạn có thể làm cho nó khó hơn (vì việc mở tệp văn bản đơn giản thực sự dễ dàng so với việc tìm đúng thời điểm để tạm dừng trò chơi trong trình gỡ lỗi). Đó có phải là những gì bạn đang cố gắng làm?
dùng253751

6
@DanielBejar Tôi vừa nói với bạn, bạn không thể làm điều đó là không thể, bạn chỉ có thể làm cho nó khó hơn.
dùng253751

Câu trả lời:


77

Nói chung, bạn không bao giờ nên phát minh ra các thuật toán mật mã của riêng mình, trừ khi bạn có ít nhất một tiến sĩ về cả toán học khoa học máy tính. Nhưng có nhiều thuật toán chứng khoán tốt mà không có cuộc tấn công nào được biết đến và có triển khai miễn phí trong nhiều ngôn ngữ lập trình. Ví dụ RC5, AES hoặc Blowfish. Tùy thuộc vào công nghệ bạn sử dụng để phát triển trò chơi của mình, nó thậm chí có thể cung cấp khả năng mã hóa an toàn bên ngoài.

Tuy nhiên, câu hỏi là nếu mã hóa lưu trữ là một ý tưởng tốt.

Đầu tiên, khi bạn có thể thực thi trò chơi của mình thực hiện mã hóa và giải mã, bạn phải bao gồm cả thuật toán và khóa trong thực thi trò chơi của mình. Điều đó có nghĩa là một hacker quyết tâm có thể tìm thấy chúng, giải nén chúng và sử dụng chúng để xây dựng một trình soạn thảo savegame. Vì vậy, nó không bao giờ có thể được an toàn 100%.

Thứ hai, tại sao bạn vẫn muốn làm điều này? Khi đó là một trò chơi trực tuyến, bạn nên lưu trữ trò chơi trực tuyến nơi người chơi không thể sửa đổi nó. Khi nó là một game offline thì sao phải bận tâm? Một kẻ lừa đảo chỉ có thể làm tổn thương trải nghiệm trò chơi của chính họ ở mức tồi tệ nhất. Những người chơi trung thực muốn thưởng thức trò chơi của bạn như dự định sẽ không bị ảnh hưởng bởi điều này. Mặt khác, cho phép người chơi gian lận có thể tăng thêm giá trị cho trò chơi của bạn. Nó cho phép người chơi trải nghiệm trò chơi theo một cách khác, điều này có thể làm tăng sự thích thú lâu dài với trò chơi của bạn.


5
Mặc dù tôi không thể tưởng tượng ai đó sẽ nghĩ ra thứ gì đó tốt trong vài giờ. Và bạn sẽ lãng phí tài nguyên vào thứ gì đó mà bạn có thể không cần.
Aistis

6
"Khi nó là một game offline thì tại sao phải bận tâm?" Điều gì xảy ra nếu đó là một trò chơi một người chơi với điểm cao trực tuyến?
Chàng trai với chiếc mũ

19
"Cho phép người chơi gian lận có thể tăng thêm giá trị cho trò chơi của bạn" - được nêu lên cho tuyên bố này. Tôi thực sự khó chịu bởi các trò chơi quyết định khóa các phần của trải nghiệm mà tôi đã trả tiền cho đến khi tôi đạt được một mức độ thành thạo nhất định, và tôi rất vui vì trong những trường hợp này, có những mánh gian lận để mở khóa trò chơi đầy đủ. Chẳng hạn, tôi hoàn toàn lạc lối trong các giải đấu đua với AI trong phần Need for Speed cũ hơn ; Đối với tôi, sự thích thú hơn là lái xe qua những cảnh quan đa dạng, do đó tôi thường bỏ qua cuộc đua và mở khóa tất cả các bản đồ và xe hơi. Một trò chơi ngăn chặn điều này sẽ chỉ làm phiền tôi.
HOẶC Mapper

6
Tôi muốn "trừ khi bạn có ít nhất một tiến sĩ về cả toán học và khoa học máy tính" viết lại thành "trừ khi bạn có ít nhất kiến ​​thức cần có để có bằng tiến sĩ về cả toán học và khoa học máy tính" (và thậm chí sau đó, ít nhất là sau đó ở Đức, các khóa học thường chứa đầy những thứ không liên quan đến tiền điện tử). Một người vốn dĩ không cần bằng cấp để vượt trội tiến sĩ.
phresnel

5
@phresnel Mặc dù bạn đúng về mặt kỹ thuật, Tiến sĩ là một thước đo tiêu chuẩn về sự thành thạo một môn học lý thuyết, như được trao bởi các tổ chức đáng tin cậy. Vì vậy, thật hợp lý khi sử dụng nó như một cách viết tắt cho lượng kiến ​​thức và kỹ năng cần thiết để đạt được bằng tiến sĩ. Nói cách khác: ý nghĩa của OP là đủ rõ ràng :-)
Tobia

10

Để mã hóa và giải mã cục bộ, bạn sẽ cần lưu trữ khóa trong chương trình của mình, vì vậy mọi người sẽ có thể bẻ khóa mã hóa nếu họ tháo rời mã của bạn. Có những thủ thuật để làm xáo trộn các khóa, nhưng ngay cả với những kẻ tấn công chuyên dụng sẽ tìm thấy khóa và sau đó đăng nó lên mạng cho tất cả những ai ít tận tâm nhìn thấy. Điều duy nhất mã hóa không ngăn được là những người sử dụng trình soạn thảo hex - bạn có thể dễ dàng thực hiện việc nén và bất cứ điều gì làm cho tệp không thể đọc được bằng chương trình giải nén. Ví dụ: thêm một byte ở phía trước dữ liệu.

Ngoài ra, bạn có thể nối thêm md5 của tệp lưu vào cuối tệp, vì vậy bạn sẽ nhận thấy nếu một tệp đã bị giả mạo. Sau đó, bạn có thể sử dụng điều này để từ chối tải savegame hoặc gắn cờ vé hỗ trợ một cách thích hợp để bạn không lãng phí thời gian cho các vấn đề gây ra bởi các trò chơi lưu trữ được sửa đổi thủ công. Một lần nữa, điều này là tầm thường để phá vỡ bởi bất cứ ai có thể đọc mã của bạn.

Nếu bạn muốn một cái gì đó không thể bị phá vỡ bởi một người có quyền truy cập vào các tệp nhị phân trên thiết bị của họ, bạn cần chạy một phần chương trình trên máy chủ, nằm dưới sự kiểm soát của bạn.

Để trả lời câu hỏi cuối cùng của bạn, một loại khóa cộng với mã hóa chỉ cần xác định thuật toán chính xác cần được áp dụng để mã hóa / giải mã. Bạn không thể mã hóa / giải mã dữ liệu mà không có thuật toán xác định cách thực hiện.


Điểm thứ hai của bạn là tốt đẹp. Nó cũng có thể giúp theo dõi các vấn đề trong trường hợp tham nhũng tập tin.
kiến

4

Lưu trữ hàm băm SHA256 đã chuyển đổi của dữ liệu lưu thực tế trong tệp lưu.

So sánh giá trị băm được lưu trữ với giá trị SHA256 của dữ liệu khi bạn tải nó.

Nếu không khớp, họ đã lừa hoặc làm hỏng tệp.

Chỉnh sửa để làm rõ: điều này làm cho việc bẻ khóa hệ thống chống gian lận trở nên khó khăn hơn nhưng vẫn có thể .


7
Không có gì ngăn cản mọi người tính toán lại hàm băm sau khi họ thực hiện các sửa đổi. Ngoài ra, tôi không hiểu tại sao vẫn có những người ủng hộ thuật toán MD5 bị hỏng với tất cả các điểm yếu về mật mã đã biết khi có các lựa chọn thay thế tốt hơn nhiều như SHA-256 (cho chữ ký) hoặc bcrypt (cho mật khẩu).
Philipp

1
Đơn giản, nhanh chóng, và hoàn toàn bị phá vỡ.
DeadMG

2
@DeadMG Nó bị hỏng do thiết kế, vì người dùng có quyền truy cập vào các tệp nhị phân phải chứa khóa. Sử dụng hàm băm mạnh hơn hoặc mã hóa tệp bằng AES sẽ gây lãng phí tài nguyên và thiết kế xấu, vì nó không cung cấp bảo mật bổ sung , nhưng làm tăng thêm chi phí. +1 vì downvote không được bảo vệ.
Peter - Unban Robert Harvey

7
@Philipp vì trong trường hợp này MD5 rõ ràng vượt trội hơn SHA-256. Những gì được yêu cầu bởi phương pháp mô tả là một thuật toán tổng kiểm tra giá rẻ, chính xác là MD5 là gì.
Peter - Unban Robert Harvey

3
@ transitor09 nếu đó hoàn toàn là phía khách hàng, chúng tôi không thể đảm bảo bất cứ điều gì và tổng kiểm tra hoạt động tốt như việc khách hàng mã hóa toàn bộ. Dù bằng cách nào, nó có thể bị nứt.
Lolums

1

Tôi sẽ sử dụng thuật toán mã hóa tiêu chuẩn (vì nó khó thực hiện phân tích tiền điện tử trên tệp đã lưu) nhưng không phải là một trong năm thuật toán được sử dụng nhiều nhất và ẩn nó trong mã của bạn (vì nó khó hiểu hơn về thuật toán nào là và đâu là chìa khóa.)

Để ẩn thuật toán mã hóa vào mã của bạn: lấy phiên bản nguồn mở, hiểu luồng của nó (hàm này gọi hàm nào là chuỗi khác), sau đó đổi tên tất cả các biến, trường cấu trúc và tên hàm (chỉ để chắc chắn) và truyền bá các hàm trên tất cả các cơ sở mã của bạn, trong các đối tượng và mô-đun khác nhau, có thể tách rời việc thực thi của chúng theo thời gian (thực hiện một đoạn mã hóa, sau đó thực hiện một thao tác khác, sau đó một số ms quay lại từ một đoạn mã dường như không liên quan và thực hiện một giai đoạn khác của mã hóa, v.v.) Khóa có thể được ẩn theo cùng một cách, vì một số hằng số dường như không liên quan trong các lớp của bạn, được truy cập trong thời gian chạy bởi các phần ẩn khác nhau của thuật toán mã hóa.

Cho dù tất cả điều này làm cho ý nghĩa kinh tế là một chủ đề khác hoàn toàn.


Tôi không biết ... Làm cho nó khó hơn chỉ vì một trò chơi ... Nhưng cảm ơn vì sự giúp đỡ! Tôi sẽ cố gắng hết sức!
Daniel Béjar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.