Расшифровка PGP на iOS - PullRequest
       26

Расшифровка PGP на iOS

2 голосов
/ 20 сентября 2011

Я пытаюсь реализовать дешифрование файла PGP на iPad. Я настроил несколько тестовых .txt файлов, которые затем зашифровал через рабочий стол PGP.

Я импортировал закрытый ключ сертификата, используемого для шифрования документа, используя SecPKCS12Import, а затем SecIdentityCopyPrivateKey () из полученного SecIdentityRef.

Если я тестирую шифрование и дешифрование простой строки в Objective C, используя открытый и закрытый ключи сертификата, это прекрасно работает.

Теперь, когда я испытываю фактическую расшифровку PGP, я немного озадачен ... Читая текст из файла .pgp, я получаю:

-----BEGIN PGP MESSAGE-----
Version: 10.1.1.10

qANQR1DBwEwDraQm2Kxa5GkBB/4yLebeLk10C2DVvHpQL20E0DThhgQlTasXo+YJ
pLp5Ig2hHu4Xx0m74D3vfyWpA2XQA02TMAHO9lhNfkE234c/ds05D1UyQkJEoqW+
joEcbRT5rlGN3qrMf1FXv8/01EHH0dgeD6mAkkDeDEorIirYHCF6+QVkedaphZLs
c63GmcikzkWZT/vv20ICL3Ys0DaC3P9zu0T1GtjkmQ062kaTab/VBJnQrsY/y1JU
ypmbW9bbFeZMcAqXHMqpjw49K5UluIJaDbRNAjIvHTFLNuOYWVJM6FcMs5p6xqvZ
ltizeKAjr1B1h4DvbQaqdO6/OAb+dGr7fJoIHEszDsJbW1cc0lUBitrxKHrPGovF
1uEW+3glA3SopveWB4GkKzcYlbqT5y1p/gQNwY8yuZr/6iF1hyF9mx/hU/+xjOMB
og3sGX4npcQegsAMw2y+zz9kJ9a6jlteNufi
=d2Fq
-----END PGP MESSAGE-----

Я знаю, что мне нужно получить случайный одноразовый ключ, который PGP использовал для шифрования файла, из данных в файле. Я знаю, что для этого мне нужно использовать SecKeyDecrypt с закрытым ключом, чтобы получить одноразовый ключ AES. Получив этот ключ, я могу расшифровать остальные данные.

Часть, с которой у меня проблемы, это какая часть данных подается в SecKeyDecrypt. Как происходит настройка файла PGP - первые 128 символов являются ключом AES? Если мое понимание неверно, мне нужно получить это отдельно от данных.

Если я запускаю, скажем, первые 128 символов как пустое место через функцию SecKeyDecrypt: (после удаления строк BEGIN PGP MESSAGE)

size_t dataLength = [theKey length]; 
size_t outputLength = MAX(128, SecKeyGetBlockSize(privateKeyRef));
void *outputBuf = malloc(outputLength);  

OSStatus err;

err = SecKeyDecrypt(privateKeyRef, kSecPaddingNone,//PKCS1, 
                                  (uint8_t *)theKey, dataLength,
                                 outputBuf, &outputLength);
if (err) {
    NSLog(@"something went wrong...err = %ld", err);
}

Я получаю это:

MRªh6∞bJ˘e £ т * а = œa ¢ Òt'ŸY ± éÿAÃîâG Î фи ≠ $ b≈tâç`yxk = uHªqu -, -. Din ^ ™ Э \> 5 ± ‡ Т.Б. € Kñ/≤sΩw-ïʃkafS˘À * Æôç «rAyv) фи] wOrμKz ^ ªq«àΣöÎ «ı * г <+ l˝ÄoΣ> г ≠ ¶ / ÷ EO & € PÒRåêM¶Ñ | Q $ á6În ^ võ¬Π · ч (ƒß • R≤ (фл ò (* • Аа

