【问题标题】:uint8_t[] array transform to NSString got (null)uint8_t[] 数组转换为 NSString got (null)
【发布时间】:2013-07-13 03:05:41
【问题描述】:

我不知道为什么 (char *)uint8_t 数组转换为 NSString 不起作用。 ivString 始终为 (null)

- (IBAction)encryptPacketBtnTouchDown:(id)sender {
    NSString *key = @"1234567890123456";
    NSData *plain = [plainMessage.text dataUsingEncoding:NSUTF8StringEncoding];
    uint8_t initialisationVector[16];
    arc4random_buf(initialisationVector, 16);

    NSString* ivString =  [NSString stringWithUTF8String:(char *)initialisationVector];

    NSData *cipherData = [plain AES128EncryptWithKey:key iv:ivString];
    [asyncSocket writeData:cipherData withTimeout:-1.0 tag:0];
    NSString* cipherString = [[NSString alloc] initWithBytes:[cipherData bytes] 
                                                      length:[cipherData length] 
                                                    encoding:NSASCIIStringEncoding];
}

cipherData NSData * 0x1edaf3a0 16 字节

cipherString NSString * 0x00000000

initialisationVector uint8_t [16]

ivString NSString * 0x00000000

键 NSString * 0x000d28c4 @"1234567890123456"

普通 NSData * 0x1ed80760 9 个字节

附言

NSString* ivString =  [[NSString alloc] initWithBytes:initialisationVector
                                               length:16
                                             encoding:NSUTF8StringEncoding];

这也行不通。仍然得到(空)

我调用的方法是:

- (NSData *)AES128Operation:(CCOperation)operation key:(NSString *)key iv:(NSString *)iv
{
    char keyPtr[kCCKeySizeAES128 + 1];
    memset(keyPtr, 0, sizeof(keyPtr));
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

    char ivPtr[kCCBlockSizeAES128 + 1];
    memset(ivPtr, 0, sizeof(ivPtr));

    [iv getCString:ivPtr
         maxLength:sizeof(ivPtr)
          encoding:NSUTF8StringEncoding];

    NSUInteger dataLength = [self length];
    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);

    size_t numBytesCrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(operation,
                                          kCCAlgorithmAES128,
                                          kCCOptionPKCS7Padding,
                                          keyPtr,
                                          kCCBlockSizeAES128,
                                          ivPtr,
                                          [self bytes],
                                          dataLength,
                                          buffer,
                                          bufferSize,
                                          &numBytesCrypted);
    if (cryptStatus == kCCSuccess) {
        return [NSData dataWithBytesNoCopy:buffer length:numBytesCrypted];
    }
    free(buffer);
    return nil;
}

- (NSData *)AES128EncryptWithKey:(NSString *)key iv:(NSString *)iv
{
    return [self AES128Operation:kCCEncrypt key:key iv:iv];
}

【问题讨论】:

  • cipherDatainitialisationVector 不代表字符串。它们是字节数组。您为什么要尝试将其转换为字符串?
  • 我需要在屏幕上显示加密结果。但是,这不是我的问题。我的问题是我无法将初始化向量 uint8_t[] 转换为 NSString。因为我使用所需的 NSString 作为 IV 格式的库。 ivString == (null) 是我的问题。
  • 但是initialisationVector 是一个随机字节序列。这些字节不代表 UTF-8 编码(或任何其他编码)字符串。这个AES128EncryptWithKey:iv: 方法来自哪里?
  • IV 是随机字节。你说的对。但是,我需要将方法作为参数输入。参数格式是 NSString。所以,我需要将字节数组转换为 NSString。
  • 我知道您需要一个随机字符串作为 IV,但您不能从随机字节创建 NSString。我觉得奇怪的是这种方法使用NSString 作为iv 参数。我建议您更新方法以采用uint8_t 数组而不是NSString。然后你可以直接传入随机字节,避免与NSString的不必要的转换。

标签: objective-c nsstring nsdate uint8t


【解决方案1】:

终于,我得到了答案!
我只需要将 uint8_t[] 数组视为 char[] 数组。然后,通过以下行将 char[] 数组转换为 NSString:

NSString* ivString = [NSString stringWithCString:initialisationVector encoding:NSASCIIStringEncoding];

结果是: ivString NSString * 0x1d8489c0 @"¹U ¡hÌTÖÆáβÍ"

【讨论】:

    猜你喜欢
    • 2011-10-29
    • 1970-01-01
    • 1970-01-01
    • 2019-10-14
    • 1970-01-01
    • 2019-08-11
    • 2019-11-21
    • 1970-01-01
    • 2012-02-29
    相关资源
    最近更新 更多