【发布时间】:2020-02-23 07:54:35
【问题描述】:
我已经使用以下代码快速生成了私钥:
let publicKeyAttr: [NSObject: NSObject] = [
kSecAttrIsPermanent:true as NSObject,
kSecAttrApplicationTag:"com.xeoscript.app.RsaFromScrach.public2".data(using: String.Encoding.utf8)! as NSObject] // added this value
let privateKeyAttr: [NSObject: NSObject] = [
kSecAttrIsPermanent:true as NSObject,
kSecAttrApplicationTag:"com.xeoscript.app.RsaFromScrach.private2".data(using: String.Encoding.utf8)! as NSObject] // added this
var keyPairAttr = [NSObject: NSObject]()
keyPairAttr[kSecAttrKeyType] = kSecAttrKeyTypeRSA
keyPairAttr[kSecAttrKeySizeInBits] = 2048 as NSObject
keyPairAttr[kSecPublicKeyAttrs] = publicKeyAttr as NSObject
keyPairAttr[kSecPrivateKeyAttrs] = privateKeyAttr as NSObject
statusCode = SecKeyGeneratePair(keyPairAttr as CFDictionary, &publicKey, &privateKey)
然后我使用私钥对一条数据进行签名,使用SecKeyAlgorithm.rsaEncryptionPKCS1算法。
签名代码如下:
public func sign(privateKey myPrivateKey: SecKey, value: String, base64EncodingOptions: Data.Base64EncodingOptions = []) throws -> String?
{
enum LoginErrors: Error {
case badUsername
case badPassword
}
guard #available(iOS 10.0, watchOS 3.0, tvOS 10.0, *) else {
return "Not available"
}
let data = value.data(using: .utf8)!
var error: Unmanaged<CFError>?
guard let signedData = SecKeyCreateSignature(myPrivateKey,
SecKeyAlgorithm.rsaEncryptionPKCS1,
data as CFData,
&error) as Data? else
{
return nil
}
return "(signedData.base64EncodedString())"
}
我遇到了这个异常:
[0] (null) "NSDescription" : "algid:encrypt:RSA:PKCS1: algorithm not supported by the key <SecKeyRef algorithm id: 1, key type: RSAPrivateKey, version: 4, block size: 2048 bits, addr: 0x280a0e5a0>"
【问题讨论】:
-
无法测试代码,但您确定您不是要将
SecKeyAlgorithm.rsaSignatureDigestPKCS1v15SHA256之类的内容传递给 createsignature 调用吗?将加密算法标识符 . 传递给 CreateSignature 调用似乎很奇怪。 -
@JoachimIsaksson 哪个部分不适合您?我可以提供更多代码实际上我仍在研究要使用的算法。我的 java 服务器在注册期间存储公钥,下次设备想要与服务器通信时,它会从设备发送带有私钥的签名数据。如果我使用
SecKeyAlgorithm.rsaSignatureDigestPKCS1v15SHA256验证在服务器端失败。 java服务器使用RSA,SHA256withRSA算法进行验证。
标签: java ios swift iphone cryptography