在ios 3des中,加密包含大量的空终止。当我将NSData转换为NSString时,它将最终成为第一个空终止?

时间:2012-12-05 06:31:26

标签: iphone encryption nsstring 3des

我已将此功能用于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.so它正在产生问题。并且我无法发送base64string,因为服务器端不想要那个。他们要求加密字符串。

所以我现在要做的,请帮忙 并再次感谢回复先生,

1 个答案:

答案 0 :(得分:0)

NSData转换为NSString 以null字节停止。 NSString可以包含任意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有效。

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