2012-09-08 58 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