我正在尝试在iPad上实现PGP文件的解密。我设置了一些测试.txt文件,然后通过PGP桌面对其进行了加密。我已经使用SecPKCS12Import导入了用于加密文档的证书的私钥,然后从生成的SecIdentityRef中导入了SecIdentityCopyPrivateKey()。如果我使用cert的公钥和私钥在Objective C中测试对简单字符串的加密和解密,则效果很好。现在,我正在尝试实际的PGP解密,我有些困惑……从.pgp文件中读取文本,我得到:-----BEGIN PGP MESSAGE-----Version: 10.1.1.10qANQR1DBwEwDraQm2Kxa5GkBB/4yLebeLk10C2DVvHpQL20E0DThhgQlTasXo+YJpLp5Ig2hHu4Xx0m74D3vfyWpA2XQA02TMAHO9lhNfkE234c/ds05D1UyQkJEoqW+joEcbRT5rlGN3qrMf1FXv8/01EHH0dgeD6mAkkDeDEorIirYHCF6+QVkedaphZLsc63GmcikzkWZT/vv20ICL3Ys0DaC3P9zu0T1GtjkmQ062kaTab/VBJnQrsY/y1JUypmbW9bbFeZMcAqXHMqpjw49K5UluIJaDbRNAjIvHTFLNuOYWVJM6FcMs5p6xqvZltizeKAjr1B1h4DvbQaqdO6/OAb+dGr7fJoIHEszDsJbW1cc0lUBitrxKHrPGovF1uEW+3glA3SopveWB4GkKzcYlbqT5y1p/gQNwY8yuZr/6iF1hyF9mx/hU/+xjOMBog3sGX4npcQegsAMw2y+zz9kJ9a6jlteNufi=d2Fq-----END PGP MESSAGE-----我知道我需要从文件中的数据中获取PGP用于加密文件的随机一次性密钥。我知道要这样做,我需要将SecKeyDecrypt与私钥一起使用,以获得一次性AES密钥。一旦有了该密钥,就可以解密其余数据。我遇到的问题是将数据的哪一部分馈入SecKeyDecrypt。 PGP文件的设置方式-前128个字符是AES密钥吗?除非我的理解是错误的,否则我需要将其与数据分开。例如,如果我运行,则通过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¢Òt’ŸY±éÿAÃâââG ∑≠$b≈tâç`yxk=uHªqu-,–dïn^™È\› 5±tb。‡€Kñ⁄≤sΩw–ïʃkafS˘À *Æô竡rAyv))] worµKz ^ªq“à∑öΔ * r 我不知道这是什么编码,但是尝试将其从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ˆ¿需要对编码做进一步的处理。 最佳答案 阅读RFC4880。该文件是PGP数据包的ASCII压缩的集合。有1个或多个包含解密实际消息所需的对称密钥的数据包,每个对称密钥数据包都使用收件人的 public 密钥加密。只有拥有正确私钥的人才能解密对称密钥包,然后使用该对称密钥解密其余消息。关于ios - iOS上的PGP解密,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7480425/ 10-10 23:25