2012-09-08 59 views
0

我下面加密IOS DES加密和解密PHP工作不可靠


-(NSString *) encrypt:(NSString *) data 
{ 

    const void *vplainText; 
    size_t plainTextBufferSize = [data length]; 
    vplainText = (const void *) [data UTF8String]; 
    CCCryptorStatus ccStatus; 
    uint8_t *bufferPtr = NULL; 
    size_t bufferPtrSize = 0; 
    size_t movedBytes = 0; 

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

    Byte iv [] = {0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef}; 

    NSString *key = @"complexkey"; 
    const void *vkey = (const void *) [key UTF8String]; 

    ccStatus = CCCrypt(kCCEncrypt, 
         kCCAlgorithmDES, 
         kCCOptionPKCS7Padding | kCCOptionECBMode, 
         vkey, 
         kCCKeySizeDES, 
         iv, 
         vplainText, 
         plainTextBufferSize, 
         (void *)bufferPtr, 
         bufferPtrSize, 
         &movedBytes); 

    NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes]; 
    NSString *result = [myData base64Encoding]; 

    // url encode the result 
    return (__bridge NSString *) CFURLCreateStringByAddingPercentEscapes(NULL, 
             (__bridge CFStringRef) result, 
             NULL, 
             (__bridge CFStringRef) @"!*'();:@&=+$,/?%#[]", 
             kCFStringEncodingUTF8); 
} 

而且在PHP中使用的方法在iOS中的字符串,我解密字符串如下 -


$decrypted = mcrypt_decrypt(MCRYPT_DES, 'complexkey', base64_decode(urldecode($encrypted)), MCRYPT_MODE_ECB); 

這似乎75%的時間正確工作,我不知道爲什麼在其他時間失敗。任何線索?謝謝您的幫助!

+0

請提供明確的錯誤說明。 「似乎不起作用」不是錯誤描述。 –

+0

iOS或php都沒有錯誤信息。 PHP似乎並沒有正確解密郵件。 – Subhash

回答

0

事實證明,我在做的加密/解密沒有錯。問題是PHP中的urldecode()沒有將'%2B'解碼爲'+'(而是解碼爲'')。我在PHP中使用urldecode()切換到rawurldecode(),現在一切正常。

0

這可能是填充,它是兩種方法之間唯一不同步的。不幸的是,您可能必須創建自己的無壓縮格式mcrypt,因爲該庫不會執行PKCS#5填充(確實與PKCS#7填充相同)。幸運的是,這很簡單:解密,然後使用最後一個字節的值去掉最後一個字節。

其他安全相關的注意事項:

  • DES是不是安全,使用3DES(或正式TDEA)作爲最低;
  • ECB模式不安全,請使用CBC(使用IV);
  • ECB模式不使用IV;
  • 對於客戶端/服務器身份驗證,您需要知道padding oracle攻擊。
+0

謝謝!我根據你的建議提出了填充修正,但這並沒有改變任何東西。 PHP仍然無法正確解密有時。並感謝所有額外的筆記!非常感謝。 – Subhash