RNCryptor не работает со строкой JSON

Вот мой метод использовать RNCryptor для шифрования / дешифрования строки JSON, которую я отправляю в веб-службу. Я использую статическую переменную IV, которая может быть плохой практикой, но, пожалуйста, не сосредотачивайтесь на этом. Вот как я это делаю:

Примечание. Я использую категорию NSData + Base64 от Matt Gallagher, найденную здесь (внизу страницы)

-(NSString*)encryptString:(NSString*)plaintext withKey:(NSString*)key error:(NSError**)error{ NSData *data = [plaintext dataUsingEncoding:NSUTF8StringEncoding]; NSData *encryptionKey = [NSData dataFromBase64String:key]; NSData *IV = [NSData dataFromBase64String:ENCRYPTION_IV]; RNCryptorEngine *engine = [[RNCryptorEngine alloc] initWithOperation:kCCEncrypt settings:kRNCryptorAES256Settings key:encryptionKey IV:IV error:error]; [engine addData:data error:error]; NSData *encryptedData = [engine finishWithError:error]; NSString *based64Encrypted = [encryptedData base64EncodedString]; NSLog(@"Encrytped: %@", based64Encrypted); return based64Encrypted; } -(NSString*) decryptString:(NSString*)cipherText withKey:(NSString*)key error:(NSError**)error;{ NSData *data = [NSData dataFromBase64String:cipherText]; NSData *encryptionKey = [NSData dataFromBase64String:key]; NSData *IV = [NSData dataFromBase64String:ENCRYPTION_IV]; RNCryptorEngine *engine = [[RNCryptorEngine alloc] initWithOperation:kCCDecrypt settings:kRNCryptorAES256Settings key:encryptionKey IV:IV error:error]; [engine addData:data error:error]; NSData *decryptedData = [engine finishWithError:error]; NSString *decryptedString = [[NSString alloc] initWithData:decryptedData encoding:NSUTF8StringEncoding]; NSLog(@"Decrypted: %@", decryptedString); return decryptedString; } 

Когда я использую строку, подобную hello world она отлично работает. Когда я использую строку типа {"username":"developer","password":"abcdefG*12"} Я предполагаю, что это что-то связано с кодировкой, но я действительно знаю, что использовать.

когда я шифрую эту строку, я получаю строку base64, и когда я пытаюсь расшифровать, я получаю пустую строку.

ОБНОВИТЬ

Похоже, что он терпит неудачу из-за : в строке json. То, что странно, это только терпит неудачу, поскольку строка находится в формате json, я думал, что это : потому что я пробовал это сначала, но после дальнейшего расследования, если я нарушил какие-либо из требований JSON , { ss } перестал работать. Однако он работает с RNEncryptor поэтому я не уверен, что я делаю неправильно. В любом случае, я думаю, мы можем перепроектировать текущий поток

ОБНОВЛЕНИЕ 2

Здесь я называю эти методы:

 NSDictionary *credentials = @{@"username":@"developer",@"password":@"abcdefG*12"}; NSString *jsonString = [ credentials JSONStringWithOptions:JKSerializeOptionNone error:&error]; NSLog(@"json string: %@", jsonString); //OUTPUTS: {"username":"developer","password":"abcdefG*12"} CCGEncryption *encryptionObject = [[CCGEncryption alloc] init]; //THIS IS THE OBJECT WHERE THE encrypt/decrypt methods are NSString *encrypted = [encryptionObject encryptString:jsonString withKey:ENCRYPTION_KEY error:&error]; if(error){ NSLog(@"Error:%@", error); //NO ERROR } NSString *decrypted = [encryptionObject decryptString:encrypted withKey:ENCRYPTION_KEY error:&error]; if(error){ NSLog(@"Error:%@", error); //NO ERROR } NSLog(@"decrypted: %@", decrypted); //OUTPUT: decrypted: 

Вы не собираете данные, возвращаемые addData: Двигатель шифрует / расшифровывает, когда вы идете так, что вам не нужно хранить весь открытый текст и зашифрованный текст в памяти. Он не накапливает данные, если это необходимо (для дополнительных причин). Я подозреваю, что тесты, которые работают, имеют разную длину, чем те, которые не являются.

Вы правы, что использование фиксированного IV – это плохая практика. Если вы используете один и тот же IV и ключ в нескольких сообщениях, то злоумышленники могут восстановить части ваших сообщений, сравнивая зашифрованные тексты. Если вы используете AES-CBC без случайного IV и HMAC, то ваш AES небезопасен несколькими способами. В этом проблема была построена RNCryptor для адресации и почему формат данных выглядит так, как он.

@jbtule верна, что я не особо хотел, чтобы люди напрямую использовали движок и не задокументировали его, но нет проблем с его использованием, и я могу лучше документировать его, чтобы поддержать это. Тем не менее, сам двигатель безумно прост; Я просто создал его как способ совместного использования кода между шифром и дешифратором. Существует не так много причин использовать RNCryptor, если вы собираетесь обойти большую часть безопасности, которую он предоставляет. Для вышеуказанного кода было бы намного проще просто вызвать одноразовый CCCrypt() .

Interesting Posts

iOS В App Purchase: могу ли я сделать первый бесплатный?

В чем разница между жизненным циклом контроллера и жизненным циклом просмотра в iOS?

Анимация CAShapeLayer с движущейся рамкой

Добавление заголовка в UITableview программно

UICollectionView для компоновки сетки с помощью Xamarin.iOS (MonoTouch)?

музыкальное приложение iOS, прекратите музыку при завершении приложения

Фильтровать два массива Swift

Какова наилучшая практика, когда дело доходит до переменных Info.plist в iOS-разработке?

UITextView обертывает текст при создании с помощью iOS 7 SDK

Необходимо ли, чтобы сообщение делегата всегда имело пустоту как возвращаемый тип?

Как использовать Boost с Cocoapods на IOS?

iOS (этот класс не является ключевым кодом, совместимым для ключевого dataSource)

Как продолжить использование функций TestFlight, не дожидаясь просмотра приложения

Центрирование пользовательского размера UIModalPresentationPageSheet?

Прокрутка медленно на мобильных / ios при использовании переполнения: прокрутка

Давайте будем гением компьютера.