iOS上的PGP解密

时间:2011-09-20 05:10:36

标签: ios ipad encryption pgp pgp-desktop

我正在尝试在iPad上实现PGP文件的解密。我设置了一些测试.txt文件,然后我通过PGP桌面加密。

我使用SecPKCS12Import导入了用于加密文档的证书的私钥,然后从生成的SecIdentityRef中导入了SecIdentityCopyPrivateKey()。

如果我测试加密和解密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-----

我知道我需要从文件中的数据中获取用于加密文件的随机一次性密钥。我知道要这样做,我需要使用SecKeyDecrypt和私钥,以获得一次性AES密钥。一旦我拥有该密钥,我就可以解密其余的数据。

我遇到问题的部分是将哪部分数据提供给SecKeyDecrypt。如何设置PGP文件 - AES密钥的前128个字符?除非我的理解是错误的,否则我需要将其与数据分开。

如果我通过SecKeyDecrypt函数运行前128个字符作为空格:(在剥离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£T * A = OEA¢Òt'ŸY±éÿAÃîâG   Î音响≠$b≈tâç`yxk=uHªqu - , - 。DIN ^™E \> 5±‡TB€Kñ/≤sΩw-ïʃkafS˘À*Æôç«rAyv)音响]wOrμKz^ªq“àΣöΓ我*为r +l˝ÄoΣ>克≠¶/÷EO&安培;€PÒRåêM¶Ñ| Q $á6În^võ¬Π·H(ƒß•R≤(FLò(*•了Aa

我不知道这是什么编码,但是尝试将它从outputBuf转换为字符串永远不会100%工作。无论我传递什么编码,似乎都会被修改。如果我先将它传递给NSData,我可以返回原始字符串。

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

然后我尝试将该密钥传递给AES256DecryptWithKey类,在前128个字符之后为其提供PGP文件中的剩余数据。

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对于每个文档都是不同的。我弄错了吗?

感谢您朝着正确方向迈出的任何一步!

编辑添加:

部分注意到了我的错误 - 128的AES需要16位,所以无论哪种方式我使用128个字符都是错误的数量,愚蠢的错误,认为我一直在看这个太长了...把它翻过来没用。我所做的任何解密都会产生'/¢ï¡MMÈÈC2©gUú¨6iîΩ`&<%Jœv£nRbΔ:( - %'型结果,这对我来说意味着我做了一些事情错误或需要通过编码做进一步的事情。

2 个答案:

答案 0 :(得分:2)

读取RFC 4880.该文件是PGP数据包的ASCII-Armored集合。有1个或多个数据包包含解密实际消息所需的对称密钥,每个对称密钥数据包都使用接收者的公钥加密。只有拥有正确私钥的人才能解密对称密钥包,然后使用该对称密钥解密其余的消息。

答案 1 :(得分:0)

AES密钥确实不同。 它是随机选择的,并使用公钥系统(通常是RSA)加密。 Pub键具有成本和限制,使其无法用于批量生产。

您可能希望查看NetPGP,它是C下的C代码 BSD许可证,这意味着您可以合并或修改它 不会妨碍您的应用程序或以任何方式扰乱Apple。 (当然,源代码或金钱的贡献将是 受到该项目的赞赏。我不隶属于他们。)

OpenPGP标准需要做很多工作。 即使一个实施工作,也有无数 它可能是不安全的方式。