2012-03-25 10 views
3

IOSで3DESの文字列を暗号化するコードを使用しています。これをphp で復号化しますが、kCCOptionPKCS7Paddingを使用すると文字列が長くなりますそれを使用しないでください) PHPで解読すると文字列に多かれ少なかれ文字が追加されます どうすれば修正できますか?私はPHP3DES暗号化に関する問題

$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); 

で解読どのように私は、暗号化

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]; 

のための関数を呼び出す。ここで、iは、IOS

+ (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; 
} 

詳細に暗号化する方法であるということである

Base64でコードが生成され、私が欲しいものobtaine

test string with random words 

である私は、PHPで解読ます出力(文字列の末尾に、それはスタンジェの正方形の文字を追加)

test string with random words 

ある210

NSString *base64tring = [[NSString alloc] initWithData:encryptBase64 encoding:NSUTF8StringEncoding];

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

の出力を与えることができますか?暗号化前の文字列+暗号化結果(ベース64エンコーディング)+例えば、+ phpで復号化された出力。 PHPの出力には、 – Kaii

+0

が追加されています。キーはphp $ key = "f968f8e82961489a8b14b345"と同じです。 – oscurodrago

答えて

2

ことで、これは私はあなたの「奇妙なバイト」の理由は、PKCS#5 paddiだと思い調べたなしあなたがiOS側の文字列に追加すること。これはPHPのmcrypt拡張機能ではサポートされていないので、自分で削除する必要があります。たとえば、関数を使用して、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は今正しく動作するようです!本当に私はそれを見ていない – oscurodrago

関連する問題