繁体   English   中英

iOS DES加密和PHP解密无法可靠运行

[英]IOS DES encryption & PHP decryption not working reliably

我正在使用以下方法在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%的时间正常运行,但我不确定为什么它有时会失败。 有什么线索吗? 谢谢您的帮助!

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

其他与安全性相关的注意事项:

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

事实证明,我所做的加密/解密没有错。 问题在于,PHP中的urldecode()并未将'%2B'解码为'+'(而是解码为'')。 我从PHP中的urldecode()切换到rawurldecode(),现在一切正常!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM