Я пытаюсь реализовать алгоритм AES128 на Android, и я ссылался на эту ссылку для базовой реализации AES (http://java.sun.com/developer/technicalArticles/Security/AES/AES_v1.html).
Проблема в том, что для моего проекта ключ предопределен, и это 36 байтов, а не 16/24/32 байтов. Поэтому я всегда получал исключение «длина ключа не 128/194/256 бит». Я пробую решение от iphone sdk (см. Эту ссылку: Структура шифрования iOS ), и оно работает, даже когда я передаю 36-байтовый предопределенный ключ. Поскольку я не могу найти подробности реализации BlockCipher.c / CommonCryptor.c, выпущенного Apple, может ли какой-либо орган помочь мне выяснить, как они выбирают 16 байтов из 36 байтов?
Спасибо.
----------------------------------- обновление от 13 сентября --------- ---------------------------
Чтобы избежать путаницы, я привожу пример и мой прогресс. Я изменяю некоторые данные, которые являются конфиденциальными, но длина и формат остаются неизменными. А для экономии времени я раскрываю только основные функции. Нет комментариев к коду, так как я думаю, что код достаточно понятен.
пример iOS:
NSString * _key = @"some 36 byte key";
StringEncryption *crypto = [[[StringEncryption alloc] init] autorelease];
NSData *_inputData = [inputString dataUsingEncoding:NSUTF8StringEncoding];
CCOptions padding = kCCOptionPKCS7Padding;
NSData *encryptedData = [crypto encrypt:_inputData key:[_key dataUsingEncoding:NSUTF8StringEncoding] padding:&padding];
NSString *encryptedString = [encryptedData base64EncodingWithLineLength:0];
return encryptedString;
реализация [crypto encrypt] точно такая же, как ссылка, которую я упомянул выше. Он вызывает doCipher в режиме шифрования. Основные функции включают CCCryptorCreate, CCCryptorUpdate и CCCryptorFinal, которые взяты из. CCCryptorCreate имеет дело с длиной ключа. Он передает необработанные байты ключа и передает целое число 16 (kCCKeySizeAES128) в качестве размера ключа и делает свое дело. Иерархия вызовов похожа на CCCryptorCreate / CommonCryptor.c => ccBlockCipherCallouts-> CCBlockCipherInit / BlockCipher.c => ccAlgInfo-> setkey / BlockCipher.c. На самом деле setkey - это указатель на функцию, для AES он указывает на aes_cc_set_key. И не могу найти реализацию aes_cc_set_key, потерялся здесь.
---------------------------------------- обновление 13 сентября ---- -------------------------
Я изменяю _key в образце кода iOS, вручную беря первые 16 байт в качестве нового ключа, остальные части остаются прежними, и он работает !!! До этого момента я решал проблему длины ключа.
Но версия Android отличается от версии iOS для некоторого длинного простого текста, такого как 30 или 40 байт. моя реализация Java похожа на приведенную ниже:
String key = "some 16 byte key";
byte[] keyBytes = key.getBytes("UTF-8");
byte[] plainBytes = plainText.getBytes("UTF-8");
SecretKeySpec skeySpec = new SecretKeySpec(keyBytes, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[] encrypted = cipher.doFinal(plainBytes);
String result = Base64.encodeBytes(encrypted);
return result;
Base64 от org.apache.commons.codec.binary.Base64. В чем проблема? или какие-либо советы по библиотекам c / c ++, которые могут сделать то же самое? Я могу импортировать его и в Android.