- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个从远程服务器收集的公钥,我想使用该公钥执行 RSA 加密。但问题是我将公钥数据作为缓冲区中的字节数组获取。我可以将它转换为 NSData 但我不能转换为 SecKeyRef 所以我可以继续加密。我的加密代码是这样的:
+(NSString *)encryptRSA:(NSString *)plainTextString withKey:(SecKeyRef)publicKey {
size_t cipherBufferSize = SecKeyGetBlockSize(publicKey);
uint8_t *cipherBuffer = malloc(cipherBufferSize);
uint8_t *nonce = (uint8_t *)[plainTextString UTF8String];
SecKeyEncrypt(publicKey,
kSecPaddingOAEP,
nonce,
strlen( (char*)nonce ),
&cipherBuffer[0],
&cipherBufferSize);
NSData *encryptedData = [NSData dataWithBytes:cipherBuffer length:cipherBufferSize];
return [encryptedData base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
如您所见,我需要 SecKeyRef 对象类型来完成我的加密。但是我的 RSA 公钥在 NSData 变量中。那么如何将 NSData 转换为 SecKeyRef 对象类型。提前致谢。
最佳答案
使用这个函数来保存你的公钥。传递您的 RAS 公钥和 peername 的任何名称。
- (void)addPeerPublicKey:(NSString *)peerName keyBits:(NSData *)publicKeyData {
OSStatus sanityCheck = noErr;
CFTypeRef persistPeer = NULL;
[self removePeerPublicKey:peerName];
NSData * peerTag = [[NSData alloc] initWithBytes:(const void *)[peerName UTF8String] length:[peerName length]];
NSMutableDictionary * peerPublicKeyAttr = [[NSMutableDictionary alloc] init];
[peerPublicKeyAttr setObject:(id)kSecClassKey forKey:(id)kSecClass];
[peerPublicKeyAttr setObject:(id)kSecAttrKeyTypeRSA forKey:(id)kSecAttrKeyType];
[peerPublicKeyAttr setObject:peerTag forKey:(id)kSecAttrApplicationTag];
[peerPublicKeyAttr setObject:publicKeyData forKey:(id)kSecValueData];
[peerPublicKeyAttr setObject:[NSNumber numberWithBool:YES] forKey:(id)kSecReturnData];
sanityCheck = SecItemAdd((CFDictionaryRef) peerPublicKeyAttr, (CFTypeRef *)&persistPeer);
if(sanityCheck == errSecDuplicateItem){
TRC_DBG(@"Problem adding the peer public key to the keychain, OSStatus == %ld.", sanityCheck );
}
TRC_DBG(@"SecItemAdd OSStATUS = %ld", sanityCheck);
// TRC_DBG(@"PersistPeer privatekey data after import into keychain %@", persistPeer);
persistPeer = NULL;
[peerPublicKeyAttr removeObjectForKey:(id)kSecValueData];
sanityCheck = SecItemCopyMatching((CFDictionaryRef) peerPublicKeyAttr, (CFTypeRef*)&persistPeer);
TRC_DBG(@"SecItemCopying OSStATUS = %ld", sanityCheck);
// TRC_DBG(@"SecItem copy matching returned this public key data %@", persistPeer);
// The nice thing about persistent references is that you can write their value out to disk and
// then use them later. I don't do that here but it certainly can make sense for other situations
// where you don't want to have to keep building up dictionaries of attributes to get a reference.
//
// Also take a look at SecKeyWrapper's methods (CFTypeRef)getPersistentKeyRefWithKeyRef:(SecKeyRef)key
// & (SecKeyRef)getKeyRefWithPersistentKeyRef:(CFTypeRef)persistentRef.
[peerTag release];
[peerPublicKeyAttr release];
if (persistPeer) CFRelease(persistPeer);
}
这是检索公钥 ref 的函数。传递用于保存的相同名称。
-(SecKeyRef)getPublicKeyReference:(NSString*)peerName{
OSStatus sanityCheck = noErr;
SecKeyRef pubKeyRefData = NULL;
NSData * peerTag = [[NSData alloc] initWithBytes:(const void *)[peerName UTF8String] length:[peerName length]];
NSMutableDictionary * peerPublicKeyAttr = [[NSMutableDictionary alloc] init];
[peerPublicKeyAttr setObject:(id)kSecClassKey forKey:(id)kSecClass];
[peerPublicKeyAttr setObject:(id)kSecAttrKeyTypeRSA forKey:(id)kSecAttrKeyType];
[peerPublicKeyAttr setObject:peerTag forKey:(id)kSecAttrApplicationTag];
[peerPublicKeyAttr setObject:[NSNumber numberWithBool:YES] forKey: (id)kSecReturnRef];
sanityCheck = SecItemCopyMatching((CFDictionaryRef) peerPublicKeyAttr, (CFTypeRef*)&pubKeyRefData);
[peerTag release];
[peerPublicKeyAttr release];
TRC_DBG(@"SecItemCopying OSStATUS = %ld", sanityCheck);
if(pubKeyRefData){
TRC_DBG(@"SecItem copy matching returned this publickeyref %@", pubKeyRefData);
return pubKeyRefData;
}else{
TRC_DBG(@"pubKeyRef is NULL");
return nil;
}
}
在 addPeerPublicKey 之前将您的公钥数据传递给此函数
- (NSData *)stripPublicKeyHeader:(NSData *)d_key
{
// Skip ASN.1 public key header
if (d_key == nil) return(nil);
unsigned int len = [d_key length];
if (!len) return(nil);
unsigned char *c_key = (unsigned char *)[d_key bytes];
unsigned int idx = 0;
if (c_key[idx++] != 0x30) return(nil);
if (c_key[idx] > 0x80) idx += c_key[idx] - 0x80 + 1;
else idx++;
// PKCS #1 rsaEncryption szOID_RSA_RSA
static unsigned char seqiod[] =
{ 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,
0x01, 0x05, 0x00 };
if (memcmp(&c_key[idx], seqiod, 15)) return(nil);
idx += 15;
if (c_key[idx++] != 0x03) return(nil);
if (c_key[idx] > 0x80) idx += c_key[idx] - 0x80 + 1;
else idx++;
if (c_key[idx++] != '\0') return(nil);
// Now make a new NSData from this buffer
return([NSData dataWithBytes:&c_key[idx] length:len - idx]);
}
关于ios - 将 NSData 转换为 SecKeyRef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21308415/
我生成一个 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)中,但是当我调用该
我是一名优秀的程序员,十分优秀!