2015-05-02 6 views
0

Я это Objective-C код, который преобразует NSData в AES256, в последнее время я обнаружил, что максимальное количество пароля составляет 32 байт:AES256 более чем 32 байт

- (NSData *)AES256EncryptWithKey:(NSString *)key { 
    // 'key' should be 32 bytes for AES256, will be null-padded otherwise 
    char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused) 
    bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding) 

    // fetch key data 
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; 

    NSUInteger dataLength = [self length]; 

    //See the doc: For block ciphers, the output size will always be less than or 
    //equal to the input size plus the size of one block. 
    //That's why we need to add the size of one block here 
    size_t bufferSize = dataLength + kCCBlockSizeAES128; 
    void *buffer = malloc(bufferSize); 

    size_t numBytesEncrypted = 0; 
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, 
              keyPtr, kCCKeySizeAES256, 
              NULL /* initialization vector (optional) */, 
              [self bytes], dataLength, /* input */ 
              buffer, bufferSize, /* output */ 
              &numBytesEncrypted); 
    if (cryptStatus == kCCSuccess) { 
     //the returned NSData takes ownership of the buffer and will free it on deallocation 
     return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted]; 
    } 

    free(buffer); //free the buffer; 
    return nil; 
} 

- (NSData *)AES256DecryptWithKey:(NSString *)key { 
    // 'key' should be 32 bytes for AES256, will be null-padded otherwise 
    char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused) 
    bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding) 

    // fetch key data 
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; 

    NSUInteger dataLength = [self length]; 

    //See the doc: For block ciphers, the output size will always be less than or 
    //equal to the input size plus the size of one block. 
    //That's why we need to add the size of one block here 
    size_t bufferSize = dataLength + kCCBlockSizeAES128; 
    void *buffer = malloc(bufferSize); 

    size_t numBytesDecrypted = 0; 
    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, 
              keyPtr, kCCKeySizeAES256, 
              NULL /* initialization vector (optional) */, 
              [self bytes], dataLength, /* input */ 
              buffer, bufferSize, /* output */ 
              &numBytesDecrypted); 

    if (cryptStatus == kCCSuccess) { 
     //the returned NSData takes ownership of the buffer and will free it on deallocation 
     return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted]; 
    } 

    free(buffer); //free the buffer; 
    return nil; 
} 

Интересно, если это возможно, чтобы найти некоторые способ увеличить эти байты? Причиной того, чтобы пароль был больше 32 цифр, возможно?

ответ

2

AES не использует пароль, а ключ. AES-256, например, определен только для 256-битного ключа (32 байта). Разумеется, вы можете использовать функции вывода на основе пароля для получения ключа от пароля.

Популярные выборы PBKDF2, bcrypt и scrypt (с увеличением медлительности - чем медленнее, тем лучше). Они являются по существу хэш-функциями, которые берут произвольную двоичную строку и дают (переменный) фиксированный вывод.

Хорошее значение для PBKDF2 составляет 86 000 итераций. Также используйте случайную соль. Затем вы можете создать достаточный вывод для ключа и IV.

Режим CBC (по умолчанию для CCCrypt) не является семантически безопасным, если используется со статическим IV, таким как все нули IV в вашем коде. Используйте по крайней мере режим CBC со случайным IV или даже лучше аутентифицированный режим, такой как GCM или EAX. Если аутентифицированный режим недоступен, вам необходимо применить код проверки подлинности сообщения к вашему зашифрованному тексту (encrypt-then-MAC), если ваша система уязвима для случайной атаки оракула.

+0

Я могу использовать один из этих склепов с моим кодом? – LettersBa

+0

Конечно, я связал PBKDF2. Используйте более 1000 итераций и соли. –

+0

Другой вопрос: Если я предпочитаю не использовать эту соль, создайте только AES256 с моим кодом с 32 байтами? Файл также защищен? – LettersBa

2
  1. Байт не цифра.

  2. 256-битные ключи находятся далеко за пределами грубой силы.

  3. Не используйте пароль для ключа шифрования. Если вам необходимо использовать пароль, используйте функцию детекции пароля, например PBKDF2, чтобы создать защищенный ключ шифрования из пароля. Пароль может иметь любую длину, и функция PBKDF2 генерирует безопасный ключ шифрования правильной длины. Укажите количество итераций> 10K.

  4. Получение CCCrypt для работы является тривиальной частью создания безопасной схемы шифрования.

  5. Рассмотрите возможность использования RNcryptor, он будет обрабатывать эти данные и многое другое.

  6. Вам необходимо будет управлять безопасностью пароля/ключа, что не так просто.

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