Jak šifrovat a dešifrovat soubor pomocí jazyka Visual C#

Microsoft Visual Basic .NET verzi tohoto článku naleznete v 301070 .

Tento článek se týká následujících oborů názvů knihovny tříd rozhraní.NET Framework společnosti Microsoft:
  • System.IO
  • System.Security
  • System.Security.Cryptography
Poznámka: Tento článek se nevztahuje na Microsoft rozhraní.NET Framework 2.0.

Souhrn

Tento článek popisuje způsob použití třídy kryptografie, které jsou poskytovány podle Microsoft rozhraní.NET Framework k zašifrování souboru text nečitelný stavu a potom dešifrovat tento textový soubor zpět na původní formát.

Požadavky

Následující seznam obsahuje doporučený hardware, software, síťovou infrastrukturu a aktualizace service Pack, které musí mít:
  • Microsoft Windows 2000 Professional, Windows 2000 Server, Windows 2000 Advanced Server, Windows NT 4.0 Server nebo Microsoft Windows XP Professional
  • Microsoft Visual Studio 2005 nebo Microsoft Visual Studio .NET

Šifrování a dešifrování

System.Security.Cryptographic obor názvů v Microsoft rozhraní.NET Framework poskytuje celou řadu nástrojů, které vám pomohou s šifrování a dešifrování. Třída CryptoStream je jedním z mnoha tříd, které je k dispozici. Třída CryptoStream je určen k šifrování nebo dešifrování obsahu jako proudem ven do souboru.

Zašifrovat soubor

Chcete-li zašifrovat soubor, postupujte takto:
  1. Spusťte aplikaci Visual Studio 2005 nebo Visual Studio .NET.
  2. Klepněte na tlačítko Visual C# ve skupinovém rámečku
    Projektya potom klepněte na tlačítko Aplikace konzolyv části šablony. Visual C# .NET vytvoří statické třídy, spolu s prázdné procedury Main() .
  3. Použijte příkaz using (jak je uvedeno v následujícím ukázkovém kódu) na následující obory názvů:
    • Systém
    • System.Security
    • System.Security.Cryptography
    • System.Text
    • System.IO
    takže není nutné kvalifikovat deklarace z těchto oborů názvů později v kódu. Musíte použít tyto příkazy před všemi ostatními deklaracemi.
    using System;using System.IO;
    using System.Security;
    using System.Security.Cryptography;
    using System.Runtime.InteropServices;
    using System.Text;

  4. Tajný klíč k šifrování a dešifrování dat generovat. DESCryptoServiceProvider je založena na algoritmu symetrického šifrování. Symetrické šifrování vyžaduje klíč a inicializační vektor (IV) k šifrování dat. K dešifrování dat, musí mít stejný klíč a IV stejné. Také je nutné použít stejný algoritmus šifrování. Můžete vygenerovat klíče pomocí některé z následujících metod:
    • Metoda 1 Můžete vyzvat uživatele k zadání hesla. Potom použijte heslo jako klíč a IV.
    • Metoda 2 Při vytváření nové instance symetrické šifrování třídy, nový klíč a IV jsou automaticky vytvořeny relace. Pomocí klíče a IV, které jsou generovány spravovaných symetrických kryptografických tříd k šifrování a dešifrování souboru.

      Další informace o generování a distribuce klíčů naleznete v dokumentaci Microsoft rozhraní.NET Framework SDK nebo naleznete následujícím webu Microsoft Developer Network (MSDN):
  5. Přidáte následující funkce generovat nový klíč relace (jak je uvedeno v metodě 2 kroku 4):
    //  Call this function to remove the key from memory after use for security.[System.Runtime.InteropServices.DllImport("KERNEL32.DLL", EntryPoint="RtlZeroMemory")]
    public static extern bool ZeroMemory(ref string Destination, int Length);

    // Function to Generate a 64 bits Key.
    static string GenerateKey()
    {
    // Create an instance of Symetric Algorithm. Key and IV is generated automatically.
    DESCryptoServiceProvider desCrypto =(DESCryptoServiceProvider)DESCryptoServiceProvider.Create();

    // Use the Automatically generated key for Encryption.
    return ASCIIEncoding.ASCII.GetString(desCrypto.Key);
    }
  6. Vytvořte metodu ve třídě s názvem EncryptFile. EncryptFile třída musí mít následující tři parametry:
    • sInputFilename
    • sOutputFilename
    • sKey (Tajný klíč používaný k šifrování a dešifrování souboru.)
    static void EncryptFile(string sInputFilename,string sOutputFilename,
    string sKey)

  7. V EncryptFile postup vytvoření vstupní objekt FileStream a výstup FileStream objekt. Tyto objekty lze číst z a zapsány do cílové soubory.
    FileStream fsInput = new FileStream(sInputFilename, FileMode.Open, 
    FileAccess.Read);

    FileStream fsEncrypted = new FileStream(sOutputFilename,
    FileMode.Create,
    FileAccess.Write);

  8. Deklarujte instanci DESCryptoServiceProvider třída. To představuje skutečné šifrování a dešifrování skutečných technologie, která se používá na soubory. Pokud chcete použít RSAsecutiry nebo jiný šifrovací postup v tomto okamžiku můžete vytvořit různé zprostředkovatele.
    DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
  9. Zprostředkovatele kryptografických služeb musí být vybaveny tajný klíč jako pole bajtů. Obor názvů System.Text poskytuje funkce s názvem GetBytes(). Jako součást jeho kódování funkce funkci GetBytes() přijímá řetězec a vrátí pole bajtů. Velikost klíče je různá pro každý šifrovací postup. Například Data Encryption (Standard DES) trvá 64bitový klíč, který je rovno 8 bajtů nebo 8 znaků.

    Pokud není zadán klíč, zprostředkovatel náhodně generuje jednu. To úspěšně zašifruje soubor, ale neexistuje žádný způsob, jak dešifrovat soubor. Všimněte si, že musí poskytnout inicializační vektor (IV). Tato hodnota se používá jako součást šifrování. Jako klíč IV náhodně generované Pokud nezadáte hodnotu. Vzhledem k tomu, že hodnoty musí být stejné pro šifrování a dešifrování, nesmí dovolit náhodné generování těchto hodnot.
    DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);

  10. Vytvořit instanci třídy CryptoStream pomocí zprostředkovatele kryptografických služeb získat šifrovací objekt (CreateEncryptor) a stávající výstup FileStream objekt jako součást konstruktoru.
    ICryptoTransform desencrypt = DES.CreateEncryptor();CryptoStream cryptostream = new CryptoStream(fsEncrypted, 
    desencrypt,
    CryptoStreamMode.Write);

  11. Čtení vstupního souboru a poté zapsání do výstupního souboru. Průchod CryptoStream objektu kde soubor je šifrován pomocí klíče, který jste zadali.
    byte[] bytearrayinput = new byte[fsInput.Length - 1];fsInput.Read(bytearrayinput, 0, bytearrayinput.Length);
    cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length);

