【问题标题】:Encrypting with OpenSSL and CommonCrypto使用 OpenSSL 和 CommonCrypto 加密
【发布时间】:2017-03-06 18:41:23
【问题描述】:

我正在尝试最终使用 OpenSSL 加密文件并使用 Objective-c CommonCrypto 解密,但在此之前我需要两种方法以相同的方式加密。

这就是我所拥有的:

要加密的字符串:“这是字符串”

键:“thisisthekey”

OpenSSL:

openssl enc -aes256 -a -e -nosalt -in InputFileWithString.txt -out OutputFile.txt thisisthekey

来自 openSSL 的 base 64 编码字符串:HncUM4ryxSR7Rdi7Z49HPl9veOPxkk3l8GYIgorBhbk=

Objective-c CommonCrypto:

+(NSString *)encryptText:(NSString *)text withKey:(NSString *)key{
    NSData *plainData = [text dataUsingEncoding:NSUTF8StringEncoding];

    NSData *encryptedData = [plainData AES256EncryptWithKey:key];

    NSString *base64String = [encryptedData base64EncodedStringWithOptions:0];

    return base64String;
}

- (NSData*)AES256EncryptWithKey:(NSString*)key {
    char keyPtr[kCCKeySizeAES256 + 1]; 
    bzero(keyPtr, sizeof(keyPtr)); 

    [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,
                                          [self bytes], dataLength, 
                                          buffer, bufferSize,
                                          &numBytesEncrypted);

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

    free(buffer);
    return nil;
}

生成的 base 64 编码字符串:gNCs4d0GAxZHRcOtu8RVpLgN0ONKk1r5XkJ4GtL7W2I=

如您所见,每种方法都生成不同的加密字符串。任何想法如何使它们都产生相同的字符串?

【问题讨论】:

标签: objective-c encryption openssl commoncrypto


【解决方案1】:
  1. 使用全长密钥,256 位,即 32 字节,不要依赖填充。由于kCCKeySizeAES256CCCrypt 需要一个 32 字节的密钥,但您提供了 12 个字节并用零填充剩余的密钥空间。

  2. CCCrypt 的默认值是 CBC 模式,但您提供 NULL IV。这基本上会为您提供 ECB 模式,但最好指定选项:kCCOptionECBMode

【讨论】:

    【解决方案2】:

    【讨论】:

    • 链接加密注意事项: 1. AES 的有效密钥大小为 128,192 和 256 字节。 2. 确实需要使用随机IV,否则两个相同的消息将是相同的,即使只有第一部分是相同的信息也可以确定。使用 SecRandomCopyBytes() 创建一个随机 IV,使用它并如前所述将其添加到加密数据中。 3. hexkey 应该是长度验证的,只是填充可能会出现互操作性问题。
    猜你喜欢
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 2022-11-25
    • 2014-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-19
    相关资源
    最近更新 更多