RSA 公钥导入器和导出器

用于 RSA 公钥的 ASN.1 DER 编码的导入器和导出器。

Swift Version License

本项目包含 RSAPublicKeyImporterRSAPublicKeyExporter 模块,使用 Swift 编写,并包含一个导入器和导出器,可用于在 RSA 公钥的 ASN.1 DER 编码与 Apple 生态系统之外的工具和编程语言(例如 OpenSSL、Java、PHP 和 Perl)常用的格式之间进行转换。

请注意,Apple 生态系统中实际上对两种编码格式都提供了非常可靠的内置支持,这意味着 RSAPublicKeyImporter 模块在某种程度上是多余的。但是,此模块可用于测试具有实际应用的 RSAPublicKeyExporter 模块(或者至少在 Apple 没有内置支持导出 RSA 公钥的情况下)。无论如何,这两个模块都被认为是 simple-asn1-reader-writer 项目中的 SimpleASN1ReaderSimpleASN1Writer 模块如何使用的基本示例。

用法

rsa-public-key-importer-exporter 是一个 SwiftPM 项目,可以使用以下命令构建、测试和运行

$ swift build
$ swift test
$ swift run RSAPublicKeyImportExportDemo

要依赖 rsa-public-key-importer-exporter,请将以下内容放入您的 Package.swiftdependencies

.package(url: "https://github.com/nextincrement/rsa-public-key-importer-exporter.git", from: "0.1.0"),

代码示例

import RSAPublicKeyImporter

[...]

let subjectPublicKeyInfoData = [...]

let rsaPublicKeyData = try RSAPublicKeyImporter().fromSubjectPublicKeyInfo(subjectPublicKeyInfoData)
import RSAPublicKeyExporter

[...]

let rsaPublicKeyData = [...]

let subjectPublicKeyInfoData = RSAPublicKeyExporter().toSubjectPublicKeyInfo(rsaPublicKeyData)

一起使用 RSAPublicKeyImporter 和 RSAPublicKeyExporter

创建一个公钥(例如使用 OpenSSL)

$ openssl genrsa -out key.pem 2048
$ openssl rsa -in key.pem -outform PEM -pubout -out public.pem

key.pem 文件中提取 Base64 编码的 DER 编码,将其粘贴到 此文件 中(或者只需保持示例密钥不变),然后运行演示。

$ swift run RSAPublicKeyImportExportDemo

预期输出

X.509 encoded RSA public key as a Base64 string:
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3o1GZDe0ivcgcWetu82mX+G7G5P9Ztsq5xptSmzL36mfyxUjrctA2MCY
0n604s5Gmv3hrrYgUiRndhmITPngnXiKUst+CV4uWEcwqe3qHRfrTXcCMhsOLd8OPmOkOHlsXwwM1OOGnHeQd5bRkCt43haSMrv5
5LeHH7JRo7+d9b08G04Ih1PAHzQCgfkwgJK+M5fU0k+sP4qeKcj3iFanGkCkl0eVcVbEoW7E9dQfg1VBT+DKbioW3xImBc2Rw+fo
2j2gPVNKqvYGXEj3INvEgPxNtqk4DJ4DC+1FyYu94XM/qEVUQ8fKX0kzmDoDQ2WCFBbzO+yCLqpMiscgBH9XpwIDAQAB

...same X.509 encoded RSA public key as an array of hex values:
30 82 01 22 30 0d 06 09 2a 86 48 86 f7 0d 01 01 01 05 00 03 82 01 0f 00 30 82 01 0a 02 82 01 01 00
de 8d 46 64 37 b4 8a f7 20 71 67 ad bb cd a6 5f e1 bb 1b 93 fd 66 db 2a e7 1a 6d 4a 6c cb df a9 9f
cb 15 23 ad cb 40 d8 c0 98 d2 7e b4 e2 ce 46 9a fd e1 ae b6 20 52 24 67 76 19 88 4c f9 e0 9d 78 8a
52 cb 7e 09 5e 2e 58 47 30 a9 ed ea 1d 17 eb 4d 77 02 32 1b 0e 2d df 0e 3e 63 a4 38 79 6c 5f 0c 0c
d4 e3 86 9c 77 90 77 96 d1 90 2b 78 de 16 92 32 bb f9 e4 b7 87 1f b2 51 a3 bf 9d f5 bd 3c 1b 4e 08
87 53 c0 1f 34 02 81 f9 30 80 92 be 33 97 d4 d2 4f ac 3f 8a 9e 29 c8 f7 88 56 a7 1a 40 a4 97 47 95
71 56 c4 a1 6e c4 f5 d4 1f 83 55 41 4f e0 ca 6e 2a 16 df 12 26 05 cd 91 c3 e7 e8 da 3d a0 3d 53 4a
aa f6 06 5c 48 f7 20 db c4 80 fc 4d b6 a9 38 0c 9e 03 0b ed 45 c9 8b bd e1 73 3f a8 45 54 43 c7 ca
5f 49 33 98 3a 03 43 65 82 14 16 f3 3b ec 82 2e aa 4c 8a c7 20 04 7f 57 a7 02 03 01 00 01

