当我第二次尝试解密CipherBuffer时,应用程序“崩溃”

时间:2013-04-12 19:15:25

标签: ios encryption rsa

您好我正在尝试实施iPhone应用程序记录并加密它们,然后在UIAlertView上输入正确的PIN时解密它们。当应用程序第一次加载时,我已经在我的AppDelegate中包含了一些代码,用于检查是否已有公钥和私钥。如果没有,它会生成一对并将它们添加到内部存储中。当应用程序第一次启动时,它工作得很好。然后我终止应用程序并再次打开它,当我进入现有笔记并尝试解密时它就会挂起。从控制台我可以看到它在解密方法中加载密码缓冲区,但这次从未加载textView解密文本。 Button只是保持按下状态,并且进程不会终止。这是代码。

- (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中,但是当我解密一个音符时它不会被检索,因为我还没有关闭应用程序。

0 个答案:

没有答案
相关问题