Я весь день рвал мои волосы, пытаясь решить это...
У меня есть клиент objective-c, работающий на iPhone, подключающийся к серверу Java. IPhone шифрует данные с помощью AES, но я не могу их расшифровать на сервере. Я использую известную кодовую фразу и сообщение (одиночную строку) и создаю массив байтов на iPhone, создавая массив байтов сравнения на сервере Java с использованием одного и того же ключа и сообщения, но массивы байтов совершенно разные (и, следовательно, не могут декодироваться на стороне Java).
Клиент использует библиотеку CommonCrypto со следующими настройками...
Данные NSData
содержат слово "сообщение", используя dataUsingEncoding:NSASCIIStringEncoding
Ключ - это NSData
, в котором снова используется фраза "1234567891123456" с использованием кодировки, как указано выше.
Алгоритм kCCAlgorithmAES128
Параметры kCCOptionsPKCS7Padding
(что, на мой взгляд, соответствует ЕЦБ на сервере?!)
Сервер использует следующий код...
byte[] key = "1234567891123456".getBytes();
Cipher c = Cipher.getInstance("AES/ECB/PKCS5Padding");
SecretKeySpec k = new SecretKeySpec(key, "AES");
c.init(Cipher.ENCRYPT_MODE, k);
byte[] encryptedData = c.doFinal("message".getBytes());
НО данные в encryptedData не совпадают с данными, которые генерируются в коде objective-c, байт-массивы совершенно разные.
Может ли кто-нибудь увидеть что-нибудь очевидное, я делаю неправильно? Я думаю, что настройки все одинаковые...: (
- ОБНОВЛЕНИЕ - по запросу....
Хорошо, так вот идет....
Клиент iPhone шифрует следующую строку "message" Он использует ключ "1234567891123456" Он использует вектор инициализации "1010101010101010" Он использует AES128, с режимом CBC (насколько я могу судить) и опциями kCCOptionsPKCS7Padding.
Результатом шифрования (с кодировкой base64) является UHIYllDFAXl81ZM7OZPAuA ==
Сервер шифрует одну и ту же строку с тем же ключом и вектором инициализации. Он использует следующий Cipher.getInstance( "AES/CBC/PKCS5Padding" );
Результатом шифрования (с кодировкой base64) является ALBnFIHysLbvAxjvtNo9vQ ==
Спасибо.
- ОБНОВЛЕНИЕ 2 - В соответствии с запросом...
Вот код iPhone....
NSData *toencrypt = [@"message" dataUsingEncoding:NSASCIIStringEncoding];
NSData *pass = [@"1234567891123456" dataUsingEncoding:NSASCIIStringEncoding];
NSData *iv = [@"1010101010101010" dataUsingEncoding:NSASCIIStringEncoding];
CCCryptorStatus status = kCCSuccess;
NSData *encrypted = [toencrypt dataEncryptedUsingAlgorithm:kCCAlgorithmAES128 key:pass initializationVector:iv options:kCCOptionPKCS7Padding error:&status];
NSString *text = [NSString base64StringFromData:encrypted length:[encrypted length]];
Ниже приведена категория NSData для шифрования...
http://github.com/AlanQuatermain/aqtoolkit/tree/master/CommonCrypto/
Кстати, я проверил массивы байтов, которые находятся в toencrypt, pass и iv, и они соответствуют тем, которые находятся на сервере.