相关疑难解决方法(0)

在磁盘上保存SecKeyRef设备生成的公钥/私钥对

我在设备上使用SecKeyGeneratePair()设备生成了RSA对称密钥对.我SecKeyRef为每个键都有结构指针.那么,如何保存SecKeyRef到磁盘?甚至传输它(我也想象有正确编码的问题)?Apple的"证书,密钥和信任服务"指南说明

您可以将您的公钥发送给任何人,然后可以使用它来加密数据.

我想特别保存私钥; 所以我可以在部署的设备上使用它来解密用公钥加密的数据.

PS我不介意每个密钥的结果数据是DER编码的ASN.1还是base-64; 我只需要弄清楚如何从中取出钥匙SecKeyRef.我也非常清楚OS X的不存在SecKeychainItemExport().

security iphone cryptography ios

17
推荐指数
1
解决办法
8045
查看次数

iOS SecKeyRef到NSData

我有两个密钥,public和private,都存储在SecKeyRef变量中.为简单起见,让我们从公众开始吧.我想做的是将它导出到NSData对象.为此,Apple提供了一个几乎着名的代码片段,它位于:

- (NSData *)getPublicKeyBits {
    OSStatus sanityCheck = noErr;
    NSData * publicKeyBits = nil;

    NSMutableDictionary * queryPublicKey = [[NSMutableDictionary alloc] init];

    // Set the public key query dictionary.
    [queryPublicKey setObject:(id)kSecClassKey forKey:(id)kSecClass];
    [queryPublicKey setObject:publicTag forKey:(id)kSecAttrApplicationTag];
    [queryPublicKey setObject:(id)kSecAttrKeyTypeRSA forKey:(id)kSecAttrKeyType];
    [queryPublicKey setObject:[NSNumber numberWithBool:YES] forKey:(id)kSecReturnData];

    // Get the key bits.
    sanityCheck = SecItemCopyMatching((CFDictionaryRef)queryPublicKey, (CFTypeRef *)&publicKeyBits);

    if (sanityCheck != noErr)
    {
        publicKeyBits = nil;
    }

    [queryPublicKey release];

    return publicKeyBits;
}
Run Code Online (Sandbox Code Playgroud)

但是,我有Xcode 4.6.2,并且代码显示错误(在每次转换为id之前添加"__bridge").新版本看起来像这样:

- (NSData *)getPublicKeyBitsFromKey:(SecKeyRef)givenKey {
    OSStatus sanityCheck = noErr;
    NSData * publicKeyBits = nil; …
Run Code Online (Sandbox Code Playgroud)

rsa objective-c ios

16
推荐指数
1
解决办法
1万
查看次数

如何将非托管<SecKey>编码为base64以发送到另一台服务器?

我正在尝试使用密钥对加密来验证我的应用程序和我的PHP服务器之间的身份.为此,我需要在我的应用程序中生成公钥后将公钥发送到服务器.

if let pubKey = NSData(base64EncodedData: publicKey, options: NSDataBase64DecodingOptions.allZeros)! {
    println(pubKey)
}
Run Code Online (Sandbox Code Playgroud)

publicKey是类型的Unmanaged<SecKey>.

我在上面的代码中得到的错误是: Extra argument 'base64EncodedData' in call

我该怎么做?有没有更好的办法?

编辑:这是密钥对的生成方式:

var publicKeyPtr, privateKeyPtr: Unmanaged<SecKey>?
let parameters = [
    String(kSecAttrKeyType): kSecAttrKeyTypeRSA,
    String(kSecAttrKeySizeInBits): 2048
]
let result = SecKeyGeneratePair(parameters, &publicKeyPtr, &privateKeyPtr)
let publicKey = publicKeyPtr!.takeRetainedValue()
let privateKey = privateKeyPtr!.takeRetainedValue()
let blockSize = SecKeyGetBlockSize(publicKey)
Run Code Online (Sandbox Code Playgroud)

编辑2:所以问题是SecKey不是NSData,所以我的问题应该是:如何将publicKey:SecKey转换为NSData?

base64 public-key-encryption swift

3
推荐指数
1
解决办法
3448
查看次数