IOS DES加密& PHP解密不能可靠地工作

时间:2012-09-08 09:12:54

标签: php ios encryption des

我正在使用以下方法在iOS中加密字符串


-(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上,我正在解密字符串,如下所示 -


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

这似乎在75%的时间内正常工作,我不知道为什么它在其他时候会失败。有线索吗?谢谢你的帮助!

2 个答案:

答案 0 :(得分:0)

它可能是填充,它是两种方法之间唯一不同步的东西。不幸的是,您可能必须创建自己的unpadding表单mcrypt,因为该库不执行PKCS#5填充(实际上与PKCS#7填充相同)。幸运的是,这很简单:解密,然后使用最后一个字节的值去除最后一个字节。

其他与安全相关的说明:

  • DES不安全,至少使用3DES(或官方TDEA);
  • ECB模式不安全,使用CBC(使用IV);
  • ECB模式不使用IV;
  • 对于客户端/服务器身份验证,您需要了解填充oracle攻击。

答案 1 :(得分:0)

事实证明,我正在进行的加密/解密没有任何问题。相反,问题是PHP中的urldecode()没有解码'%2B'到' +' (但改为')。我在PHP中从urldecode()切换到rawurldecode(),现在一切正常!