Result of a call to the fromSubjectPublicKeyInfo(_:) function as an array of hex values:
30 82 01 0a 02 82 01 01 00 de 8d 46 64 37 b4 8a f7 20 71 67 ad bb cd a6 5f e1 bb 1b 93 fd 66 db 2a
e7 1a 6d 4a 6c cb df a9 9f cb 15 23 ad cb 40 d8 c0 98 d2 7e b4 e2 ce 46 9a fd e1 ae b6 20 52 24 67
76 19 88 4c f9 e0 9d 78 8a 52 cb 7e 09 5e 2e 58 47 30 a9 ed ea 1d 17 eb 4d 77 02 32 1b 0e 2d df 0e
3e 63 a4 38 79 6c 5f 0c 0c d4 e3 86 9c 77 90 77 96 d1 90 2b 78 de 16 92 32 bb f9 e4 b7 87 1f b2 51
a3 bf 9d f5 bd 3c 1b 4e 08 87 53 c0 1f 34 02 81 f9 30 80 92 be 33 97 d4 d2 4f ac 3f 8a 9e 29 c8 f7
88 56 a7 1a 40 a4 97 47 95 71 56 c4 a1 6e c4 f5 d4 1f 83 55 41 4f e0 ca 6e 2a 16 df 12 26 05 cd 91
c3 e7 e8 da 3d a0 3d 53 4a aa f6 06 5c 48 f7 20 db c4 80 fc 4d b6 a9 38 0c 9e 03 0b ed 45 c9 8b bd
e1 73 3f a8 45 54 43 c7 ca 5f 49 33 98 3a 03 43 65 82 14 16 f3 3b ec 82 2e aa 4c 8a c7 20 04 7f 57
a7 02 03 01 00 01

...same result as a Base64 string:
MIIBCgKCAQEA3o1GZDe0ivcgcWetu82mX+G7G5P9Ztsq5xptSmzL36mfyxUjrctA2MCY0n604s5Gmv3hrrYgUiRndhmITPngnXiK
Ust+CV4uWEcwqe3qHRfrTXcCMhsOLd8OPmOkOHlsXwwM1OOGnHeQd5bRkCt43haSMrv55LeHH7JRo7+d9b08G04Ih1PAHzQCgfkw
gJK+M5fU0k+sP4qeKcj3iFanGkCkl0eVcVbEoW7E9dQfg1VBT+DKbioW3xImBc2Rw+fo2j2gPVNKqvYGXEj3INvEgPxNtqk4DJ4D
C+1FyYu94XM/qEVUQ8fKX0kzmDoDQ2WCFBbzO+yCLqpMiscgBH9XpwIDAQAB

Result of a call to the toSubjectPublicKeyInfo(_:) function as an array of hex values:
30 82 01 22 30 0d 06 09 2a 86 48 86 f7 0d 01 01 01 05 00 03 82 01 0f 00 30 82 01 0a 02 82 01 01 00
de 8d 46 64 37 b4 8a f7 20 71 67 ad bb cd a6 5f e1 bb 1b 93 fd 66 db 2a e7 1a 6d 4a 6c cb df a9 9f
cb 15 23 ad cb 40 d8 c0 98 d2 7e b4 e2 ce 46 9a fd e1 ae b6 20 52 24 67 76 19 88 4c f9 e0 9d 78 8a
52 cb 7e 09 5e 2e 58 47 30 a9 ed ea 1d 17 eb 4d 77 02 32 1b 0e 2d df 0e 3e 63 a4 38 79 6c 5f 0c 0c
d4 e3 86 9c 77 90 77 96 d1 90 2b 78 de 16 92 32 bb f9 e4 b7 87 1f b2 51 a3 bf 9d f5 bd 3c 1b 4e 08
87 53 c0 1f 34 02 81 f9 30 80 92 be 33 97 d4 d2 4f ac 3f 8a 9e 29 c8 f7 88 56 a7 1a 40 a4 97 47 95
71 56 c4 a1 6e c4 f5 d4 1f 83 55 41 4f e0 ca 6e 2a 16 df 12 26 05 cd 91 c3 e7 e8 da 3d a0 3d 53 4a
aa f6 06 5c 48 f7 20 db c4 80 fc 4d b6 a9 38 0c 9e 03 0b ed 45 c9 8b bd e1 73 3f a8 45 54 43 c7 ca
5f 49 33 98 3a 03 43 65 82 14 16 f3 3b ec 82 2e aa 4c 8a c7 20 04 7f 57 a7 02 03 01 00 01

...same result as a Base64 string:
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3o1GZDe0ivcgcWetu82mX+G7G5P9Ztsq5xptSmzL36mfyxUjrctA2MCY
0n604s5Gmv3hrrYgUiRndhmITPngnXiKUst+CV4uWEcwqe3qHRfrTXcCMhsOLd8OPmOkOHlsXwwM1OOGnHeQd5bRkCt43haSMrv5
5LeHH7JRo7+d9b08G04Ih1PAHzQCgfkwgJK+M5fU0k+sP4qeKcj3iFanGkCkl0eVcVbEoW7E9dQfg1VBT+DKbioW3xImBc2Rw+fo
2j2gPVNKqvYGXEj3INvEgPxNtqk4DJ4DC+1FyYu94XM/qEVUQ8fKX0kzmDoDQ2WCFBbzO+yCLqpMiscgBH9XpwIDAQAB

Success!

依赖项

rsa-public-key-importer-exporter 依赖于以下内容

资源

ASN.1、BER 和 DER 子集的通俗指南

X.690 (ASN.1 编码格式:BER、DER 和 CER)

RFC 5280 (X.509 v3)

RFC 8017 (PKCS #1 v2.2)

许可证

rsa-public-key-importer-exporter 在 MIT 许可证下获得许可。有关详细信息,请参阅 LICENSE。