- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我用 SecKeyGeneratePair
生成了私钥和公钥我已经将 SecKeyRef
转换为 NSData
size_t keySize = SecKeyGetBlockSize(publicKey);
NSData *keyData = [NSData dataWithBytes:publicKey length:keySize];
但不幸的是,我无法将 keyData
重新转换为 SecKeyRef
类型。
问题如下:如何将 NSData 重新转换为 SecKeyRef 类型?
这是代码!
//
// RSA.m
// example
//
// Created by Ferdinando Picone on 07/11/13.
// Copyright (c) 2013 Ferdinando Picone. All rights reserved.
//
#import "RSA.h"
#import <Security/Security.h>
#import "NSData+Base64.h"
static const UInt8 publicKeyIdentifier[] = "com.apple.sample.publickey\0";
static const UInt8 privateKeyIdentifier[] = "com.apple.sample.privatekey\0";
SecKeyRef publicKey = NULL;
SecKeyRef privateKey = NULL;
@implementation RSA
-(void)start{
RSA *one = [[RSA alloc]init];
// Generate public and private key
[one generateKeyPairPlease];
NSLog(@" %@", publicKey);
NSLog(@" %@", privateKey);
//Convert public key in NSData Type
size_t keySize = SecKeyGetBlockSize(publicKey);
NSData *keyData = [NSData dataWithBytes:publicKey length:keySize];
NSLog (@" %@", keyData);
//Convert public key in NSString Type
NSString *keyStringB64 =[keyData base64EncodedString];
//Reconvert NSString in a NSData Type (newKeyData)
NSData *newKeyData = [NSData dataFromBase64String:keyStringB64];
NSLog(@" %@", newKeyData);
// In the debug you can see that keyData==newKeyData
// NOW I NEED TO RECONVERT newKeyData in a SecKeyRef newPublicKey
SecKeyRef newPublicKey=NULL;
}
-(void) generateKeyPairPlease{
OSStatus status = noErr;
NSMutableDictionary *privateKeyAttr = [[NSMutableDictionary alloc] init];
NSMutableDictionary *publicKeyAttr = [[NSMutableDictionary alloc] init];
NSMutableDictionary *keyPairAttr = [[NSMutableDictionary alloc] init];
NSData * publicTag = [NSData dataWithBytes:publicKeyIdentifier
length:strlen((const char *)publicKeyIdentifier)];
NSData * privateTag = [NSData dataWithBytes:privateKeyIdentifier
length:strlen((const char *)privateKeyIdentifier)];
[keyPairAttr setObject:(__bridge id)kSecAttrKeyTypeRSA
forKey:(__bridge id)kSecAttrKeyType];
[keyPairAttr setObject:[NSNumber numberWithInt:1024]
forKey:(__bridge id)kSecAttrKeySizeInBits];
[privateKeyAttr setObject:[NSNumber numberWithBool:YES]
forKey:(__bridge id)kSecAttrIsPermanent];
[privateKeyAttr setObject:privateTag
forKey:(__bridge id)kSecAttrApplicationTag];
[publicKeyAttr setObject:[NSNumber numberWithBool:YES]
forKey:(__bridge id)kSecAttrIsPermanent];
[publicKeyAttr setObject:publicTag
forKey:(__bridge id)kSecAttrApplicationTag];
[keyPairAttr setObject:privateKeyAttr
forKey:(__bridge id)kSecPrivateKeyAttrs];
[keyPairAttr setObject:publicKeyAttr
forKey:(__bridge id)kSecPublicKeyAttrs];
status = SecKeyGeneratePair((__bridge CFDictionaryRef)keyPairAttr,
&publicKey, &privateKey);
}
@end
最佳答案
您可以使用 iOS 10.10 中提供的 API 从 NSData 创建 SecKeyRef
- (SecKeyRef)secKeyRefFromFrivateKeyData:(NSData *)privateKeyData
{
NSDictionary *attributes = @{(__bridge NSString*)kSecAttrKeyType : (__bridge NSString*)kSecAttrKeyTypeRSA,
(__bridge NSString*)kSecAttrKeyClass : (__bridge NSString*)kSecAttrKeyClassPrivate};
return SecKeyCreateWithData((__bridge CFDataRef)privateKeyData, (__bridge CFDictionaryRef)attributes, NULL);
}
关于ios - 将 NSData 转换为 SecKeyRef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19833977/
我生成一个 RSA 公钥/私钥对,如下所示: CFDataRef privateTag; CFDataRef publicTag; SecKeyRef publicKey; SecKeyRef pri
我正在使用此代码:https://stackoverflow.com/a/19221754/849616 ,但对我来说并非一切都清楚。 我想使用公钥 NSString *pubKey = "1111"
我有一个 RSA key (对)表示为大整数模数和指数,需要用它们进行加密/解密。 我想出了如何使用 swift 在 iOS 中根据需要处理按键。 我的问题:有什么方法可以将模数/指数表示转换为标准的
这个问题在这里已经有了答案: Extracting a public key from key pair in key chain (2 个答案) 关闭 9 年前。 现在我的公钥有问题,我使用 Se
我有两个 key ,公钥和私钥,都存储在 SecKeyRef 变量中。为了简单起见,让我们从公共(public)的开始。我想做的是将它导出到一个 NSData 对象。为此,Apple 提供了一个几乎著
为了从 iPhone 发送和接收加密消息,我需要读取公钥(服务器的公钥)PEM 文件并创建一个 SecKeyRef(后来我什至可以将其存储在钥匙串(keychain)上,以免创建它)再次)。 这是我当
我用 SecKeyGeneratePair 生成了私钥和公钥我已经将 SecKeyRef 转换为 NSData size_t keySize = SecKeyGetBlockSize(publicKe
我需要使用公钥将用户密码加密为 base64 字符串。 公钥是一个 NSString。 是这样的: "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCgWO7p1AvCa
我有一个从远程服务器收集的公钥,我想使用该公钥执行 RSA 加密。但问题是我将公钥数据作为缓冲区中的字节数组获取。我可以将它转换为 NSData 但我不能转换为 SecKeyRef 所以我可以继续加密
给定一个使用 SecItemImport 从 RSA 私钥加载的 SecKeyRef 有没有办法只为公钥获取或创建一个 SecKeyRef组件?在 OpenSSL 中,这可以通过将模数和公共(publ
我想通过将指数和模数作为私钥来解密 iPhone 上的 RSA 编码的 blob。在 Java 中(使用 javax.crypto),这可以通过如下代码轻松实现: // 1) key RSAPubli
我正在开发一个 iOS 应用程序,我得到一个 base64 编码的公钥,例如: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC3gn+tJ1+PbP0GHa6hmM35
我在设备上使用 SecKeyGeneratePair() 在设备上生成了一个 RSA 对称 key 对。我有每个键的 SecKeyRef 结构指针。那么,如何将 SecKeyRef 保存到磁盘?甚至传
任何人请帮助从指数和模数创建SecKeyRef作为我的公共(public)指数 = 010001和 公共(public)模数 =008903fb6d15f352ed3b45add3216f632f71
我需要将我的iPhone应用程序与系统集成,他们需要通过给定的公钥加密数据,有3个文件,3种不同的格式.xml .der和.pem,我研究并找到了一些关于从 DER/PEM 获取 SecKeyRef,
我想从从 OpenSSL 创建的 EC_KEY 导出公钥和私钥,并且我们知道 EC_KEY 保存 key 对,但 openssl 不兼容将 key 对存储到安全中飞地。因此,我想从 OpenSSL 创
在 Swift 中,我创建了一个 SecKeyRef通过调用对象 SecTrustCopyPublicKey在一些原始 X509 证书数据上。这就是这个 SecKeyRef 对象的样子。 Option
我需要一种干净的方法来提取我的服务器公钥并将其与本地数据进行比较,以防止将来过期/更新 key ,但我似乎无法获得 256 位 key 或表达它作为比较有用的数据... 这是我目前所拥有的... -(
我有一个 Base64 格式的 RSa publicKey 值,如何在不添加到 Keychain 的情况下转换为 SecKeyRef 对象 我可以将非 X509 格式的 RSA Raw 值添加到 Ke
我正在尝试使用 OSX 中的安全转换创建对称加密 key ,然后将该 key 保存到钥匙串(keychain)中。我能够创建一个工作 key 并将其保存到钥匙串(keychain)中,但是当我调用该
我是一名优秀的程序员,十分优秀!