Dešifrování souboru

Chcete-li dešifrovat nějaký soubor, postupujte takto:
  1. Vytvořte metodu s názvem ji
    DecryptFile. Proces dešifrování je podobný procesu šifrování, však DecryptFile procedura má dva hlavní rozdíly v EncryptFile postup.
    • CreateDecryptor namísto CreateEncryptor slouží k vytvoření objektu CryptoStream , která určuje použití objektu.
    • Dešifrovaný text zápisu do cílového souboru, objekt CryptoStream je nyní zdrojem namísto cílový datový proud.
    static void DecryptFile(string sInputFilename,                 string sOutputFilename,
    string sKey)
    {
    DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
    //A 64 bit key and IV is required for this provider.
    //Set secret key For DES algorithm.
    DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
    //Set initialization vector.
    DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);

    //Create a file stream to read the encrypted file back.
    FileStream fsread = new FileStream(sInputFilename,
    FileMode.Open,
    FileAccess.Read);
    //Create a DES decryptor from the DES instance.
    ICryptoTransform desdecrypt = DES.CreateDecryptor();
    //Create crypto stream set to read and do a
    //DES decryption transform on incoming bytes.
    CryptoStream cryptostreamDecr = new CryptoStream(fsread,
    desdecrypt,
    CryptoStreamMode.Read);
    //Print the contents of the decrypted file.
    StreamWriter fsDecrypted = new StreamWriter(sOutputFilename);
    fsDecrypted.Write(new StreamReader(cryptostreamDecr).ReadToEnd());
    fsDecrypted.Flush();
    fsDecrypted.Close();
    }

  2. Na Main() postup volání EncryptFile a DecryptFilepřidejte následující řádky:
    static void Main(){
    // Must be 64 bits, 8 bytes.
    // Distribute this key to the user who will decrypt this file.
    string sSecretKey;

    // Get the key for the file to encrypt.
    sSecretKey = GenerateKey();

    // For additional security pin the key.
    GCHandle gch = GCHandle.Alloc( sSecretKey,GCHandleType.Pinned );

    // Encrypt the file.
    EncryptFile(@"C:\MyData.txt",
    @"C:\Encrypted.txt",
    sSecretKey);

    // Decrypt the file.
    DecryptFile(@"C:\Encrypted.txt",
    @"C:\Decrypted.txt",
    sSecretKey);

    // Remove the key from memory.
    ZeroMemory(gch.AddrOfPinnedObject(), sSecretKey.Length * 2);
    gch.Free();
    }
  3. Uložte soubor. Spusťte aplikaci. Ujistěte se, že cesta, která se používá pro název vstupního souboru odkazuje na existující soubor.

