1

openssl で暗号化されたファイルを bash で復号化する際に問題が発生します。以下は、私が段階的に行ったことです。どこが間違っているのかわかりません。

元のファイル (改行で終了):

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.
4

2 に答える 2

0

OpenSSL は非標準形式を使用します。AESencrypt は非常に壊れています (そして安全ではありません)。それらを一緒に置くと、うまくいきません。iOS での OpenSSL 互換ソリューションについては、RNCryptorを参照してください。OpenSSL 自体にも多くの問題がありますが、現時点で推奨できる最良のコマンドライン オプションです。

于 2012-09-03T00:16:55.483 に答える
0

ファイルを暗号化するときにパディングを追加していないようです。復号化時に PKCS7 パディングを期待しているようです。復号化メソッドは、正しいパディングを自動的にチェックします。間違ったパディングが見つかった場合は、エラーがスローされます。

暗号化方法に PKCS7 パディングを追加して、何が起こるかを確認してください。

また、ECB はセキュア モードではないことに注意してください。優先的に CBC または CTR モードを使用します。認証と暗号化が必要な場合は、GCM モードを使用します。

于 2012-09-01T10:28:38.603 に答える