我正在尝试在Swift中实现姚明的百万富翁问题算法,并且遇到了麻烦。
要实现此算法,我需要生成一个RSA私钥并获取n
和d
。
到目前为止,我已经创建了这样的密钥:
import Security
import Foundation
let tag = "com.example.keys.mykey".data(using: .utf8)!
let attributes: [String: Any] = [kSecAttrKeyType as String: kSecAttrKeyTypeRSA,
kSecAttrKeySizeInBits as String: 1024,
kSecPrivateKeyAttrs as String:
[kSecAttrIsPermanent as String: false,
kSecAttrApplicationTag as String: tag]
]
var error: Unmanaged<CFError>?
guard let privateKey = SecKeyCreateRandomKey(attributes as CFDictionary, &error) else {
throw error!.takeRetainedValue() as Error
}
privateKey
似乎是SecKey
类型,但我不知道如何从中获取n
和d
。
如何生成RSA私钥并获取n
和d
值?
答案 0 :(得分:2)
您正在寻找功能SecKeyCopyAttributes
。传递SecKey
时,此函数将返回一个包含密钥CFDictionary
的{{1}},该密钥包含描述密钥的DER编码属性序列:
v_Data
绝不是直接解决方案,但苹果从未以其直接加密技术而闻名。
现在,您可以实现ASN.1解析器,或者尝试找到一个解析器并将其运行。但老实说,如果我是你,我只是将其快捷方式并仅提取您需要的两个值。
这里是类似ASN.1结构的虚拟细分,该结构是整数序列:
及其十六进制表示形式...
这些图像来自此excellent ASN.1 decoder here.。十六进制的突出显示部分是列表中的 second 整数,以降低可见性。
您可以通过跳过PrivateKey ::= SEQUENCE {
version INTEGER,
modulus INTEGER, <- n
publicExponent INTEGER,
privateExponent INTEGER, <- d
prime1 INTEGER,
prime2 INTEGER,
exponent1 INTEGER,
exponent2 INTEGER,
coefficient INTEGER,
otherPrimeInfos OtherPrimeInfos OPTIONAL
}
标头并计算每个整数的长度来提取所需的值(SEQUENCE
字节的字面意思是“ INTEGER”)。这样做,您可以查明结构中包含模数和私有指数的位置。
我会留给你实现的方法!
答案 1 :(得分:2)
由于卢克(Luke)的回答,我将其按如下方式工作。我决定使用BigInt swift软件包。
import BigInt
var error2: Unmanaged<CFError>?
let privateKeyData = SecKeyCopyExternalRepresentation(privateKey!, &error2) as Data?
let privateKeyDataN = privateKeyData![10...10+128]
let privateKeyDataD = privateKeyData![147...147+127]
let n = BigUInt(privateKeyDataN)
let d = BigUInt(privateKeyDataD)