AES 加密不起作用 (Xcode)

AES Encryption is not working (Xcode)

我正在尝试使用以下代码使用 AES128 方法将 Xcode 中的字符串加密为 PHP:

Xcode

- (NSData*)AES256EncryptWithKey:(NSString*)key {
    char keyPtr[kCCKeySizeAES256];

    [key cStringUsingEncoding:NSASCIIStringEncoding];

    NSString *iv = @"fdsfds85435nfdfs";
    char ivPtr[kCCKeySizeAES128];

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

    NSUInteger dataLength = [self length];

    size_t bufferSize           = dataLength + kCCBlockSizeAES128;
    void* buffer                = malloc(bufferSize);

    size_t numBytesEncrypted    = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, NULL,
                                          keyPtr, kCCKeySizeAES256,
                                          ivPtr,
                                          [self bytes], dataLength,
                                          buffer, bufferSize,
                                          &numBytesEncrypted);

    if (cryptStatus == kCCSuccess)
    {
        return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
    }

    free(buffer); //free the buffer;
    return nil;
}

但是当我运行上面的编码时,下面的结果不是我期望的:

NSString *key = @"89432hjfsd891787";

NSData *plaintext =  [[@"aaa0000000000000" dataUsingEncoding:NSASCIIStringEncoding] AES256EncryptWithKey: key];

NSString *mystring = [[NSString alloc] initWithData:plaintext encoding:NSASCIIStringEncoding];
NSLog(@"mystring %@", mystring);

输出是

uçó)â½S/èRÅ

我想要的是这样的。

m9FNGM9IiwibWFjIjoiNmJkYzNmZTA5

您似乎需要 Base64 编码的字符串。

NSString *mystring = [plaintext base64EncodedStringWithOptions:0];

注意:由于编码错误,keyPtr 未设置key 值,它成为未初始化内存的值。

你得到 "uçó)â½S/èRÅ" 是因为你试图从数据中创建一个字符串,但有几个原因这不起作用。

  1. 许多数据字节未映射到可打印的 ASCII 字符或任何 unicode 字符。
  2. 一个数据字节可以是 0(平均 256 个字节中的 1 个将是 0x00),这是 "C" 字符串的终止符,因此字符串会很短。

将数据编码为字符串表示有两种通用约定:

  1. 十六进制 ascii,其中每个数据字节被编码为两个字符 0-9a-f。
  2. Base64,其中每 3 个数据数据字节被编码为 4 个 ASCII 字符。

您可能正在寻找 Base64 编码:

NSString *mystring = [plaintext base64EncodedStringWithOptions:0];

代码中的其他错误:

  1. [key cStringUsingEncoding:NSASCIIStringEncoding]; 字符串可能不是ASCII,最好使用NSUTF8StringEncoding。请注意,未捕获输出。
  2. keyPtr 从未设置为键值,见上文。
  3. 密钥大小 ID 指定为 256 位(32 字节)但密钥为 16 个字符,请使用与密钥匹配的密钥大小。
  4. char ivPtr[kCCKeySizeAES128],iv 大小是块大小而不是密钥大小:kCCBlockSizeAES128