2012-03-22 4 views
0

мне нужно шифровать и дешифровать с PHP строка кода, генерируемого этим методом Ios объясняется здесь https://stackoverflow.com/a/9479657/721253PHP + ИОС шифровать и дешифровать 3des + base64

для шифрования с PHP я использовать этот сценарий

$key = 'f968f8e82961489a8b14b345'; 
$data = 'odio quando sto studiando e un velociraptor mi lancia addosso banane'; 
$encrypted = null; 
$m = mcrypt_module_open(MCRYPT_3DES, null, MCRYPT_MODE_ECB, null); 
$fake_iv = str_repeat(chr(0), mcrypt_enc_get_iv_size($m)); 
mcrypt_generic_init($m, $key, $fake_iv); 
$encrypted = mcrypt_generic($m, $data); 
die(base64_encode($encrypted)); 

и на ИО для decript я использую, что

NSURL *url = [NSURL URLWithString:@"http://oscurodrago.it/tools/crypto.php"]; 
NSData *data = [NSData dataWithContentsOfURL:url]; 
NSData *outData = [self TripleDES:data encryptOrDecrypt:kCCDecrypt key:@"f968f8e82961489a8b14b345"]; 

CCStatus ошибка возврата декодированием -> если (CCStatus == kCCDecodeError) NSLog (@ "DECODE ERROR");

обновление что viewcontroller.m где я проверяю этот сценарий

#import <CommonCrypto/CommonCryptor.h> 
#import "GTMBase64.h" 

#import "ViewController.h" 

@interface ViewController() 

@end 

@implementation ViewController 

- (NSData*)TripleDES:(NSData*)plainData encryptOrDecrypt:(CCOperation)encryptOrDecrypt key:(NSString*)key { 

    const void *vplainText; 
    size_t plainTextBufferSize; 

    if (encryptOrDecrypt == kCCDecrypt) 
    { 
     NSData *EncryptData = [GTMBase64 decodeData:plainData]; 
     plainTextBufferSize = [EncryptData length]; 
     vplainText = [EncryptData bytes]; 
    } 
    else 
    { 
     plainTextBufferSize = [plainData length]; 
     vplainText = (const void *)[plainData bytes]; 
    } 

    CCCryptorStatus ccStatus; 
    uint8_t *bufferPtr = NULL; 
    size_t bufferPtrSize = 0; 
    size_t movedBytes = 0; 
    // uint8_t ivkCCBlockSize3DES; 

    bufferPtrSize = (plainTextBufferSize + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1); 
    bufferPtr = malloc(bufferPtrSize * sizeof(uint8_t)); 
    memset((void *)bufferPtr, 0x0, bufferPtrSize); 
    // memset((void *) iv, 0x0, (size_t) sizeof(iv)); 

    // NSString *key = @"123456789"; 
    NSString *initVec = @"init Vec"; 
    const void *vkey = (const void *) [key UTF8String]; 
    const void *vinitVec = (const void *) [initVec UTF8String]; 

    ccStatus = CCCrypt(encryptOrDecrypt, 
         kCCAlgorithm3DES, 
         kCCOptionPKCS7Padding, 
         vkey, //"123456789", //key 
         kCCKeySize3DES, 
         vinitVec, //"init Vec", //iv, 
         vplainText, //"Your Name", //plainText, 
         plainTextBufferSize, 
         (void *)bufferPtr, 
         bufferPtrSize, 
         &movedBytes); 
    if (ccStatus == kCCSuccess) NSLog(@"SUCCESS"); 
    else if (ccStatus == kCCParamError) NSLog(@"PARAM ERROR"); 
    else if (ccStatus == kCCBufferTooSmall) NSLog(@"BUFFER TOO SMALL"); 
    else if (ccStatus == kCCMemoryFailure) NSLog(@"MEMORY FAILURE"); 
    else if (ccStatus == kCCAlignmentError) NSLog(@"ALIGNMENT"); 
    else if (ccStatus == kCCDecodeError) NSLog(@"DECODE ERROR"); 
    else if (ccStatus == kCCUnimplemented) NSLog(@"UNIMPLEMENTED"); 

    NSData *result; 

    if (encryptOrDecrypt == kCCDecrypt) 
    { 
     result = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes]; 
    } 
    else 
    { 
     NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes]; 
     result = [GTMBase64 encodeData:myData]; 
    } 

    return result; 
} 


- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    NSURL *url = [NSURL URLWithString:@"http://www.oscurodrago.it/tools/crypto.php"]; 
    NSData *data = [NSData dataWithContentsOfURL:url]; 

    NSData *outData = [[NSData alloc] initWithData:[self TripleDES:data encryptOrDecrypt:kCCDecrypt key:@"f968f8e82961489a8b14b345"]]; 

    NSLog(@"%@", data); 

    // NSData *encriptdata = [self TripleDES:data encryptOrDecrypt:kCCEncrypt key:@"f968f8e82961489a8b14b345"]; 

    NSLog(@"%@", [outData length]); 
} 

- (void)viewDidUnload 
{ 
    [super viewDidUnload]; 
    // Release any retained subviews of the main view. 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { 
     return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); 
    } else { 
     return YES; 
    } 
} 

@end 

ответ

1

Вы должны сделать «OutData» в кодировке Base64. Тогда вы можете распечатать NSData. Попробуйте до этого, данные не пустой, печатая длину «OutData» по

NSLog(@"%d",[outData length]); 

См this ссылку для преобразования NSData в base64 строку.

+0

Я не очень хорошо знаком с ios, но '[outData length]' return 0 и i tought http://stackoverflow.com/a/9479657/721253 уже расшифровать/зашифровать base64 – oscurodrago

+0

Что вы получили при печати NSLog (@ "% d", [длина данных]); Если это тоже 0, вы не получаете никаких данных с сервера. – rakeshNS

+0

- это штамп NSLog (@ "% @", данные); dosen't кажутся enpity 2012-03-22 18: 06: 38,973 Cryptdata [1012: F803] <39744d56 306b6a38 716d6e4e 44726f44 414a584c 36355777 34517676 6c6d6339 64566c56 42533973 7038306f 63796e69 75797979 425a6d4b 5377472f 7358706e 5a724546 38356f52 4b7a5269 38683639 65737a4c 476d6c65 78563048 524b3337> – oscurodrago

Смежные вопросы