1

我已将此功能用于 3des 加密。

 ccStatus = CCCrypt(kCCEncrypt,              // CCoperation op
                       kCCAlgorithm3DES,        // CCAlgorithm alg
                       kCCOptionPKCS7Padding,  // kCCOptionPKCS7Padding,                    //kCCModeECB,              // CCOptions
                       [_keyData bytes],        // const void *key
                       kCCKeySize3DES,          // 3DES key size length 24 bit
                       vinitVec,              //iv,                      // const void *iv,
                       [dTextIn bytes],         // const void *dataIn 
                       [dTextIn length],        // size_t dataInLength
                       bufferPtr,               // void *dataOut
                       bufferPtrSize,           // size_t dataOutAvailable
                       &movedBytes);            // size_t *dataOutMoved
       NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];'

虽然它正在工作。但是当我将此 NSData 转换为 NSString 时,因为 NSString 包含很多空终止,NSString 最终在第一个空终止时结束,变量不能包含整个数据。但我必须在服务器上发送加密字符串。我该怎么做才能将 NSData 转换为 NSString。包含所有数据的字符串意味着(如果数据包含空终止。在这种情况下字符串不会结束)?

请帮助提前谢谢。


谢谢回复,看看加密的字节是否包含

 char bytes[] = { 'H', 'e', 'l', 'l', 'o', \0, 'W', 'o', 'r', 'l', 'd', \0 };
   NSData *data = [NSData dataWithBytes:bytes length:sizeof(bytes)];
   NSString *str = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
   NSLog(@"%@", str);

   NSString *sendtoserver=[NSString stringwithformat:@"<request>%@</request>",str];

当我们将这些 NSData 转换为 NSString 时。它将在第一个 \0 (空终止)处结束,因为我们必须发送加密的 NSString。所以它会出现问题。而且我无法发送base64string,因为服务器端不想要那个。他们要求加密字符串。

所以我现在做什么,请帮助并再次感谢您的回复先生,

4

1 回答 1

0

转换NSDataNSString不会在空字节处停止ANSString可以包含任意 Unicode 字符,包括嵌入的“NULL”字符。

例子:

char bytes[] = { 'H', 'e', 'l', 'l', 'o', 0, 'W', 'o', 'r', 'l', 'd', 0 };
NSData *data = [NSData dataWithBytes:bytes length:sizeof(bytes)];
NSString *str = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
NSLog(@"%@", str);

输出:

Hello

所以看起来字符串只包含 5 个字符,并且转换在第一个空字节处停止。但这只是NSLog输出,实际上没有任何丢失:

for (int i = 0; i < [str length]; i++) {
    unichar c = [str characterAtIndex:i];
    NSLog(@"%2d, %3d, %c", i, c, c);
}

输出:

  0,  72, H
  1, 101, e
  2, 108, l
  3, 108, l
  4, 111, o
  5,   0, 
  6,  87, W
  7, 111, o
  8, 114, r
  9, 108, l
 10, 100, d
 11,   0, 

所以字符串包含所有数据并且没有任何丢失。稍后,当您将字符串发送到服务器时,该字符串可能会被截断。


备注:将加密数据转换为字符串对我来说似乎有问题,因为数据以某种字符编码进行解释。我NSASCIIStringEncoding在这个例子中选择了,但是根据文档,这个编码只对 ASCII 值 0…127 有效。

如果您添加有关如何以及以何种格式将加密数据发送到服务器的更多信息,我们可能会提出如何更好地解决此问题的建议。

于 2012-12-05T20:54:09.487 回答