こんにちは、メモを取って暗号化し、UIAlertView に正しい PIN を入力すると復号化する iPhone アプリを実装しようとしています。アプリケーションが初めて読み込まれるとき、公開鍵と秘密鍵が既に存在するかどうかを確認するコードを AppDelegate に含めました。そうでない場合は、ペアを生成して内部ストレージに追加します。アプリケーションを初めて起動すると、問題なく動作します。次に、アプリを終了して再度開くと、既存のメモに移動して復号化しようとするとハングします。コンソールから、復号化メソッドで暗号バッファがロードされていることがわかりますが、今回は復号化されたテキストが textView にロードされることはありません。ボタンは押されたような状態のままで、プロセスは終了しません。これがコードです。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *data2 = [defaults objectForKey:@"publicKey"];
if (data2 == nil) {
encrypt = [[SecKey alloc]init];
[encrypt generateKeyPairRSA];
SecKeyRef publicKey =[encrypt getPublicKeyRef];
SecKeyRef privateKey = [encrypt getPrivateKeyRef];
size_t keySize = SecKeyGetBlockSize(publicKey);
NSData* keyData = [NSData dataWithBytes:publicKey length:keySize];
[[NSUserDefaults standardUserDefaults] setObject:keyData forKey:@"publicKey"];
keySize = SecKeyGetBlockSize(privateKey);
keyData = [NSData dataWithBytes:privateKey length:keySize];
[[NSUserDefaults standardUserDefaults] setObject:keyData forKey:@"privateKey"];
}
初めてアプリケーションを実行すると、これは正常に機能します。
- (IBAction)save:(id)sender {
//save the context and dismiss the AddNewNotesViewcontroller
uint8_t *cipherBuffer = NULL;
SecKey *encrypt = [[SecKey alloc]init];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *data2 = [defaults objectForKey:@"publicKey"];
encrypt.publicKey =(SecKeyRef)[data2 bytes];
cipherBuffer = [encrypt Encryption:plainTextField.text];
NSMutableData *data = [[NSMutableData alloc]init];
[data appendBytes:cipherBuffer length:strlen((char*)cipherBuffer)+1];
[self.currentNote setNotesTitle:titleField.text];
[self.currentNote setEncryptedText:data];
[self.delegate addNewNoteViewControllerDidSave];
}
-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
NSString *title = [alertView buttonTitleAtIndex:buttonIndex];
if([title isEqualToString:@"Decrypt"])
{
UITextField *passcode = [alertView textFieldAtIndex:0];
if ([passcode.text isEqual: @"1234"]) {
SecKey *encrypt = [[SecKey alloc]init];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *data2 = [defaults objectForKey:@"publicKey"];
encrypt.publicKey =(SecKeyRef)[data2 bytes];
data2 = [defaults objectForKey:@"privateKey"];
encrypt.privateKey =(SecKeyRef)[data2 bytes];
NSData *etData = [[NSData alloc]init];
etData = [self.currentNote encryptedText];
const void *bytes = [etData bytes];
uint8_t *crypto_data = (uint8_t*)bytes;
NSLog(@"test %s",crypto_data);
NSString *pb =[encrypt Decryption:crypto_data];
self.encryptedText.text =pb;
}
else self.encryptedText.text = @"WRONG PASSWORD";
}
}
これが復号化プロセスです
- (void)decryptWithPrivateKey:(uint8_t *)cipherBuffer plainBuffer:(uint8_t *)plainBuffer
{
OSStatus status = noErr;
size_t cipherBufferSize = strlen((char *)cipherBuffer);
NSLog(@"decryptWithPrivateKey: length of buffer: %lu", BUFFER_SIZE);
NSLog(@"decryptWithPrivateKey: length of input: %lu", cipherBufferSize);
size_t plainBufferSize = BUFFER_SIZE;
status = SecKeyDecrypt([self getPrivateKey],
PADDING,
&cipherBuffer[0],
cipherBufferSize,
&plainBuffer[0],
&plainBufferSize
);
NSLog(@"decryption result code: %ld (size: %lu)", status, plainBufferSize);
NSLog(@"FINAL decrypted text: %s", plainBuffer);
}
-(NSString *)Decryption:(uint8_t *)cipherBuffer {
plainBuffer = (uint8_t *)calloc(CIPHER_BUFFER_SIZE, sizeof(uint8_t));
[self decryptWithPrivateKey:cipherBuffer plainBuffer:plainBuffer];
NSLog(@"DECRYPTED DATA : %s",plainBuffer);
NSString *s = [[NSString alloc] initWithBytes:plainBuffer length:BUFFER_SIZE encoding:NSUTF8StringEncoding];
return s;
}
なぜこれが起こっているのですか?NSUserDefaults から秘密鍵を取得しようとしたときのことだと思います。ペアが初めて作成されたときは NSUserDefaults に保存されますが、アプリをまだ閉じていないため、後でメモを復号化するときに取得されません。