4

SecKeyGeneratePair メソッドを使用して RSA キー ペアを生成しました。これらのキーを使用して、暗号化/復号化、デジタル署名を実行し、iOS アプリケーションで検証を実行できます。

ここでの課題は、公開鍵 (SecKeyRef) を base64string 形式で Java サーバーに送信する必要があることです。Java では、iOS 文字列 (base64) を使用して公開鍵を再構築する必要があります。

サーバーに転送する際に、SecKeyRef を NSData から base64string (常に同じ文字列を取得) に変換しました。base64string を使用すると、Java で公開鍵を再構築できません。RSA 公開鍵と秘密鍵を生成するために使用されるコードを以下に示しました。

static const UInt8 publicKeyIdentifier[] =  "com.apple.sample.publickey\0";
static const UInt8 privateKeyIdentifier[]= "com.apple.sample.privatekey\0";


- (void)generateKeyPairPlease{

OSStatus status = noErr;
publicKeyBits=nil;
NSMutableDictionary *privateKeyAttr = [[NSMutableDictionary alloc] init];
NSMutableDictionary *publicKeyAttr = [[NSMutableDictionary alloc] init];
NSMutableDictionary *keyPairAttr = [[NSMutableDictionary alloc] init];

publicTag = [NSData dataWithBytes:publicKeyIdentifier length:strlen((const char *)publicKeyIdentifier)];

privateTag = [NSData dataWithBytes:privateKeyIdentifier length:strlen((const char *)privateKeyIdentifier)];
publicKey = NULL;
privateKey = NULL;


[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);

}


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

CFDataRef keyBits;

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

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

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

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

NSLog(@"Bits are %@",publicKeyBits);

return publicKeyBits;//every time I am getting same data here
}
4

0 に答える 0