Php 3DES加密问题会剪切或扩展字符串

Php 3DES加密问题会剪切或扩展字符串,php,ios,encryption,3des,Php,Ios,Encryption,3des,我正在使用该代码在IOS中用3DES加密字符串,我想用php解密它 但是如果我使用kCCOptionPKCS7Padding,它将生成更长的字符串(如果我不使用它,则生成更短的字符串) 当我用php解密它时,它会在反字符串中添加更多或更少的字符 我怎样才能解决这个问题 这就是我用php解密的方式 $key = "f968f8e82961489a8b14b345"; $encrypted = base64_decode($crypt); $n = mcrypt_module_open(MCRYPT

我正在使用该代码在IOS中用3DES加密字符串,我想用php解密它 但是如果我使用kCCOptionPKCS7Padding,它将生成更长的字符串(如果我不使用它,则生成更短的字符串) 当我用php解密它时,它会在反字符串中添加更多或更少的字符 我怎样才能解决这个问题

这就是我用php解密的方式

$key = "f968f8e82961489a8b14b345";
$encrypted = base64_decode($crypt);
$n = mcrypt_module_open(MCRYPT_3DES, null, MCRYPT_MODE_ECB, null);
$fake_iv = str_repeat(chr(0), mcrypt_enc_get_iv_size($n));
mcrypt_generic_init($n, $key, $fake_iv);
$original = mdecrypt_generic($n, $encrypted);
这就是我调用加密函数的地方

NSString* str= @"test string with random words";
NSData* body =[str dataUsingEncoding:NSUTF8StringEncoding];

NSData *encrypt3DES     = [ViewController TripleDES:body encryptOrDecrypt:kCCEncrypt key:@"f968f8e82961489a8b14b345"];

NSData *encryptBase64   = [GTMBase64 encodeData:encrypt3DES];
这就是我在ios中加密的方式

+ (NSData*)TripleDES:(NSData*)plainData encryptOrDecrypt:(CCOperation)encryptOrDecrypt 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(encryptOrDecrypt,
                       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 *result = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];

    return result;
}
更多信息

这是我用php解密得到的输出(在字符串末尾添加stange square字符)

这就是我想要的

test string with random words
这是由
NSString*base64tring=[[NSString alloc]initWithData:encryptBase64编码:NSUTF8StringEncoding]生成的Base64代码

JuelOxhG5rmLZ32/HNQjxqSPGovPv+lupUz/u0/ryXU=

在没有进行测试的情况下,我想您的“奇怪字节”的原因是您在iOS端添加到字符串中的PKCS#5填充。PHPs mcrypt扩展不支持它,因此您必须自己删除它。例如,通过使用


你能给出输出的例子吗?加密前的字符串+加密结果(base64编码)+例如使用的密钥+php解密输出。php的输出丢失,添加了与php$key=“f968f8e82961489a8b14b345”相同的密钥信息;thx现在似乎工作正常!非常感谢,我没看见
JuelOxhG5rmLZ32/HNQjxqSPGovPv+lupUz/u0/ryXU=
function pkcs5_unpad($text)
{
    $pad = ord($text{strlen($text)-1});
    if ($pad > strlen($text)) return false;
    if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) return false;
    return substr($text, 0, -1 * $pad);
}