2013-02-27 3 views
3

Я использую алгоритм AES для шифрования данных в приложениях для iPhone и Android перед отправкой на сервер .NET.Шифрование AES расходится после 16 символов

iPhone шифрование работает отлично (код сервера .NET расшифровывает его без проблем).

Андроидальное шифрование отлично работает для текстовых строк < 16 символов. Для четких текстовых строк> = 16 символов первый зашифрованный «кусок» такой же, как у iPhone, второй зашифрованный фрагмент совершенно другой. Длина ключа - 16 символов.

Вот Android код (который отлично работает до 16 символов):

byte[] valueData = value.getBytes(); 
byte[] keyData = skey.getBytes(); 

SecretKeySpec skeySpec = new SecretKeySpec(keyData, "AES"); 
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7PADDING"); 
cipher.init(Cipher.ENCRYPT_MODE, skeySpec); 

byte[] valueEncryptedData = cipher.doFinal(valueData); 
String valueEncryptedString = Base64.encodeToString(valueEncryptedData, Base64.DEFAULT); 

return valueEncryptedString; 

А вот мой IOS код, который работает отлично:

StringEncryption *crypto = [[StringEncryption alloc] init]; 
CCOptions padding = kCCOptionPKCS7Padding; 

NSData *valueData = [value dataUsingEncoding:NSUTF8StringEncoding]; 
NSData *keyData = [skey dataUsingEncoding:NSUTF8StringEncoding]; 
NSData *valueEncryptedData = [crypto encrypt:valueData key:keyData padding:&padding]; 
NSString *valueEncryptedString = [valueEncryptedData base64EncodingWithLineLength:0]; 

Я подозреваю, что проблема в том, что-то тривиальный. Например. возможно, я использую неправильную инициализацию Cipher, и я должен использовать CBC вместо ECB. Однако вывод с использованием Cipher.getInstance("AES/CBC/PKCS7PADDING") также не дает желаемого результата (на самом деле, хуже, поскольку зашифрованное значение полностью отличается от зашифрованного значения iPhone, а не только расходятся после первых 16 символов).

+0

Вы используете простой вызов 'CCCrypt' в функции шифрования? Вы должны показать, как вы выполняете шифрование в iOS - криптовызоны предпочтительнее – Petesh

+0

Пожалуйста, также покажите свой код дешифрования. –

+0

Привет @Patesh, мы используем код шифрования iOS, написанный Дэвидом Векслером http://automagical.rationalmind.net/2009/02/12/aes-interoperability-between-net-and-iphone/ (см. StringEncryption.m в zip-файле) и http://stackoverflow.com/questions/538435/aes-interoperability-between-net-and-iphone/ – tomblah

ответ

2

Возможно, вы используете неправильный режим шифрования. И, скорее всего, вы должны использовать CBC вместо ECB. И это не работает с первой попытки, поскольку CBC требует IV (начальный вектор), а различные схемы шифрования могут использовать разные векторы по умолчанию.

+0

Решено. Я не устанавливал IV. Благодаря! – tomblah

Смежные вопросы