0

我需要用 3DES 加密一个 NSString,但我做不到。它返回给我一个大的 NSString 结果:

ccStatus = CCCrypt(kCCEncrypt,
                   kCCAlgorithm3DES,
                   kCCOptionECBMode | kCCOptionPKCS7Padding ,
                   vkey, //"123456789012345678901234", //key
                   kCCKeySize3DES,
                   vinitVec,// vinitVec, //"init Vec", //iv,
                   vplainText, //"Your Name", //plainText,
                   plainTextBufferSize,
                   (void *)bufferPtr,
                   bufferPtrSize,
                   movedBytes);

NSString *result;
NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];
result = [myData base64Encoding];

NSLog(@"%@", result);
4

1 回答 1

2

试试这个..它对我有用。

    NSData *data = [NSString dataUsingEnconding:NSASCIIStringEncoding];
    NSData *key = [self create3DesKey]; //This should be 24 characters, or 24 bytes

    const void *vplainText;
    size_t plainTextBufferSize;
    plainTextBufferSize = [data length];
    vplainText = (const void *)[data bytes];

    CCCryptorStatus ccStatus;
    uint8_t *bufferPtr = NULL;
    size_t movedBytes = 0;

    bufferPtr = (uint8_t *) malloc( [data length] * sizeof(uint8_t));
    memset((void *)bufferPtr, 0x0, [data length]);

    NSString *initVec = @"init_Vec";

    const void *vkey = (const void *) [key bytes];
    const void *vinitVec = (const void *) [initVec UTF8String];

    ccStatus = CCCrypt(kCCEncrypt,//encryptOrDecrypt,
                       kCCAlgorithm3DES,
                       plainTextBufferSize % 8 == 0 ? kCCOptionECBMode : KCCOptionPKCS7PAdding , //
                       vkey, //this should 24 bytes from 0x00 to 0xFF
                       kCCKeySize3DES,
                       vinitVec, //"init Vec", //iv,
                       vplainText, //This should be a multiple of 8 bytes or you will have to use KCCOptionPKCS7PAdding
                       plainTextBufferSize,
                       (void *)bufferPtr,
                       [data length],
                       &movedBytes);

NSString *result;
NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];
result = [myData base64Encoding];

NSLog(@"%@", result);

应该使用此函数以正确的方式创建密钥:

-(NSData*)create3DesKey
{
NSMutableData *mData = [[NSMutableData alloc] init];
    NSMutableData *mAuxData = [[NSMutableData alloc] init];

    for(int i = 0; i < 16; ++i)
    {
        u_int32_t aux = arc4random() % 255;

        [mData appendBytes:&aux length:1];

        if(i < 8)
        {
            [mAuxData appendBytes:&aux length:1];
        }
    } 

    [mData appendData:mAuxData];    

    return mData;
}

我自己一直在解决它。请注意,createkey 函数会创建一个 EDE 密钥,该密钥声明密钥的前 8 个字节与最后 8 个字节完全相同。它也可以以所有 3 个 8 字节的块相同或完全不同的方式创建。您应该检查您的服务器处理哪一个。

希望能帮助到你。

于 2012-03-28T20:53:24.173 回答