Ich bin neu in Objective C & iOS-Programmierung.Ziel C: SecKeyRef kann nicht aus dem privaten PEM-Schlüssel abgerufen werden
Ich verwende einen einfachen öffentlichen/privaten Schlüssel (PEM-Format) generiert mit openssl zum Verschlüsseln und Entschlüsseln von Daten, die zwischen einem Server und einem Client ausgetauscht werden müssen. Ich habe das erfolgreich in Java Server & Client arbeiten.
Der Fehler begann, als ich Daten mit dem öffentlichen Schlüssel in Java verschlüsselt und mit dem privaten Schlüssel in Objective C/iOS entschlüsselt habe. Ich habe mich ein paar Beispiele angesehen und etwas Code zusammengefügt, aber ich erhalte den Fehler -25300, wenn ich die SecItemCopyMatching die ganze Zeit als Teil des Erstellens eines SecKeyRef vom privaten Schlüssel rufe.
BTW, hier sind keine Zertifikate beteiligt und es sind nur einfache Tasten. Hier ist, was ich tue:
- Lesen Sie den privaten PEM-Schlüssel und Base64 dekodieren.
- Generieren Sie einen SecKeyRef aus der dekodierten Zeichenfolge mit SecItemCopyMatching.
- Mit SecKeyDecrypt entschlüsseln.
Mein Problem ist, Schritt # 2, das einen Status von -25.300 zurückgibt (errSecItemNotFound -25.300
Das Element kann nicht gefunden werden. Erhältlich in iOS 2.0 und höher.)
Hier mein Code ist die zur Erzeugung von SecKeyRef:
- (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);
}
ich habe jetzt ein paar Tagen mein Kopf war zu brechen und ich fühlte mich wie ich hier etwas Hilfe bekommen müssen. Irgendwelche Zeiger? Ich könnte mehr Zeit damit verbringen, das Crypto-Domain-Wissen und die Unterstützung zu erwerben, die iOS bietet, aber ich mache überhaupt keine iOS-Programmierung und das ist eine einmalige Sache.
Ich brauche nur eine Richtung, und ich kann kämpfen, damit es funktioniert.
TIA.
Haben Sie das jemals funktioniert? Gleicher Fehler. –
Ich bin immer noch auf der gleichen Seite. Hast du das funktioniert? –
Sie können "SecItemCopyMatching" nur verwenden, um Elemente abzurufen, die Sie zuvor dem Schlüsselbund hinzugefügt haben. Da du nichts hinzugefügt hast, gibt es nichts zu holen. – orkoden