2

如何使用命令行 openssl 获得与以下objective-c 加密方法相同的结果?

- (NSData *)AES256EncryptWithKey:(NSString *)key {
    NSData *returnData = nil;

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

    if (cryptStatus == kCCSuccess) {
        returnData  = [[NSData alloc] initWithBytes:buffer length:numBytesEncrypted];
    }

    free(buffer);

    return returnData;
}

我尝试了以下方法(有和没有 -nosalt),但没有成功:

openssl aes-256-ecb -nosalt -in original.txt -out encrypted.txt
openssl aes-128-ecb -nosalt -in original.txt -out encrypted.txt
4

1 回答 1

3

虽然有可能,但您不应该这样做。这个 ObjC 加密代码很破。它错误地创建了密钥,这就是为什么您在使用 OpenSSL 时遇到问题的原因(它也很差地创建了密钥,但更好,并且以不同的方式)。如果您想要与 OpenSSL 兼容的 ObjC 加密模块,请参阅旨在处理此问题的RNCryptor 。如果可能的话,我会避免使用 OpenSSL,但目前没有我推荐的简单命令行替代品。

请参阅 RNCryptor 的文档了解为什么这个 ObjC 代码被破坏,以及 OpenSSl 的 aes 加密例程的问题。

于 2012-09-02T23:56:46.127 回答