2012-09-01 100 views
2

如何通过命令行openssl获得与以下objective-c加密方法相同的结果?openssl等效于AES256EncryptWithKey方法

- (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 

回答

3

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

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