RSA шифрование / дешифрование в цели c - PullRequest
3 голосов
/ 16 ноября 2011

Я пытаюсь реализовать шифрование RSA в своем приложении, используя SecKeyEncrypt и SecKeyDecrypt.Проблема в том, что только когда зашифрованный текст имеет длину KeyblockSize (128,256 и т. Д.), Я получаю его расшифрованный правильно.Кроме того, для каждой сборки и запуска я получаю разные результаты (зашифрованные данные и длина зашифрованного текста), сохраняя введенный простой текст одинаковым.А при очистке и сборке несколько раз, время от времени длина текста шифра становится размером ключа и поэтому расшифровывается должным образом.Пожалуйста, помогите понять, где проблема.Заранее спасибо

Примечание. Из определения SecKeyEncrypt стало известно, что последний параметр возвращает значение no.записанных байтов, т.е. длина шифрованного текста в байтах.Этот параметр всегда возвращает мой размер ключа для любой входной строки.Но во многих случаях фактическая длина зашифрованного текста зависит от этого параметра.И всякий раз, когда длина шифрованного текста совпадает с параметром, корректно дешифруется.

Отправка зашифрованных и дешифрованных частей моего кода:

- (void)encryptWithPublicKey:(uint8_t *)plainBuffer cipherBuffer:(uint8_t *)cipherBuffer
{

    OSStatus status = noErr;

    NSLog(@"** original plain text 0: %s", plainBuffer);

    size_t plainBufferSize = strlen((char *)plainBuffer);//
    size_t cipherBufferSize = CIPHER_BUFFER_SIZE;// its 1024
    SecKeyRef key=[self getPublicKeyRef];
    NSLog(@"SecKeyGetBlockSize() public = %lu", SecKeyGetBlockSize(key));//it returns 256
    //  Error handling
    // Encrypt using the public.
    status = SecKeyEncrypt([self getPublicKeyRef],
                           kSecPaddingNone,
                           plainBuffer,
                           plainBufferSize,
                           &cipherBuffer[0],
                           &cipherBufferSize
                           );
    NSLog(@"encryption result code: %ld (size: %lu)", status, cipherBufferSize);
    NSLog(@"encrypted text: %s", cipherBuffer);
}

- (void)decryptWithPrivateKey:(uint8_t *)cipherBuffer plainBuffer:(uint8_t *)plainBuffer
{
    OSStatus status = noErr;

    size_t cipherBufferSize = strlen((char *)cipherBuffer);

    // DECRYPTION
    size_t plainBufferSize = BUFFER_SIZE;//its 256
    //  Error handling
    status = SecKeyDecrypt([self getPrivateKeyRef],
                           kSecPaddingNone,
                           &cipherBuffer[0],
                           cipherBufferSize,
                           &plainBuffer[0],
                           &plainBufferSize
                           );
    NSLog(@"decryption result code: %ld (size: %lu)", status, plainBufferSize);
    NSLog(@"FINAL decrypted text: %s", plainBuffer);

}
...