【问题标题】:Confusion with Objective-C Encryption- Having a Warning/Error, how can I fix this?与 Objective-C 加密混淆 - 出现警告/错误,我该如何解决?
【发布时间】:2026-01-06 15:05:03
【问题描述】:

我正在使用以下代码块加密文本字符串。 此代码与 AES256EncryptWithKey 的方法有关,但是当我运行项目并单击使用此代码的按钮时,会收到未捕获的异常和警告。警告说:“NSString 可能无法响应:'-AES256EncryptWithKey'”。我能做些什么?是否可以在其中放置一大块处理异常的代码?还是完全不同?

NSString *Input  = [Inputbox text];
    [Input AES256encryptWithKey];

这是我使用的与 AES256EncryptWithKey 相关的代码:

@implementation NSData (AES256)

- (NSData *)AES256EncryptWithKey:(NSString *)key {
    // 'key' should be 32 bytes for AES256, will be null-padded otherwise
    char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused)
    bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)

    // fetch key data
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

    NSUInteger dataLength = [self length];

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

    size_t numBytesEncrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
                                          keyPtr, kCCKeySizeAES256,
                                          NULL /* initialization vector (optional) */,
                                          [self bytes], dataLength, /* input */
                                          buffer, bufferSize, /* output */
                                          &numBytesEncrypted);
    if (cryptStatus == kCCSuccess) {
        //the returned NSData takes ownership of the buffer and will free it on deallocation
        return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
    }

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

提前谢谢你。感谢您提供链接、教程、答案和其他任何内容。

【问题讨论】:

    标签: objective-c xcode cocoa-touch aes


    【解决方案1】:

    那是因为 NSString 实际上没有响应该消息 - 您的代码将类别添加到 NSData

    记住加密适用于二进制数据,因此您必须将潜在的 unicode NSString 转换为明确定义的二进制编码(例如,UTF-8)

    最快的转换是使用NSStringdataWithEncoding方法。

    【讨论】:

      【解决方案2】:

      错误似乎在第一行,应该说

      @implementation NSString (AES256)
      

      然后在您的方法中使用dataWithEncoding 方法将您的字符串key 转换为NSData

      【讨论】:

      • 您编辑的版本也不起作用 - NSString 不包含 bytes 方法。
      • 好吧,你是对的。再次编辑答案。对了,现在去睡觉了。很明显,我太累了。
      最近更新 更多