Я не знаю, что это за кодировка, но попытка получить ее из outputBuf в строку никогда не работает на 100%. Кажется, он изменяется независимо от того, какую кодировку я передаю. Если я сначала передам его NSData, я смогу вернуть исходную строку.

NSData *keyData = [NSData dataWithBytesNoCopy:outputBuf length:outputLength];
NSString *keyFromData = [[NSString alloc] initWithBytes:[keyData bytes] length:[keyData length] encoding:NSASCIIStringEncoding]; 

Затем я пытаюсь передать этот ключ в класс AES256DecryptWithKey, предоставив ему оставшиеся данные из файла PGP после первых 128 символов.

NSData *cipherText = [[NSData alloc]initWithData:[[bodyPart objectAtIndex:1]   dataUsingEncoding:NSUTF8StringEncoding]];

NSData *plain = [[NSData alloc] initWithData:[cipherText AES256DecryptWithKey:keyFromData]];
NSLog(@"after decrypting = %@", [[NSString alloc] initWithData:plain encoding:NSUTF8StringEncoding]);

Проблема:

Результирующие данные 'plain' печатаются как <>, то есть пустые. Моя проблема в том, что я даже не думаю, что знаю, как извлечь ключ из файла PGP.

Может кто-нибудь объяснить мне настройку файла PGP? Какая часть является «ключом», если она вообще отделена от данных? Это всегда одна и та же длина / одна и та же позиция? Если это НЕ отдельно, тогда я не знаю, как я вообще смогу это схватить. Я думаю, что остальные будут работать нормально. Я не получаю никаких ошибок или сбоев, это просто НЕ правильный ключ и / или данные, которые я передаю для расшифровки AES, я подозреваю, вероятно, сочетание ошибки кодирования строки и не захватывает правильное количество для комбинации ключ / право AES .

Примечание -

Я создал 3 разных текстовых файла и провел их через процесс PGP. Осматривая их, они все начинали с одинаковых 24 символов (qANQR1DBwEwDraQm2Kxa5GkB). Даже если я пропущу эти 24 через расшифровку, это не сработает, и у меня сложилось впечатление, что ключ AES, используемый PGP, отличается для каждого отдельного документа. Я понял это неправильно?

Спасибо за любой шаг в правильном направлении!

Отредактировано, чтобы добавить:

Только частично заметил мою ошибку - AES из 128 требует 16 бит, так что в любом случае я беру неправильную сумму, используя 128 символов, глупая ошибка, думаю, я слишком долго смотрел на это ... не работал Любое дешифрование, которое я выполняю, приводит к типу результата '⁄Ĉ ¢¡0M¶È2Cˆ¿ © gUú¨6iîΩ` & <% Jœv £ ¯nRb∆: (-%), что, на мой взгляд, означает, что я сделал что-то неправильно ИЛИ нужно что то делать дальше с кодировкой. </p>

Ответы [ 2 ]

2 голосов
/ 28 сентября 2013

Чтение RFC 4880. Этот файл представляет собой ASCII-защищенную коллекцию пакетов PGP.Есть 1 или более пакетов, которые содержат симметричный ключ, необходимый для дешифрования фактического сообщения, каждый из пакетов симметричного ключа зашифрован открытым ключом получателя.Только люди, обладающие правильным закрытым ключом, могут расшифровать пакет симметричного ключа и затем использовать этот симметричный ключ для расшифровки остальной части сообщения.

0 голосов
/ 09 июня 2012

Ключ AES действительно отличается. Он выбирается случайным образом и шифруется с помощью системы с открытым ключом (обычно RSA). Ключ Pub имеет свои затраты и ограничения, которые делают его непривлекательным для массового использования.

Возможно, вы захотите взглянуть на NetPGP, который является кодом C под Лицензия BSD, что означает, что вы можете включить или изменить ее не обременяя ваше приложение и не расстраивая Apple каким-либо образом (Конечно, вклад исходного кода или денег будет ценится проектом. Я не связан с ними.)

Стандарт OpenPGP - это много работы для реализации. Даже когда реализация работает, есть бесчисленное множество способы, которыми это может быть небезопасно.

...