Моят екип трябва да разработи решение за криптиране на двоични данни (съхранени като byte[]
) в контекста на приложение за Android, написано на Java. Криптираните данни ще бъдат предавани и съхранявани по различни начини, по време на които не може да се изключи повреда на данните. В крайна сметка друго приложение за Android (отново написано на Java) ще трябва да дешифрира данните.
Вече е решено, че алгоритъмът за криптиране трябва да бъде AES, с ключ от 256 бита. Въпреки това бих искал да взема информирано решение за това коя AES реализация и/или „режим“ трябва да използваме. Четох за нещо, наречено GCM режим, и направихме някои тестове с него (използвайки BouncyCastle/SpongyCastle), но не ми е съвсем ясно за какво точно служи AES-GCM и какво ни „купува“ в сравнение с обикновения AES - и дали има някакви компромиси, които трябва да се вземат предвид.
Ето списък с притеснения/изисквания/въпроси, които имаме:
Попълване: данните, които трябва да шифроваме, не винаги ще бъдат кратни на 128-те бита, така че внедряването/режимът на AES трябва да добавя запълване, но само когато е необходимо. Останах с впечатлението, че обикновена реализация на AES, като предоставената от
javax.crypto.Cipher
, няма да направи това, но първоначалните тестове показаха, че го прави. Така че предполагам, че изискването за подпълване само по себе си не е причина да се прибягва до нещо като GCM вместо "обикновен" AES. Вярно ли е?Удостоверяване: Нуждаем се от надежден начин за откриване на повреда на данните. В идеалния случай обаче искаме да открием и кога е направен опит за декриптиране с неправилен ключ. Следователно искаме да можем да правим разлика между двата случая. Причината, поради която в крайна сметка обмислих GCM на първо място, се дължи на този въпрос за Stackoverflow, където един от отговорилите изглежда предполага че правенето на това разграничение е възможно с помощта на AES-GCM, въпреки че той не предоставя подробно обяснение (да не говорим за код).
Минимизиране на разходите: Трябва да ограничим разходите за съхранение и предаване на шифрованите данни. Затова искаме да знаем дали и до каква степен изборът за конкретна реализация/режим на AES влияе върху размера на режийните разходи.
Ефективност на криптиране/декриптиране: Въпреки че не е основна грижа, ние се чудим до каква степен изборът на конкретна реализация/режим на AES влияе върху производителността на криптиране и декриптиране, както по отношение на времето на процесора, така и на паметта.
Благодаря предварително за всякакви съвети, разяснения и/или примери за кодове.
РЕДАКТИРАНЕ: delnan услужливо посочи, че няма такова нещо като „обикновен AES“. За да изясня, това, което имах предвид с това, е използването на вградената AES поддръжка на Java.
Така: Cipher localCipher = Cipher.getInstance("AES");