Я целый день рвал на себе волосы, пытаясь решить эту проблему ...
У меня на iPhone работает клиент target-c, подключающийся к серверу Java. IPhone шифрует данные с помощью AES, но я не могу расшифровать их на сервере. Я использую известную фразу-пароль и сообщение (одну строку) и генерирую байтовый массив на iPhone, генерируя сравнительный байтовый массив на Java-сервере, используя тот же ключ и сообщение, но байтовые массивы совершенно разные (и, следовательно, не могу быть декодирован на стороне Java).
Клиент использует библиотеку CommonCrypto со следующими настройками ...
Данные - это NSData
, содержащее слово «сообщение» с использованием dataUsingEncoding:NSASCIIStringEncoding
Ключ - это NSData
, снова содержащий фразу «1234567891123456» с использованием кодировки, как указано выше.
Алгоритм kCCAlgorithmAES128
Варианты kCCOptionsPKCS7Padding
(что, я считаю, приравнивается к ECB на сервере?!)
Сервер использует следующий код ...
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 не совпадают с данными, генерируемыми в коде target-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, и они соответствуют тем, которые находятся на сервере.