iOS 3DES ECB解密

iOS 3DES ECB解密,ios,objective-c,encryption,3des,ecb,Ios,Objective C,Encryption,3des,Ecb,我试图使用下面的函数解密,但我一直得到相同的加密字符串 原因是什么 NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding]; const void *vEncryptedText = [data bytes]; size_t encryptedTextBufferSize = [data length]; CCCryptorStatus ccStatus; uint8_t *buffe

我试图使用下面的函数解密,但我一直得到相同的加密字符串

原因是什么

    NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];

    const void *vEncryptedText = [data bytes];
    size_t encryptedTextBufferSize = [data length];
    CCCryptorStatus ccStatus;
    uint8_t *bufferPtr = NULL;
    size_t bufferPtrSize = 0;
    size_t movedBytes = 0;
    bufferPtrSize = (encryptedTextBufferSize + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1);
    bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t));
    memset((void *)bufferPtr, 0x0, bufferPtrSize);

    const void *vkey = (const void *) [@"123456789012345678901234" UTF8String];

    ccStatus = CCCrypt(kCCDecrypt,
                       kCCAlgorithm3DES,
                       kCCOptionECBMode | kCCOptionPKCS7Padding,
                       vkey,
                       kCCKeySize3DES,
                       NULL,
                       vEncryptedText,
                       encryptedTextBufferSize,
                       (void *)bufferPtr,
                       bufferPtrSize,
                       &movedBytes);

    NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];
    return [myData base64EncodedStringWithOptions:0];
更新:

我已将数据更改为:

NSData *data = [[NSData alloc] initWithBase64EncodedString:string options:0];
还是不走运。我得到的输出字符串与输入加密字符串相同

我已经通过返回解决了这个问题:

return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

加密数据实际上不可能是有效的UTF-8编码字符串,加密数据是一个数组或8位字节,看起来是随机的

因此第一行:
NSData*data=[string dataUsingEncoding:NSUTF8StringEncoding]

这是不正确的。如果加密数据确实是UTF-8字符串,则可能已将其编码为Base64或十六进制。

尝试解密后ccStatus会怎么说?最好不要使用3DES,它将被AES取代。不要使用ECB模式,这是不安全的,请参阅,向下滚动到Penguin。如果需要帮助,您需要提供十六进制的输入和输出示例。解密代码本身没有错误,只是缺少平衡返回语句的方法行。ccStatus为kCCSuccess,我将添加一个示例输出和输入..ccStatus不指示解密是否正确,只指示参数中没有错误,即编程错误。