Zkušební postup

Testování tento kód textového souboru (TXT) k potvrzení, že kód zašifrovat a dešifrovat soubor správně. Ujistěte se, dešifrovat soubor do nového souboru (jako v Main() postup v tomto článku) namísto původního souboru. Prohlédněte si dešifrovaný soubor a poté je porovnejte s původním souborem.

Úplný výpis kódu

using System;using System.IO;
using System.Security;
using System.Security.Cryptography;
using System.Runtime.InteropServices;
using System.Text;

namespace CSEncryptDecrypt
{
class Class1
{
// Call this function to remove the key from memory after use for security
[System.Runtime.InteropServices.DllImport("KERNEL32.DLL", EntryPoint="RtlZeroMemory")]
public static extern bool ZeroMemory(IntPtr Destination, int Length);

// Function to Generate a 64 bits Key.
static string GenerateKey()
{
// Create an instance of Symetric Algorithm. Key and IV is generated automatically.
DESCryptoServiceProvider desCrypto =(DESCryptoServiceProvider)DESCryptoServiceProvider.Create();

// Use the Automatically generated key for Encryption.
return ASCIIEncoding.ASCII.GetString(desCrypto.Key);
}

static void EncryptFile(string sInputFilename,
string sOutputFilename,
string sKey)
{
FileStream fsInput = new FileStream(sInputFilename,
FileMode.Open,
FileAccess.Read);

FileStream fsEncrypted = new FileStream(sOutputFilename,
FileMode.Create,
FileAccess.Write);
DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
ICryptoTransform desencrypt = DES.CreateEncryptor();
CryptoStream cryptostream = new CryptoStream(fsEncrypted,
desencrypt,
CryptoStreamMode.Write);

byte[] bytearrayinput = new byte[fsInput.Length];
fsInput.Read(bytearrayinput, 0, bytearrayinput.Length);
cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length);
cryptostream.Close();
fsInput.Close();
fsEncrypted.Close();
}

static void DecryptFile(string sInputFilename,
string sOutputFilename,
string sKey)
{
DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
//A 64 bit key and IV is required for this provider.
//Set secret key For DES algorithm.
DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
//Set initialization vector.
DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);

//Create a file stream to read the encrypted file back.
FileStream fsread = new FileStream(sInputFilename,
FileMode.Open,
FileAccess.Read);
//Create a DES decryptor from the DES instance.
ICryptoTransform desdecrypt = DES.CreateDecryptor();
//Create crypto stream set to read and do a
//DES decryption transform on incoming bytes.
CryptoStream cryptostreamDecr = new CryptoStream(fsread,
desdecrypt,
CryptoStreamMode.Read);
//Print the contents of the decrypted file.
StreamWriter fsDecrypted = new StreamWriter(sOutputFilename);
fsDecrypted.Write(new StreamReader(cryptostreamDecr).ReadToEnd());
fsDecrypted.Flush();
fsDecrypted.Close();
}

static void Main()
{
// Must be 64 bits, 8 bytes.
// Distribute this key to the user who will decrypt this file.
string sSecretKey;

// Get the Key for the file to Encrypt.
sSecretKey = GenerateKey();

// For additional security Pin the key.
GCHandle gch = GCHandle.Alloc( sSecretKey,GCHandleType.Pinned );

// Encrypt the file.
EncryptFile(@"C:\MyData.txt",
@"C:\Encrypted.txt",
sSecretKey);

// Decrypt the file.
DecryptFile(@"C:\Encrypted.txt",
@"C:\Decrypted.txt",
sSecretKey);

// Remove the Key from memory.
ZeroMemory(gch.AddrOfPinnedObject(), sSecretKey.Length * 2);
gch.Free();
}
}
}

Odkazy

Další informace o kryptografii a o používání kryptografických funkcí .NET naleznete na následujících webech MSDN:
Vlastnosti

ID článku: 307010 - Poslední kontrola: 10. 1. 2017 - Revize: 1

Váš názor