私の WPF .NET 4 アプリケーションには、マルウェア識別の観点から、いくつかの欠点があります。
- サムドライブから直接実行する必要があります
- ユーザーがホスト コンピューターに関連付けられたデバイス セキュリティを設定できるようにする必要があります。
- デバイスのセキュリティが設定されると、デバイス上に復号化されたファイルが存在してはなりません
- ホスト コンピューターの一時ディレクトリへのファイルを復号化する必要があります。
結局のところ、ユーザーのファイルを暗号化し、復号化キーの支払いを要求する「ランサムウェア」が現在出回っています。
特に Kapersky は、ファイル暗号化プロセスをマルウェアとしてフラグ付けし、非常に効果的にアプリケーションを強制終了します。暗号化の際、Kaspersky は として識別されるマルウェアを識別しPDM:Win32.Generic
、検出、終了、および削除に進みます。すでに暗号化されたデバイスをスキャンすると、100% クリーンに戻ります - 問題ありません。
これがファイルの暗号化/復号化コードです。これは、CodeProject のファイル暗号化に関する記事を基にしています。このコードには、AV ソフトウェアで疑惑を引き起こす何かが含まれている可能性がありますか? 私は純粋な.NETのみを使用しており、サードパーティのライブラリは使用していません:
/// <summary>
/// Encrypt a file with a user-supplied password.
/// WARNING: File will be lost if password is forgotton.
/// </summary>
/// <param name="inputFile">
/// The name of the unencrypted file to encrypt.
/// </param>
/// <param name="encryptedFile">
/// The name of the newly encrypted file to created.
/// </param>
/// <param name="clearTextPassword"></param>
/// <param name="salt">
/// You can bypass this and use the predefined salt in this class
/// BUT IT IS NOT RECOMMENDED. Your code should provide an 8-byte
/// array for the salt.
/// </param>
public static void EncryptFile( string inputFile, string encryptedFile,
string clearTextPassword, byte[] salt = null )
{
salt = salt ?? FileSalt;
byte[] key = new Rfc2898DeriveBytes( clearTextPassword, salt ).GetBytes( 16 );
FileStream fsCrypt = new FileStream( encryptedFile, FileMode.Create );
RijndaelManaged rmCrypto = new RijndaelManaged();
rmCrypto.Padding = PaddingMode.PKCS7;
CryptoStream cs = new CryptoStream( fsCrypt,
rmCrypto.CreateEncryptor( key, key ),
CryptoStreamMode.Write );
FileStream fsIn = new FileStream( inputFile, FileMode.Open );
int data;
while( ( data = fsIn.ReadByte() ) != -1 )
cs.WriteByte( (byte)data );
fsIn.Close();
cs.Close();
fsCrypt.Close();
}
/// <summary>
/// Decrypt a file with a user-supplied password.
/// </summary>
/// <param name="inputFile">
/// The name of the encrypted file to decrypt.
/// </param>
/// <param name="unencryptedFile">
/// The name of the unencrypted file to create.
/// </param>
/// <param name="clearTextPassword"></param>
/// <param name="salt">
/// You can bypass this and use the predefined salt in this class
/// BUT IT IS NOT RECOMMENDED. Your code should provide an 8-byte
/// array for the salt.
/// </param>
public static void DecryptFile( string inputFile, string unencryptedFile,
string clearTextPassword, byte[] salt = null )
{
salt = salt ?? FileSalt;
byte[] key = new Rfc2898DeriveBytes( clearTextPassword, salt ).GetBytes( 16 );
FileStream fsCrypt = new FileStream( inputFile, FileMode.Open );
RijndaelManaged rmCrypto = new RijndaelManaged();
rmCrypto.Padding = PaddingMode.PKCS7;
CryptoStream cs = new CryptoStream( fsCrypt,
rmCrypto.CreateDecryptor( key, key ),
CryptoStreamMode.Read );
FileStream fsOut = new FileStream( unencryptedFile, FileMode.Create );
int data;
while( ( data = cs.ReadByte() ) != -1 )
fsOut.WriteByte( (byte)data );
fsOut.Close();
cs.Close();
fsCrypt.Close();
}
その情報が AV 問題の解決に役立たない限り、クリア テキスト パスワードなどに対する string と SecureString の使用についてのコメントにはあまり興味がないことに注意してください。