0

我正在开发一个将加密数据发送到服务器的应用程序。服务器使用带有 CFB8 的 3des 并且没有填充。我已经阅读了 stackoverflow 中的大部分相关问题,但仍然无法正常工作。已经为此工作了几天,但仍然无法使其与服务器加密相匹配。这是我尝试过的-

 + (NSString*) doCipher:(NSString*)plainText operation:(CCOperation)encryptOrDecrypt {

        const void *vplainText;
        NSData* plainTextData;
        size_t plainTextBufferSize;

        if (encryptOrDecrypt == kCCDecrypt)
        {
           NSData *EncryptData =[NSData  dataWithBase64EncodedString:plainText];
        plainTextBufferSize = [EncryptData length];
        vplainText = [EncryptData bytes];
        }
        else
        {
             plainTextData = [plainText dataUsingEncoding:NSUTF8StringEncoding];
        plainTextBufferSize = [plainTextData length];
        }

        CCCryptorStatus ccStatus;
        uint8_t *bufferPtr = NULL;
        size_t bufferPtrSize = 0;
        size_t movedBytes = 0;
         uint8_t iv[kCCBlockSize3DES];

        bufferPtrSize = (plainTextBufferSize + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1);
        bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t));
        memset((void *)bufferPtr, 0x0, bufferPtrSize);
         memset((void *) iv, 0x0, (size_t) sizeof(iv));

        const void *vkey = kPrivateKey;
        unsigned char IV[8]={0,0,0,0,0,0,0,0};

        ccStatus = CCCrypt(encryptOrDecrypt,
                       kCCAlgorithm3DES,
                       0,
                       [keyData bytes],
                       [key length],
                       IV,
                       [plainTextData bytes],
                       plainTextBufferSize,
                       (void *)bufferPtr,
                       bufferPtrSize,
                       &movedBytes);

        if (ccStatus == kCCSuccess) NSLog(@"SUCCESS");
        else if (ccStatus == kCCParamError) return @"PARAM ERROR";
        else if (ccStatus == kCCBufferTooSmall) return @"BUFFER TOO SMALL";
        else if (ccStatus == kCCMemoryFailure) return @"MEMORY FAILURE";
        else if (ccStatus == kCCAlignmentError) return @"ALIGNMENT";
        else if (ccStatus == kCCDecodeError) return @"DECODE ERROR";
        else if (ccStatus == kCCUnimplemented) return @"UNIMPLEMENTED";

        NSString *result;

        if (encryptOrDecrypt == kCCDecrypt)
        {
            result = [[NSString alloc] initWithData: [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes] encoding:NSASCIIStringEncoding];
        }
        else
        {
            NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];
            result = [myData base64EncodedString];
        }

        return result;
    }

目前似乎CCOptions支持kCCOptionPKCS7PaddingkCCOptionECBMode。如何使用 CFB8 实现 3des 而没有填充。任何建议将不胜感激。

4

1 回答 1

2

编辑:对不起;我之前忽略了一个关键点。您永远不会要求 CFB8 模式。默认为 CBC 模式。

你不能用CCCrypt()这个。您必须使用CCCryptorCreateWithMode()才能通过该模式。然后调用CCCryptorUpdate()数据并CCCryptorFinal()完成。


如果您不想要填充,为什么要请求填充?删除kCCOptionPKCS7Padding. 如果您不想要任何选项(您似乎不想要),只需传递 0。

CFB-8 采用初始化向量。您已将其设置为全 0。这是服务器正在使用的吗?(这是一个非常差的 IV;CFB 的 IV 应该是随机的,而不是固定的。)

这些行很危险:

    plainTextBufferSize = [plainText length];
    vplainText = (const void *) [plainText UTF8String];

这将截断任何多字节字符串。更好的解决方案是创建一个NSData

plainTextData = [self.plainText dataUsingEncoding:NSUTF8StringEncoding];

然后,您可以使用bytes和。lengthplainTextData

于 2014-01-27T13:50:33.740 回答