Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/242.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/99.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS中的3DES加密结果与php不一样?_Php_Ios_Encryption - Fatal编程技术网

iOS中的3DES加密结果与php不一样?

iOS中的3DES加密结果与php不一样?,php,ios,encryption,Php,Ios,Encryption,我尝试在iOS中加密数据,就像下面的php代码一样: <?php $plaintext = "test"; $key = "12345"; $data = base64_encode(mcrypt_encrypt(MCRYPT_3DES, $key, $plaintext, MCRYPT_MODE_ECB)); echo ($data); ?> iOS中的数据加密结果是ZjdeIS8NijE=,这与php不同 我应该如何使iOS加密函数返回与php

我尝试在iOS中加密数据,就像下面的php代码一样:

<?php
    $plaintext = "test";
    $key = "12345";
    $data = base64_encode(mcrypt_encrypt(MCRYPT_3DES, $key, $plaintext, MCRYPT_MODE_ECB)); 
    echo ($data);
?>
iOS中的数据加密结果是
ZjdeIS8NijE=
,这与php不同


我应该如何使iOS加密函数返回与php相同的结果?

CCCode
中的Obj-C代码中,你向编译器撒谎,说你的密钥是
kCCKeySize3DES
字节长,即使它实际上只有5字节。3DES需要一个24字节的密钥


所以现在发生的是,它正在读取内存中的任何垃圾,在密钥的5个字节之后,作为密钥的其余部分。谁知道这是什么,这就是加密结果不同的原因。

除了我在下面给出的答案之外,还有一些一般性建议:在尝试编码之前先学习加密的基础知识。如果您不知道分组密码和流密码之间的区别,或者不知道CBC模式如何工作以及为什么它比ECB模式(您正在使用的)更好,那么请慢慢远离加密。谢谢您的建议,我对数据加密非常陌生。现在我必须进一步了解它们,因为出于安全原因,我的客户端开始要求我在发送到他们的API之前对数据进行加密。谢谢你的回答,我将密钥更改为24字节,但加密结果在iOS和php之间仍然有一点差异。然后,我使用iOS代码和日志NSData对来自PHP的结果进行解密,以找出差异。我发现php比iOS有更多的字节,所以我在加密函数
NSMutableData*appendData=[NSMutableData dataWithData:plainData]中添加了这段代码;[appendData appendBytes:“\0”长度:3]和它的工作像魔术。可能是关于iOS和php之间的填充算法。是的,在使用它之前,您应该再次学习加密的基础知识。分组密码(如DES)要求输入为块长度的倍数(DES为8)。存在各种填充方案以确保实现这一点。您的iOS代码使用PKCS7填充。阅读PHP库的文档,您可能还能够让它使用PKCS7填充。
- (NSData*)encrypt3DES:(NSData*)plainData 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 = @"123456789012345678901234";
    NSString *initVec = @"init Vec";
    const void *vkey = (const void *) [key UTF8String];
    const void *vinitVec = (const void *) [initVec UTF8String];

    ccStatus = CCCrypt(kCCEncrypt,
                       kCCAlgorithm3DES,
                       kCCOptionPKCS7Padding | kCCOptionECBMode,
                       vkey, //"123456789012345678901234", //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 *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];

    return myData;
}

NSData *encrpyData = [self encrypt3DES:[@"test" dataUsingEncoding:NSUTF8StringEncoding] key:@"12345"];
NSLog(@"%@", [encrpyData base64Encoding]);