2012-03-25 14 views
3

Ich verwende diesen Code zum Verschlüsseln einer Zeichenfolge mit 3DES in IOS und ich möchte mit php entschlüsseln, aber es generiert eine Zeichenfolge länger, wenn ich kCCOptionPKCS7Padding (oder kürzer, wenn ich don benutze es nicht) wenn ich es entschlüssle mit php fügt es mehr oder weniger chars zu de string wie kann ich das beheben?Probleme mit der 3DES-Verschlüsselung schneiden oder erweitern die Zeichenfolge

, das ist, wie ich mit php entschlüsseln

$key = "f968f8e82961489a8b14b345"; 
$encrypted = base64_decode($crypt); 
$n = mcrypt_module_open(MCRYPT_3DES, null, MCRYPT_MODE_ECB, null); 
$fake_iv = str_repeat(chr(0), mcrypt_enc_get_iv_size($n)); 
mcrypt_generic_init($n, $key, $fake_iv); 
$original = mdecrypt_generic($n, $encrypted); 

, das ist, wo ich

Funktion für encrypt nennen
NSString* str= @"test string with random words"; 
NSData* body =[str dataUsingEncoding:NSUTF8StringEncoding]; 

NSData *encrypt3DES  = [ViewController TripleDES:body encryptOrDecrypt:kCCEncrypt key:@"f968f8e82961489a8b14b345"]; 

NSData *encryptBase64 = [GTMBase64 encodeData:encrypt3DES]; 

, die, wie ich in ios verschlüsseln ist

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

    const void *vplainText; 
    size_t plainTextBufferSize; 

    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 | kCCOptionECBMode), 
         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 = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes]; 

    return result; 
} 

weitere Infos

, dass der Ausgang i Entschlüsselung erhalten mit PHP ist (am Ende der Zeichenfolge stange Quadrat Zeichen es hinzufügen)

test string with random words 

das ist, was ich obtaine

test string with random words 

will, dass der Base64-Code erzeugt von NSString *base64tring = [[NSString alloc] initWithData:encryptBase64 encoding:NSUTF8StringEncoding];

JuelOxhG5rmLZ32/HNQjxqSPGovPv+lupUz/u0/ryXU= 
+0

verwenden, können Sie beispielsweise Ausgang geben? String vor Verschlüsselung + Encryption-Ergebnis (in Base64-Encoding) + Schlüssel verwendet zum Beispiel + php entschlüsselte Ausgabe. die Ausgabe von PHP fehlt – Kaii

+0

hinzugefügt die info der Schlüssel ist der gleiche von PHP $ key = "f968f8e82961489a8b14b345"; – oscurodrago

Antwort

2

Ohne diese getestet i den Grund für Ihr "seltsames Bytes" erraten ist die PKCS # 5 Paddi ng, die Sie der Zeichenfolge auf der iOS-Seite hinzufügen. Es wird von PHPs mcrypt-Erweiterung nicht unterstützt, so dass Sie es selbst entfernen müssten. Zum Beispiel durch eine Funktion aus the commentary on mcrypt

function pkcs5_unpad($text) 
{ 
    $pad = ord($text{strlen($text)-1}); 
    if ($pad > strlen($text)) return false; 
    if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) return false; 
    return substr($text, 0, -1 * $pad); 
} 
+0

thx scheint jetzt richtig funktioniert! thx sehr viel ich habe es nicht gesehen – oscurodrago