2013-07-02 4 views
1

Я сделал шифрование и дешифрование с помощью AES128 с PKCS7padding, но не расшифровал его с помощью Android и .NET. В Android и .NET Pkcs5padding используется для шифрования и дешифрования. Мой код:Как использовать PKCS5padding с AES128 в iphone

- (NSData *)AES128EncryptWithKey:(NSString *)key 
{ 


    char keyPtr[kCCKeySizeAES128 + 1]; // room for terminator (unused) 
    bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding) 
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; 
    NSUInteger dataLength = [self length]; 
    size_t bufferSize = dataLength + kCCBlockSizeAES128; 
    void *buffer = malloc(bufferSize); 

    size_t numBytesEncrypted = 0; 
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,   kCCAlgorithmAES128,kCCOptionPKCS7Padding, 
              keyPtr, kCCKeySizeAES128, 
              NULL ,[self bytes], dataLength, buffer, bufferSize, &numBytesEncrypted); 
    if(cryptStatus == kCCSuccess) 
    { 

     return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted]; 
    } 

    free(buffer); 
    return nil; 

} 

- (NSData *)AES128DecryptWithKey:(NSString *)key 
{ 
    char keyPtr[kCCKeySizeAES128+1]; 
    bzero(keyPtr, sizeof(keyPtr)); 
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; 
    NSUInteger dataLength = [self length]; 


    size_t bufferSize = dataLength + kCCBlockSizeAES128; 
    void *buffer = malloc(bufferSize); 

    size_t numBytesDecrypted = 0; 

    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, 
              keyPtr, kCCKeySizeAES128, 
              NULL , 
              [self bytes], dataLength, 
              buffer, bufferSize, 
              &numBytesDecrypted); 
    if(cryptStatus == kCCSuccess) 
    { 
      return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted]; 
    } 

    free(buffer); 
    return nil; 


} 

Сообщите, если у кого есть идеи. Дайте мне предложения.

+0

"* но его не расшифровка с помощью Android и .NET *"> Можете ли вы уточнить? Вы получаете мусор? Является первым блочным мусором? Вы получаете ошибку заполнения? –

+0

Да, я получал ошибку заполнения. но, слава богу, я решил эту проблему с внедрением kCCOptionECBMode. Проблема решена. спасибо за ответ – Anju

+1

Хорошо. Пожалуйста, удалите этот вопрос или отправьте сообщение и примите свой ответ. –

ответ

2

Существует только одно основное отличие между PKCS # 5 и дополнением PKCS # 7 от размера блока. Заполнение PKCS # 5 определяется только для размеров блоков с 8 байтами. PKCS # 7 padding будет работать для любого размера блока от 1 до 255 байт.

Это определение PKCS#5 дополнения (6.2): ​​

Заполнитель строка PS должен состоять из 8 - (|| М || по модулю 8) октетов все , имеющие значение 8 - (|| М || mod 8).

PKCS#7 одно и то же за исключением того, что она позволяет блок размером до 256 байт в размере (10.3 примечание 2):

Для таких алгоритмов, метод должен быть площадкой вход на завершающего end с k - (l mod k) октетами все значения k - (l mod k), где l - длина ввода.

Таким образом, фундаментальное дополнение PKCS # 5 - это подмножество дополнений PKCS # 7 для 8-байтовых размеров блоков.

Большинство криптографических библиотек используют PKCS # 5 или PKCS # 7 для определения одного и того же механизма заполнения. Официально PKCS # 7, конечно, будет единственным правильным, если в расчете используются размеры блоков, отличных от 8.

Обратите внимание, что оба PKCS # 5 и PKCS # 7 не являются стандартами для механизмов заполнения. Часть заполнения - это только небольшое подмножество определенных функций (шифрование на основе пароля или PBE, синтаксис криптографического сообщения или CMS соответственно).

+0

Я искренне надеюсь, что этот ответ будет достаточно точным, чтобы указать на него, когда его снова попросят. –

+0

Хороший обзор, я постараюсь запомнить этот ответ для будущих вопросов такого характера. Хотя я задаюсь вопросом, лучше ли бы вы создали свой собственный вопрос для ответа на вопрос. –

+0

@ DuncanJones Да, спасибо, я думал то же самое. –