Прежде всего, мне нужно сказать, что я проверил все связанные с ним вопросы о стеке. Также проверял ссылки в ответах, но не получил никакого полезного решения. Поэтому, пожалуйста, не думайте, что я здесь, и задаю вам вопрос.
Вот мой php-скрипт, и я не имею никакого отношения к этому сценарию (поскольку я не могу изменить сценарий).
function encrypt($message,$secretKey) { return base64_encode( mcrypt_encrypt( MCRYPT_RIJNDAEL_256, $secretKey, $message, MCRYPT_MODE_ECB ) ); }
Я не могу расшифровать его в объективе c. Я использовал ряд категорий, таких как сильное шифрование для Cocoa / Cocoa Touch и т. Д., Также я последовал этому вопросу. Как сделать кодировку base64 на iphone-sdk?
Пожалуйста, помогите мне. Мне это очень срочно. Заранее спасибо.
Вот объективные коды C, которые я использовал для дешифрования (найдены в категории какао-категории Категория NSData + AES.h)
- (NSData *)AESDecryptWithPassphrase:(NSString *)pass { NSMutableData *ret = [NSMutableData dataWithCapacity:[self length]]; unsigned long rk[RKLENGTH(KEYBITS)]; unsigned char key[KEYLENGTH(KEYBITS)]; const char *password = [pass UTF8String]; for (int i = 0; i < sizeof(key); i++) key[i] = password != 0 ? *password++ : 0; int nrounds = rijndaelSetupDecrypt(rk, key, KEYBITS); unsigned char *srcBytes = (unsigned char *)[self bytes]; int index = 0; while (index < [self length]) { unsigned char plaintext[16]; unsigned char ciphertext[16]; int j; for (j = 0; j < sizeof(ciphertext); j++) { if (index >= [self length]) break; ciphertext[j] = srcBytes[index++]; } rijndaelDecrypt(rk, nrounds, ciphertext, plaintext); [ret appendBytes:plaintext length:sizeof(plaintext)]; NSString* s = [[NSString alloc] initWithBytes:plaintext length:sizeof(plaintext) encoding:NSASCIIStringEncoding]; NSLog(@"%@",s); } return ret; }
Также я попробовал этот декодер
- (NSData*) aesDecryptWithKey:(NSString *)key initialVector:(NSString*)iv { int keyLength = [key length]; if(keyLength != kCCKeySizeAES128) { DebugLog(@"key length is not 128/192/256-bits long"); ///return nil; } char keyBytes[keyLength+1]; bzero(keyBytes, sizeof(keyBytes)); [key getCString:keyBytes maxLength:sizeof(keyBytes) encoding:NSUTF8StringEncoding]; size_t numBytesDecrypted = 0; size_t decryptedLength = [self length] + kCCBlockSizeAES128; char* decryptedBytes = malloc(decryptedLength); CCCryptorStatus result = CCCrypt(kCCDecrypt, kCCAlgorithmAES128 , (iv == nil ? kCCOptionECBMode | kCCOptionPKCS7Padding : kCCOptionPKCS7Padding), keyBytes, keyLength, iv, [self bytes], [self length], decryptedBytes, decryptedLength, &numBytesDecrypted); if(result == kCCSuccess){ NSData* d=[NSData dataWithBytesNoCopy:decryptedBytes length:numBytesDecrypted]; NSLog(@"%@",[NSString stringWithUTF8String:[d bytes]]); return d; } free(decryptedBytes); return nil; }
По внешнему виду эта функция php выполняет две вещи.
MCRYPT_RIJNDAEL_256
Вот почему просто использование base64 не работает. Я собираюсь угадать из названия, что MCRYPT_RIJNDAEL_256
– всего лишь AES 256.
Надеюсь, это поможет.
Редактировать:
Код, добавленный выше, выглядит нормально. Вам просто нужно сначала выполнить декодирование данных base64.
Скрипт php делает следующее:
Поэтому вы хотите сделать это в своем приложении для какао:
Если у вас возникли проблемы, вы можете захотеть поиграть и посмотреть, можете ли вы получить какао, чтобы сделать то же самое, что и скрипт php: encrypt и base64 кодируют данные. Если вы можете получить вывод своей функции шифрования так же, как и вывод функции шифрования php, вы можете найти ее расшифровку.