使用Swift生成base64 url编码的X.509格式2048位RSA公钥?

丹尼尔·特穆斯克(Tanel Teemusk)

在Apple Swift for iOS中工作。我必须为后端生成此文件,因为它是安全的应用程序。

我是安全和证书的新手,并且一直在搜索无结果的一天。

如何快速生成base64 url​​编码的X.509格式2048位RSA公钥?

非常感谢您的帮助。

亨利·诺马克(Henri Normak)

我最近在Swift中创建了一个用于处理公私钥对的库,即Heimdall,该库使您可以轻松导出X.509格式的公钥Base64字符串。

为了遵守SO规则,我还将在该答案中包括实现(这样是不言自明的)

public func X509PublicKey() -> NSString? {
    // Fetch the key, so that key = NSData of the public key
    let result = NSMutableData()

    let encodingLength: Int = {
        if key.length + 1 < 128 {
            return 1
        } else {
            return ((key.length + 1) / 256) + 2
        }
    }()

    let OID: [CUnsignedChar] = [0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
        0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00]

    var builder: [CUnsignedChar] = []

    // ASN.1 SEQUENCE
    builder.append(0x30)

    // Overall size, made of OID + bitstring encoding + actual key
    let size = OID.count + 2 + encodingLength + key.length
    let encodedSize = encodeLength(size)
    builder.extend(encodedSize)
    result.appendBytes(builder, length: builder.count)
    result.appendBytes(OID, length: OID.count)
    builder.removeAll(keepCapacity: false)

    builder.append(0x03)
    builder.extend(encodeLength(key.length + 1))
    builder.append(0x00)
    result.appendBytes(builder, length: builder.count)

    // Actual key bytes
    result.appendData(key)

    // Convert to Base64 and make safe for URLs
    var string = result.base64EncodedStringWithOptions(.allZeros)
    string = string.stringByReplacingOccurrencesOfString("/", withString: "_")
    string = string.stringByReplacingOccurrencesOfString("+", withString: "-")

    return string
}

public func encodeLength(length: Int) -> [CUnsignedChar] {
    if length < 128 {
        return [CUnsignedChar(length)];
    }

    var i = (length / 256) + 1
    var len = length
    var result: [CUnsignedChar] = [CUnsignedChar(i + 0x80)]

    for (var j = 0; j < i; j++) {
        result.insert(CUnsignedChar(len & 0xFF), atIndex: 1)
        len = len >> 8
    }

    return result
}

我删除了数据获取代码,请参阅Heimdall的源代码或Jeff Hay的答案

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用Java在Base64中从URL编码图像

RSA在Android中使用base64编码的公钥进行加密

使用x509.MarshalPKCS1PublicKey随时生成RSA公钥

无法从Golang中的iOS解析base64 DER编码的ASN.1公钥

为什么Go在base64编码中使用位运算?

如何为Android N证书固定生成X.509证书的SubjectPublicKeyInfo的Base64编码的SHA256散列?

Swift 2的Base64编码/解码

干预图像-以base64编码格式保存到变量

RSA公钥生成-Swift

如何解码文件中base64格式的编码值?

使用base64编码大文件

如何在Angular 6中显示以base64格式编码的图像?

生成base-64编码的X509证书对(公共/私有

从URL同步base64编码

在WSO2 EI 6.3.0中将Base64 URL转换为Base64编码格式

Flutter:如何以Base64格式编码和解码音频文件?

Writin base64编码的图像以钛金格式归档

以JSON格式返回Base64编码的缩略图还是仅向其返回URL?

是否可以将任何类型(Url)转换为base64格式

PHP RSA公钥base64编码

使用base64编码字符串生成PDF

从base64 RSA公钥生成SecKeyRef

使用PHP解码16位的BASE64编码的带符号整数

使用来自 X509 证书 C++ 的公钥的 RSA 公共加密

在 OpenSSL 中使用 DER 编码的 RSA 公钥

Keytool - 使用现有的私钥生成 X.509 格式的公钥

如何使用公钥加密并使用 Javascript(NodeJS 等)使用 Base64 进行编码

如何以这种格式对 php 进行 base64 编码?

如何使用公钥加密数据并在python中使用base64对其进行编码?