私はObjective C & iOSプログラミングを初めて学びました。目的C:PEM秘密鍵からSecKeyRefを取得できません
私は、サーバーとクライアントの間で交換する必要があるデータを暗号化して解読するためにopensslを使用して生成された単純な公開鍵/秘密鍵(PEM形式)を使用しています。私はこれをJavaサーバー&クライアントで正常に動作させています。
Javaで公開鍵を使用してデータを暗号化し、Objective C/iOSで秘密鍵を使用して暗号化を解除したときに問題が発生しました。私はいくつかの例を見ていくつかのコードをまとめましたが、秘密鍵からSecKeyRefを作成する際にSecItemCopyMatchingを常に呼び出すと-25300というエラーが発生します。
ここには証明書が含まれておらず、単なる一般的なキーです。 ここに私がやっていることがあります:
- PEM秘密鍵とBase64デコードを読んでください。
- SecItemCopyMatchingを使用して、復号化された文字列からSecKeyRefを生成します。
- SecKeyDecryptを使用して復号化します。
私の問題は、-25300のステータスを返し、ステップ#2である(errSecItemNotFound -25300
項目は、iOS 2.0以降で。利用可能な見つけることができません 。)ここで
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSString *challenge = @"2KFqc46DNSWrizzv69lJN25o62xEYQw/QLcMiT2V1XLER9uJbOu+xH2qgTuNWa1HZ9SW3Lq+HovtkhFmjmf08QkVQohHmxCJXVyCgVhPBleScAgQ8AoP3tmV0RqGb2mJrb19ybeYP7uZ2piVtF4cRwU1gO3VTooCUK3cX4wS7Tc=";
NSLog(@"challenge, %@", challenge);
NSData *incomingData = [self base64DataFromString:challenge];
uint8_t *challengeBuffer = (uint8_t*)[incomingData bytes];
NSLog(@"challengeBuffer: %s", challengeBuffer);
[self decryptWithPrivateKey:challengeBuffer];
free(challengeBuffer);
return YES;
}
// Generate a SecKeyRef from the private key in the private.pem file.
- (SecKeyRef)getPrivateKeyRef {
NSString *startPrivateKey = @"-----BEGIN RSA PRIVATE KEY-----";
NSString *endPrivateKey = @"-----END RSA PRIVATE KEY-----";
NSString* path = [[NSBundle mainBundle] pathForResource:@"private"
ofType:@"pem"];
NSString* content = [NSString stringWithContentsOfFile:path
encoding:NSUTF8StringEncoding
error:NULL];
NSLog(@"Private Key: %@", content);
NSString *privateKey;
NSScanner *scanner = [NSScanner scannerWithString:content];
[scanner scanUpToString:startPrivateKey intoString:nil];
[scanner scanString:startPrivateKey intoString:nil];
[scanner scanUpToString:endPrivateKey intoString:&privateKey];
NSData *privateTag = [self dataWithBase64EncodedString:privateKey];
NSLog(@"Decoded String: %@", privateTag);
OSStatus status = noErr;
SecKeyRef privateKeyReference = NULL;
NSMutableDictionary * queryPrivateKey = [[NSMutableDictionary alloc] init];
// Set the private key query dictionary.
[queryPrivateKey setObject:(__bridge id)kSecClassKey forKey:(__bridge id)kSecClass];
[queryPrivateKey setObject:(__bridge id)kSecAttrKeyTypeRSA forKey:(__bridge id)kSecAttrKeyType];
[queryPrivateKey setObject:privateTag forKey:(__bridge id)kSecAttrApplicationTag];
[queryPrivateKey setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)kSecReturnRef];
//[queryPrivateKey setObject:(__bridge id)kCFBooleanTrue forKey:(__bridge id)kSecReturnRef];
// Get the key.
status = SecItemCopyMatching((__bridge CFDictionaryRef)queryPrivateKey, (CFTypeRef *)&privateKeyReference);
NSLog(@"status: %ld", status);
if(status != noErr)
{
privateKeyReference = NULL;
}
return privateKeyReference;
}
// Decrypt data
- (void)decryptWithPrivateKey:(uint8_t *)cipherBuffer {
OSStatus status = noErr;
SecKeyRef privateKeyRef = [self getPrivateKeyRef];
size_t plainBufferSize = SecKeyGetBlockSize(privateKeyRef);
uint8_t *plainBuffer = malloc(plainBufferSize);
size_t cipherBufferSize = strlen((char *)cipherBuffer);
NSLog(@"decryptWithPrivateKey: length of input: %lu", cipherBufferSize);
// Error handling
status = SecKeyDecrypt(privateKeyRef,
PADDING,
cipherBuffer,
cipherBufferSize,
&plainBuffer[0],
&plainBufferSize
);
NSLog(@"decryption result code: %ld (size: %lu)", status, plainBufferSize);
NSLog(@"FINAL decrypted text: %s", plainBuffer);
}
私は今、数日間、私の頭を壊してきたと私はここにいくつかの助けを得る必要があるように私は感じました。いずれかの任意のポインタ? iOSが提供するCryptoドメインの知識とサポートを得るのに多くの時間を費やすことができましたが、iOSプログラミングを一切やっていない、これは一度だけのことです。
私はちょうどある方向性が必要で、私はそれを機能させるために苦労することができます。
TIA。
これはこれまでに実現しましたか?同じ問題。 –
私はまだ同じことに直面しています。あなたはこれを稼働させましたか? –
'SecItemCopyMatching'を使うだけで、以前にキーチェーンに追加したアイテムを取得することができます。何も追加していないので、検索するものはありません。 – orkoden