objectivepgp

CocoaPods Compatible Swift Package Manager compatible Platform Twitter

ObjectivePGP 是一个为 iOS 和 macOS 平台实现的 OpenPGP 协议。OpenPGP 是最广泛使用的电子邮件加密标准。它由互联网工程任务组 (IETF) 的 OpenPGP 工作组定义。

这里是 博客文章 的故事。

如何参与?

您想帮忙,太棒了!请继续 fork 我们的仓库,进行更改并向我们发送 pull request。

贡献

欢迎您贡献代码。请参阅 CONTRIBUTING.md
请创建 Pull Request

许可证

ObjectivePGP 采用双重许可证

不确定如何选择?查看 FAQ

安装

Swift Package Manager

dependencies: [
    .package(url: "https://github.com/krzyzanowskim/ObjectivePGP.git", .upToNextMinor(from: "0.99.4"))
]

CocoaPods

pod 'ObjectivePGP'

框架

ObjectivePGP 附带最新版本的 Frameworks,您可以复制并嵌入到您的项目中

用法

Objective-C

#import <ObjectivePGP/ObjectivePGP.h>

Swift

import ObjectivePGP
读取密钥(私钥或公钥)
NSArray<PGPKey *> *keys = [ObjectivePGP readKeysFromPath:@"/path/to/key.asc" error:nil];
let keys = try ObjectivePGP.readKeys(fromPath: "/path/to/key.asc")
密钥环

密钥环是一种存储(在内存中或磁盘上),用于保存各种 PGP 密钥。

PGPKeyring *keyring = ObjectivePGP.defaultKeyring;
PGPKeyring *keyring = [[PGPKeyring alloc] init];

NSArray<PGPKey *> *allKeys = keyring.keys;
[keyring importKeys:@[key]];
[keyring deleteKeys:@[key]];

[keyring importKey:@"979E4B03DFFE30C6" fromPath:@"/path/to/secring.gpg"];
PGPKey *key = [keyring findKeyWithIdentifier:@"979E4B03DFFE30C6"];
NSArray<PGPKey *> keys = [pgp findKeysForUserID:@"Name <email@example.com>"];
let keyring = ObjectivePGP.defaultKeyring
let keyring = Keyring()

let allKeys = keyring.keys
keyring.import(keys: [key])
keyring.delete(keys: [key])

keyring.import(keyIdentifier:"979E4B03DFFE30C6", fromPath:"/path/to/secring.gpg")
if let key = keyring.findKey("979E4B03DFFE30C6") {
	// key found in keyring
}

keyring.findKeys("Name <email@example.com>").forEach(key) {
	// process key
}
导出密钥(私钥或公钥)
// Write keyring to file
[[keyring export:error] writeToURL:[NSURL fileURLWithString:@"keyring.gpg"]];

// Public keys data
NSData *publicKeys = [keyring exportKeysOfType:PGPKeyTypePublic error:nil];
// Write keyring to file
try keyring.export().write(to: URL(fileURLWithPath: "keyring.gpg"))

// Public keys (Data)
let publicKeys = keyring.exportKeys(of: .public)
签名 & 验证数据(或文件)

使用密钥对数据进行签名

NSData *signature = [ObjectivePGP sign:fileContent detached:YES usingKeys:@[key] passphraseForKey:nil error:nil];
[ObjectivePGP verify:fileContent withSignature:signature usingKeys:@[key] passphraseForKey:nil error:nil];
let signature = try ObjectivePGP.sign(encryptedBin, detached:true, using: [key1])
try ObjectivePGP.verify(encryptedBin, withSignature: signature, using: [key1])
加密 & 解密
NSData *encrypted = [ObjectivePGP encrypt:fileContent addSignature:YES usingKeys:@[key] passphraseForKey:nil error:nil];
[ObjectivePGP decrypt:encrypted andVerifySignature:YES usingKeys:@[key] passphraseForKey:nil error:nil];
let encrypted = try ObjectivePGP.encrypt(fileContent), addSignature: true, using: [key1, key2])
let decrypted = try ObjectivePGP.decrypt(encrypted, andVerifySignature: true, using: [key1])
生成新的密钥对
PGPKeyGenerator *generator = [[PGPKeyGenerator alloc] init];
PGPKey *key = [generator generateFor:@"Marcin <marcin@example.com>" passphrase:nil];
NSData *publicKeyData = [key export:PGPKeyTypePublic error:nil];
NSData *secretKeyData = [key export:PGPKeyTypeSecret error:nil];
let key = KeyGenerator().generate(for: "marcin@example.com", passphrase: "password")
let publicKey = try key.export(keyType: .public)
let secretKey = try key.export(keyType: .secret)

ASCII 盔甲

ASCII 盔甲是一种二进制到文本的编码转换器。ASCII 盔甲涉及将加密消息包裹在 ASCII 中,以便它们可以通过标准消息格式(如电子邮件)发送。

示例

-----BEGIN PGP PUBLIC KEY BLOCK-----
Comment: For more info see https://www.objectivepgp.org

[...]
-----END PGP PUBLIC KEY BLOCK-----

PGPArmor 可用于将二进制格式转换为 ASCII 格式

NSString *armoredKey = [PGPArmor armoredData:encrypted as:PGPArmorPublicKey];
let armoredKey = Armor.armored(Data(), as: .publicKey)

手动转换时,重要的是使用正确的 PGPArmorType 值来定义标头。这可能是一个棘手的部分,所以这里有一个速查表

类型数据 PGPArmorType 示例
已加密 PGPArmorMessage Armor.armored(ObjectivePGP.encrypt(...), as: .message)
已解密 PGPArmorMessage Armor.armored(ObjectivePGP.decrypt(...), as: .message)
公钥 PGPArmorTypePublic Armor.armored(key.export(), as: .publicKey)
私钥 PGPArmorTypeSecret Armor.armored(key.export(), as: .secretKey)

对于任何加密结果,类型都是 PGPArmorMessage

更新日志

请参阅 CHANGELOG

已知限制

安全审计

迄今为止,ObjectivePGP 代码库已接受来自 Cure53 的完整安全审计。

致谢

本产品使用由 OpenSSL 项目开发的软件,用于 OpenSSL 工具包。(http://www.openssl.org/)

作者

Marcin Krzyżanowski