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
}