草庐IT

ios - iOS 上的 PGP 解密

coder 2024-01-22 原文

我正在尝试在 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 用于加密文件的随机一次性 key 。我知道要做到这一点,我需要将 SecKeyDecrypt 与私钥一起使用,以获得一次性 AES key 。获得该 key 后,我就可以解密其余数据。

我遇到问题的部分是将数据的哪一部分输入到 SecKeyDecrypt 中。 PGP 文件设置如何 - 前 128 个字符是 AES key 吗?除非我的理解有误,否则我需要将其与数据分开。

如果我通过 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 Î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≤(flò(*•Aa

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

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

然后我尝试将该 key 传递给 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 文件中获取 key 。

任何人都可以向我解释 PGP 文件设置吗?如果它实际上与数据完全分开,那么哪一部分是“关键”?它总是相同的长度/相同的位置吗?如果它不是分开的,那么我根本不知道我怎么能捕获它。我认为其余的都可以正常工作。我没有收到任何错误或崩溃,这不是我为 AES 解密传递的正确 key 和/或数据,我怀疑可能是字符串编码错误的组合,并且没有为 AES key /正确组合获取正确的数量.

注意-

我创建了 3 个不同的文本文件并通过 PGP 过程运行它们。检查它们,它们都以相同的 24 个字符 (qANQR1DBwEwDraQm2Kxa5GkB) 开头。即使我通过解密传递了这 24 个,它也不起作用,而且我的印象是 PGP 使用的 AES key 对于每个文档都是不同的。我是不是听错了?

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

编辑添加:

只是部分注意到我的错误 - 128 的 AES 需要 16 位,所以无论哪种方式我都使用 128 个字符来获取错误的数量,愚蠢的错误,认为我已经看这个太久了......换掉它并没用。我所做的任何解密都会导致 '⁄Ä^¢ï¡0M¶È2C^¿©gUú¨6iîΩ`&<%Jœv£¯nRb∆:(–%' 类型的结果,这对我来说意味着我做错了什么或者需要进一步处理编码。

最佳答案

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

关于ios - iOS 上的 PGP 解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7480425/

上一篇:iphone - 应用程序名称的 iTunes 搜索结果

下一篇:iphone - 如何为大型数据集创建 UITableView 索引

相关文章:

iphone - 一个 iPad 应用程序可以直接启动另一个应用程序吗?

java - 在app2中接收时,response.sendRedirect用加密的URL中的空格替换+吗?

java - php mcrypt_encrypt 结果不等于 java gnu-crypto

java - 相当于java中的OpenSSL命令

iphone - 媒体播放器框架 iOS SDK

ios - 通过RTMP从Wowza实时流式传输到iOS

ios - 如何使用 assetslibrary 框架将图像保存在与 ipad 上的照片文件夹不同的文件夹中

ios - Superview 没有收到触摸事件

ios - iOS,如何将语言环境强制为一种语言

ios - 如何在iOS中为从右向左扩展的搜索字段设置动画

©2023 IT工具网

有关ios - iOS 上的 PGP 解密的更多相关文章

  1. ruby-on-rails - date_field_tag,如何设置默认日期? [ rails 上的 ruby ] - 2

    我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问

  2. ruby-on-rails - openshift 上的 rails 控制台 - 2

    我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新ruby​​gems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems

  3. ruby-on-rails - 相关表上的范围为 "WHERE ... LIKE" - 2

    我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que

  4. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  5. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  6. 区块链之加解密算法&数字证书 - 2

    目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非

  7. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  8. ruby - Ruby 中的单 block AES 解密 - 2

    我需要尝试一些AES片段。我有一些密文c和一个keyk。密文已使用AES-CBC加密,并在前面加上IV。不存在填充,纯文本的长度是16的倍数。所以我这样做:aes=OpenSSL::Cipher::Cipher.new("AES-128-CCB")aes.decryptaes.key=kaes.iv=c[0..15]aes.update(c[16..63])+aes.final它工作得很好。现在我需要手动执行CBC模式,所以我需要单个block的“普通”AES解密。我正在尝试这个:aes=OpenSSL::Cipher::Cipher.new("AES-128-ECB")aes.dec

  9. ruby-on-rails - Ruby - 如何从 ruby​​ 上的 .pfx 文件中提取公钥、rsa 私钥和 CA key - 2

    我有一个.pfx格式的证书,我需要使用ruby​​提取公共(public)、私有(private)和CA证书。使用shell我可以这样做:#ExtractPublicKey(askforpassword)opensslpkcs12-infile.pfx-outfile_public.pem-clcerts-nokeys#ExtractCertificateAuthorityKey(askforpassword)opensslpkcs12-infile.pfx-outfile_ca.pem-cacerts-nokeys#ExtractPrivateKey(askforpassword)o

  10. ruby - 为什么不能使用类IO的实例方法noecho? - 2

    print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上

随机推荐