4

私は暗号化の初心者です。私の要件は、openssl を使用して暗号化/復号化されたテキストを復号化/暗号化することです。私たちが使用しているアルゴリズムは、Openssl の aes-256-cbc です。そのため、アプリケーションに同じ機能を実装しようとしています。これまでのところ、たくさんのグーグル検索の後、私ができたのは..

private static string Encryptor(string TextToEncrypt)
{
    //Turn the plaintext into a byte array.
    byte[] PlainTextBytes = System.Text.ASCIIEncoding.ASCII.GetBytes(TextToEncrypt);            

    //Setup the AES providor for our purposes.
    AesCryptoServiceProvider aesProvider = new AesCryptoServiceProvider();

    aesProvider.BlockSize = 128;
    aesProvider.KeySize = 256;  
    //My key and iv that i have used in openssl
    aesProvider.Key = System.Text.Encoding.ASCII.GetBytes(strKey);
    aesProvider.IV = System.Text.Encoding.ASCII.GetBytes(strIV);  
    aesProvider.Padding = PaddingMode.PKCS7;
    aesProvider.Mode = CipherMode.CBC;

    ICryptoTransform cryptoTransform = aesProvider.CreateEncryptor(aesProvider.Key, aesProvider.IV);            
    byte[] EncryptedBytes = cryptoTransform.TransformFinalBlock(PlainTextBytes, 0, PlainTextBytes.Length);
    return Convert.ToBase64String(EncryptedBytes);                        
}

private static string Decryptor(string TextToDecrypt)
{
    byte[] EncryptedBytes = Convert.FromBase64String(TextToDecrypt);

    //Setup the AES provider for decrypting.            
    AesCryptoServiceProvider aesProvider = new AesCryptoServiceProvider();
    //aesProvider.Key = System.Text.Encoding.ASCII.GetBytes(strKey);
    //aesProvider.IV = System.Text.Encoding.ASCII.GetBytes(strIV);
    aesProvider.BlockSize = 128;
    aesProvider.KeySize = 256;  
    //My key and iv that i have used in openssl
    aesProvider.Key = System.Text.Encoding.ASCII.GetBytes(strKey);
    aesProvider.IV = System.Text.Encoding.ASCII.GetBytes(strIV);  
    aesProvider.Padding = PaddingMode.PKCS7;
    aesProvider.Mode = CipherMode.CBC;


    ICryptoTransform cryptoTransform = aesProvider.CreateDecryptor(aesProvider.Key, aesProvider.IV);
    byte[] DecryptedBytes = cryptoTransform.TransformFinalBlock(EncryptedBytes, 0, EncryptedBytes.Length);
    return System.Text.Encoding.ASCII.GetString(DecryptedBytes);
}

私のopensslコマンドは

openssl aes-256-cbc -e -nosalt -a -in  inputfile.txt -out  output.txt -k key -iv ivkey

私のキーの長さは 32 桁で、iv は 16 桁です

サンクス...

4

1 に答える 1

1

まず、man encopenssl を読み取ります。-ivを使用すると無視さ-kれます。おそらく資本が必要です-K。第 2 に、openssl ツールで使用する場合、キーと iv の値は 16 進数です。C# がコマンド ラインと同じ文字列を使用している場合は、代わりに適切な変換Encoding.ASCII.GetBytesを行う必要があります(いずれにせよ、7 ビット エンコーディングは決して正しい答えではありません)。

プレーンテキストの場合Encoding.UTF8.GetBytes/GetString、ASCII との下位互換性があるため、 を使用することもできます。

何らかの理由で-k、キーと iv の両方を生成するパスワードである lowercase を実際に使用したい場合、openssl は独自のキー派生スキームを使用するため、これははるかに困難です。また、-nosalt旗との併用は危険です。

-nosalt : キー導出ルーチンでソルトを使用しません。このオプションは、テスト目的または古いバージョンの OpenSSL および SSLeay との互換性以外では使用しないでください。

これが危険である理由の 1 つは、IV が予測可能であったり、AES-CBC で再利用されたりしてはならないという事実によるものであり、ソルトを使用しない場合、パスフレーズは常に同じ IV で同じキーを生成し、あなたを開く最大数回の攻撃で、平文に関する情報が漏洩する可能性があります。

このブログ投稿Decrypting OpenSSL AES files in C#から、パスフレーズ、openssl と同じキー、および IV から派生させる方法を見つけることができますが、これは AES-128 専用ですが、コメントから aes-256 用に変更する方法がわかりますman EVP_BytesToKey

Hash0 = ''
Hash1 = MD5(Hash0 + Password + Salt)
Hash2 = MD5(Hash1 + Password + Salt)
Hash3 = MD5(Hash2 + Password + Salt)

Key = Hash1 + Hash2
IV = Hash3
于 2013-03-18T13:44:08.200 に答える