データを暗号化し、アプリ サンドボックス内のファイルに保存する iOS モバイル アプリがあります。ファイルは次のように CCCrypt() を使用して暗号化されます。
CCCryptorStatus aCryptStatus = CCCrypt(kCCEncrypt,
kCCAlgorithmAES128,
kCCOptionPKCS7Padding,
aKeyPtr,
kCCKeySizeAES256,
aIVPtr,
[self bytes],
aDataLength,
aBuffer,
aBufferSize,
&aNumBytesEncrypted);
キーの長さは 256 ビット、IV の長さは 128 ビットです。私は暗号化の専門家ではありませんが、これは CBC モード (CCCrypt() のデフォルト) を使用する必要があり、ここで指定された PKCS#7 パディング オプションは openssl の PKCS#5 パディングと同等であることを理解しています。
データは次のようにファイルに書き込まれます。
NSData* aSerializedData = [[self serialize] dataUsingEncoding:NSUTF8StringEncoding];
NSData* aEncryptedData = [aSerializedData AES256EncryptWithKey:ENCKey
InitializationVector:ENCIv];
NSFileManager* aFileManager = [[NSFileManager alloc] init];
BOOL aFileWritten = [aFileManager createFileAtPath:aFilePath
contents:aEncryptedData
attributes:nil];
次のようにopensslを使用してファイルの復号化を試みました(キーとivは0に置き換えられました):
$ openssl enc -aes-128-cbc -d -K 00000000000000000000000000000000 -iv 0000000000000000 -in encrypted.dat -out decrypted.txt
と
$ openssl enc -aes-256-cbc -d -K 00000000000000000000000000000000 -iv 0000000000000000 -in encrypted.dat -out decrypted.txt
どちらも同じエラーを返します:
不正な復号化 28969:エラー:06065064:デジタル エンベロープ ルーチン:EVP_DecryptFinal_ex:不正な復号化:/SourceCache/OpenSSL098/OpenSSL098-50/src/crypto/evp/evp_enc.c:330:
-nosalt や -a などの他のモードやオプションも試しました。クリアテキストを返したものはありません。
オンラインでこれを行う方法の例を見つけるのに何時間も費やしましたが、問題の解決に役立つものは何もありませんでした. 助けていただければ幸いです。
==========
回答: CCCrypt のキーは、256 ビットに変換される 32 文字の文字列です。openssl が期待するキーは、その文字列のバイナリ表現からの 64 の 16 進数です。同様に、CCCrypt の iv は 16 文字の文字列で、128 ビットに変換されます。openssl が期待する iv は、その文字列の 16 進表現です。これら 2 つの 16 進表現を使用すると、簡単に復号化できました。