我正在尝试用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
值? 最佳答案
您正在寻找函数SecKeyCopyAttributes
。当传递一个SecKey
时,此函数将返回一个包含键的CFDictionary
,该键包含描述该键的der编码属性序列:
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
}
无论如何,这不是一个直接的解决方案,但苹果从未因其直接加密而出名。
现在,您可以实现一个ASN.1解析器,或者尝试找到一个解析器并让它运行起来。但老实说,如果我是你,我会抄近路,把你需要的两个价值观拉出来。
下面是一个类似的ASN.1结构的虚拟分解,它是一个整数序列:
它的十六进制表示…
这些图像来自于这个excellent ASN.1 decoder here.。十六进制的突出显示部分是列表中的第二个整数,用于可见性。
您可以通过跳过
v_Data
头并计算每个整数的长度(字节的字面意思是“整数”)来提取所需的值。这样,您就可以精确定位结构中包含您的模和私有指数的位置。这件事的实施我就交给你了!