1

こんにちは、メモを取って暗号化し、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 に保存されますが、アプリをまだ閉じていないため、後でメモを復号化するときに取得されません。

4

0 に答える 0