繁体   English   中英

如何在CLI中加密文件并使用iOS对其解密?

[英]How to encrypt a file in a CLI and decrypt it with iOS?

我在用bash解密用openssl加密的文件时遇到一些问题。 以下是我逐步进行的操作。 我不知道哪里出了问题。

原始文件(以换行符结尾):

123456
abcdef
ghijkl

生成32个字节长的随机密码:

$ openssl rand -hex 32
fec8950708098e9075e8b4df9a969aa7963c4d820158e965c7848dbfc8ca73ed

加密文件:

$ openssl aes-128-ecb -in original.txt -out encrypted.txt

关于加密文件:

$ file encrypted.txt
encrypted.txt: Non-ISO extended-ASCII text, with CR line terminators, with overstriking
$ cat encrypted.txt
Salted__??\z?F?z????4G}Q? Y?{ӌ???????b*??

调用解密方法的代码:

NSData *myDataDec = [self aesDecrypt:@"fec8950708098e9075e8b4df9a969aa7963c4d820158e965c7848dbfc8ca73ed" data:myData];
NSLog(@"decrypted: %@", [[NSString alloc] initWithData:myDataDec encoding:NSASCIIStringEncoding]);

解密方法:

- (NSData *)aesDecrypt:(NSString *)key data:(NSData *)data
{  

    // '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 = [data length];   
    //See the doc: For block ciphers, the output size will always be less than or equal to the input size plus the size of one block.  //That's why we need to add the size of one block here
    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);
    size_t numBytesEncrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, 
                                          kCCAlgorithmAES128, 
                                          kCCOptionPKCS7Padding,
                                          keyPtr, 
                                          kCCKeySizeAES256,
                                          NULL /* initialization vector (optional) */,             
                                          [data bytes], 
                                          dataLength, /* input */             
                                          buffer, 
                                          bufferSize, /* output */             
                                          &numBytesEncrypted);  
    NSLog(@"cryptStatus: %d", cryptStatus);
    if (cryptStatus == kCCSuccess) 
    {   
        NSLog(@"aes success");
        //the returned NSData takes ownership of the buffer and will free it on deallocation   
        return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];  
    }   
    NSLog(@"aes error");
    free(buffer); //free the buffer;  
    return nil; 
}

日志:

2012-09-01 15:08:51.331 My Project[75582:f803] cryptStatus: -4304
2012-09-01 15:08:51.332 My Project[75582:f803] aes error
2012-09-01 15:08:51.332 My Project[75582:f803] decrypted:

kCCDecodeError详细信息:

kCCDecodeError - Input data did not decode or decrypt properly.

加密文件时似乎没有添加填充。 您似乎在解密时期望PKCS7填充。 解密方法将自动检查正确的填充。 如果发现不正确的填充,则将引发错误。

将PKCS7填充添加到您的加密方法中,然后看看会发生什么。

另请注意,ECB不是安全模式。 优先使用CBC或CTR模式。 如果您需要身份验证和加密,请使用GCM模式。

OpenSSL使用非标准格式。 AESencrypt非常损坏(并且不安全)。 将它们放在一起,将无法正常工作。 有关iOS上与OpenSSL兼容的解决方案,请参见RNCryptor OpenSSL本身有很多问题,但这是我现在可以推荐的最佳命令行选项。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM