我正在尝试在 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-----
我知道我需要从文件中的数据中获取 PGP 用来加密文件的随机一次性密钥。我知道要做到这一点,我需要将 SecKeyDecrypt 与私钥一起使用,以获取一次性 AES 密钥。一旦我有了那个密钥,我就可以解密其余的数据。
我遇到的问题是将哪一部分数据输入 SecKeyDecrypt。PGP 文件设置如何 - 前 128 个字符是 AES 密钥吗?除非我的理解是错误的,否则我需要将其与数据分开。
如果我通过 SecKeyDecrypt 函数将前 128 个字符作为 void 运行:(在剥离 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¢Òt'ŸY±éÿAÃîâG Îfi≠$b≈tâç`yxk=uHªqu-,–dïn^™È\›5±tb.‡€Kñ⁄≤sΩw–ïʃkafS ˘À*Æô竡rAyv)fi]wOrµKz^ªq“à∑öΓı*r<+l˝Äo∑›g≠¶/÷eÔ&€PÒRåêM¶Ñ|Q$á6În^võ¬∏·h(ƒß• R≤(fò(*•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]);
问题:
结果数据“纯”打印为<>,即为空。我的问题是我什至不认为我知道如何从 PGP 文件中获取密钥。
谁能向我解释 PGP 文件设置?如果它实际上与数据完全分开,那么“关键”是什么部分?它总是相同的长度/相同的位置吗?如果它不是分开的,那么我根本不知道我怎么能抓住它。我认为其余的工作会很好。我没有收到任何错误或崩溃,这不是我为 AES 解密传递的正确密钥和/或数据,我怀疑可能是字符串编码错误的组合,并且没有为 AES 密钥/正确组合获取正确的数量.
笔记 -
我创建了 3 个不同的文本文件并通过 PGP 进程运行它们。检查它们,它们都以相同的 24 个字符 (qANQR1DBwEwDraQm2Kxa5GkB) 开头。即使我通过解密传递了这 24 个,它也不起作用,而且我的印象是每个文档使用的 AES 密钥 PGP 都不同。我弄错了吗?
感谢您朝着正确方向迈出的任何一步!
编辑添加:
只是部分注意到我的错误 - 128 的 AES 需要 16 位,所以无论哪种方式,我都使用 128 个字符来取错数量,愚蠢的错误,认为我一直在看这个太久......换掉它并没有工作。我所做的任何解密都会导致 '⁄Ĉ¢ï¡0M¶È2Cˆ¿©gUú¨6iîΩ`&<%Jœv£¯nRbΔ:(–%' 类型结果,这对我来说意味着我做错了什么或需要对编码做进一步的事情。