Nhóm của tôi cần phát triển một giải pháp để mã hóa dữ liệu nhị phân (được lưu trữ dưới dạng byte[]
) trong ngữ cảnh của một ứng dụng Android được viết bằng Java. Dữ liệu được mã hóa sẽ được truyền và lưu trữ theo nhiều cách khác nhau, trong đó dữ liệu bị hỏng không thể loại trừ được. Cuối cùng, một ứng dụng Android khác (viết lại bằng Java) sẽ phải giải mã dữ liệu.Mã hóa dữ liệu trên Android, AES-GCM hoặc AES thuần túy?
Nó đã được quyết định rằng thuật toán mã hóa phải là AES, với khóa 256 bit. Tuy nhiên, tôi muốn đưa ra quyết định sáng suốt về việc triển khai AES và/hoặc "chế độ" mà chúng tôi nên sử dụng. Tôi đã đọc về một cái gì đó gọi là chế độ GCM, và chúng tôi đã làm một số thử nghiệm với nó (sử dụng BouncyCastle/SpongyCastle), nhưng nó không phải là hoàn toàn rõ ràng với tôi chính xác AES-GCM là gì và những gì nó "mua" chúng tôi so với đồng bằng AES - và liệu có bất kỳ sự cân bằng nào được tính đến hay không.
Dưới đây là danh sách các mối quan tâm/yêu cầu/câu hỏi chúng ta có:
Padding: dữ liệu chúng tôi cần để mã hóa sẽ không luôn luôn là một bội số của 128 bit, do đó AES thực hiện/chế độ nên thêm đệm, nhưng chỉ khi cần thiết. Tôi đã ấn tượng rằng việc triển khai AES đơn giản, chẳng hạn như được cung cấp bởi
javax.crypto.Cipher
, sẽ không làm điều đó, nhưng các thử nghiệm ban đầu chỉ ra rằng nó thực hiện. Vì vậy, tôi đoán các yêu cầu padding trong chính nó là không có lý do để nghỉ mát để một cái gì đó như GCM thay vì "đồng bằng" AES. Đúng không?Xác thực: Chúng tôi cần một cách dễ dàng để phát hiện xem có xảy ra hỏng hóc dữ liệu hay không. Tuy nhiên, lý tưởng nhất chúng tôi cũng muốn phát hiện khi giải mã được thử bằng khóa không chính xác. Do đó, chúng tôi muốn có thể phân biệt giữa cả hai trường hợp này. Lý do tôi kết thúc xem xét GCM ở vị trí đầu tiên là do Stackoverflow question, nơi một trong những người trả lời có vẻ ngụ ý rằng việc phân biệt này có thể sử dụng AES-GCM, mặc dù anh ta không cung cấp giải thích chi tiết.
Giảm thiểu chi phí: Chúng tôi cần giới hạn chi phí lưu trữ và truyền dữ liệu được mã hóa. Vì vậy, chúng tôi muốn biết liệu, và ở mức độ nào, lựa chọn cho việc triển khai/chế độ AES cụ thể ảnh hưởng đến lượng chi phí.
Encryption/giải mã hiệu: Mặc dù nó không phải là một mối quan tâm chính mà chúng tôi đang tự hỏi đến mức độ nào lựa chọn một thực hiện AES/chế độ ảnh hưởng mã hóa và giải mã hoạt động cụ thể, cả về thời gian CPU và bộ nhớ.
Cảm ơn trước cho bất kỳ lời khuyên, làm rõ và/hoặc ví dụ mã nào.
EDIT: delnan helpfully chỉ ra không có những điều như "đồng bằng AES". Vì vậy, để làm rõ, những gì tôi có nghĩa là bằng cách sử dụng hỗ trợ AES được xây dựng trong Java.
Giống như vậy: Cipher localCipher = Cipher.getInstance("AES");
AES "đơn giản" là gì? Trừ khi bạn chỉ xử lý 256 bit dữ liệu. Nếu bạn có nhiều dữ liệu hơn thế, bạn nhất thiết phải sử dụng chế độ * some *. Có lẽ thư viện của bạn chọn một chế độ theo mặc định (từ những gì tôi đã nghe, nhiều thư viện thực hiện một lựa chọn khá không an toàn ở đây). Vì vậy, bạn nên kiểm tra chế độ nào thực sự được sử dụng khi bạn sử dụng "đồng bằng" AES. – delnan
Cảm ơn bạn đã bình luận @delnan, tôi đã chỉnh sửa để làm rõ ý tôi. – Matthias