获取RSA私钥';s n和d使用Swift
我试图在Swift中实现姚明的百万富翁问题算法,但遇到了一个障碍 为了实现这个算法,我需要生成一个RSA私钥并获取获取RSA私钥';s n和d使用Swift,swift,cryptography,rsa,Swift,Cryptography,Rsa,我试图在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,
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
}
导入安全性
进口基金会
让tag=“com.example.keys.mykey”。数据(使用:.utf8)!
let attributes:[String:Any]=[kSecAttrKeyType as String:kSecAttrKeyTypeRSA,
kSecAttrKeySizeInBits作为字符串:1024,
kSecPrivateKeyAttrs作为字符串:
[kSecAttrIsPermanent作为字符串:false,
kSecAttrApplicationTag作为字符串:tag]
]
var错误:非托管?
guard let privateKey=SecKeyCreateRandomKey(属性为CFDictionary,&错误)else{
抛出错误!.takeRetainedValue()作为错误
}
privateKey
似乎属于SecKey
类型,但我不知道如何从中获取n
和d
如何生成RSA私钥并获取
n
和d
值?您正在寻找函数。当传递一个SecKey
时,此函数将返回一个CFDictionary
,其中包含一个键v_Data
,该键包含一个描述该键的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
}
PrivateKey::=序列{
版本整数,
模整数,多亏了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)
导入BigInt
变量错误2:非托管?
让privateKeyData=SecKeyCopyExternalRepresentation(privateKey!,&error2)作为数据?
让privateKeyDataN=privateKeyData![10…10+128]
让privateKeyDataD=privateKeyData![147…147+127]
设n=BigUInt(privateKeyDataN)
设d=BigUInt(privateKeyDataD)