Jak šifrovat a dešifrovat soubor pomocí jazyka Visual Basic .NET nebo Visual Basic 2005

Microsoft Visual C# .NET verzi tohoto článku naleznete v tématu
307010 .
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

V TOMTO ÚKOLU

Souhrn

Tento článek popisuje způsob použití třídy kryptografie, které jsou k dispozici v Microsoft rozhraní.NET Framework. Zašifrování souboru text nečitelný stavu můžete použít třídy kryptografie. Potom může dešifrovat tento textový soubor zpět na původní formát.

zpět na horní

Požadavky

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

Použití šifrování a dešifrování

System.Security.Cryptographic obor názvů v rozhraní.NET Framework poskytuje celou řadu nástrojů pro podporu š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, jak tento obsah je přenášen datovými proudy do souboru.

Chcete-li zašifrovat soubor, postupujte takto:
  1. Spusťte aplikaci Visual Studio .NET nebo Visual Studio 2005.
  2. Vytvoření nové aplikace konzoly v jazyce Visual Basic .NET nebo Visual Basic 2005. Modul je vytvořen, spolu s prázdné procedury Main() .
  3. Pomocí příkazu Imports v oboru názvů System, System.Security obor názvů, názvů System.Security.Cryptography, System.Text obor názvů a obor názvů System.IO. Je nutné provést, 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.
    Imports SystemImports System.IO
    Imports System.Security
    Imports System.Security.Cryptography
    Imports System.Runtime.InteropServices
    Imports System.Text

  4. Tajný klíč k šifrování a dešifrování dat generovat. DESCryptoServiceProvider třída 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 nový IV jsou automaticky vytvořeny relace. Můžete použít klíč 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 způsobu generování a distribuce klíčů, naleznete na následujícím webu společnosti Microsoft nebo v tématu rozhraní.NET Framework software development kit (SDK) dokumentace:

      http://msdn.microsoft.com/en-us/library/5e9ft273(VS.71).aspx
  5. Přidáte následující funkce generovat nový klíč relace, jak je uvedeno v metodě 2:
       ' Call this function to remove the key from memory after it is used for security.   Private Declare Sub ZeroMemory Lib "kernel32.dll" Alias "RtlZeroMemory" _
    (ByVal Destination As String, ByVal Length As Integer)

    ' Function to generate a key.
    Function GenerateKey() As String
    ' Create an instance of Symmetric Algorithm. The key and the IV are generated automatically.
    Dim desCrypto As DESCryptoServiceProvider = DESCryptoServiceProvider.Create()

    ' Use the automatically generated key for encryption.
    Return ASCIIEncoding.ASCII.GetString(desCrypto.Key)
    End Function
  6. Vytvořte metodu ve třídě s názvem EncryptFile. Metoda EncryptFile musí mít tři parametry:
    • sInputFile
    • sOutputFile
    • sKey (To je tajný klíč používaný k šifrování a dešifrování souboru.)
        Sub EncryptFile(ByVal sInputFilename As String, _                   ByVal sOutputFilename As String, _
    ByVal sKey As String)
    End Sub

  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.
            Dim fsInput As New FileStream(sInputFilename, _                                    FileMode.Open, FileAccess.Read)
    Dim fsEncrypted As 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. V tomto okamžiku můžete vytvořit různé zprostředkovatele, pokud chcete použít zabezpečení RSA nebo jiný šifrovací postup.
    Dim DES As 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 je také nutné zadat 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řte instanci třídy CryptoStream . Chcete-li získat šifrovací objekt (CreateEncryptor) pomocí zprostředkovatele kryptografických služeb a stávající výstup FileStream objekt jako součást konstruktoru.
    Dim cryptostream As 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.
    Dim bytearrayinput(fsInput.Length - 1) As BytefsInput.Read(bytearrayinput, 0, bytearrayinput.Length)
    cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length)

Chcete-li dešifrovat nějaký soubor, postupujte takto:
  1. Vytvořte metodu s názvem DecryptFile. Proces dešifrování je podobný procesu šifrování. Dva hlavní rozdíly v EncryptFile postup má však DecryptFile .
    • CreateDecryptor namísto CreateEncryptor slouží pro vytvoření CryptoStream objektu, 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.
    Sub DecryptFile(ByVal sInputFilename As String, _    ByVal sOutputFilename As String, _
    ByVal sKey As String)

    Dim DES As New DESCryptoServiceProvider()
    'A 64-bit key and an IV are 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.
    Dim fsread As New FileStream(sInputFilename, FileMode.Open, FileAccess.Read)
    'Create a DES Decryptor from your DES instance.
    Dim desdecrypt As ICryptoTransform = DES.CreateDecryptor()
    'Create a crypto stream set to read and to do a DES decryption transform on incoming bytes.
    Dim cryptostreamDecr As New CryptoStream(fsread, desdecrypt, CryptoStreamMode.Read)
    'Print out the contents of the decrypted file.
    Dim fsDecrypted As New StreamWriter(sOutputFilename)
    fsDecrypted.Write(New StreamReader(cryptostreamDecr).ReadToEnd)
    fsDecrypted.Flush()
    fsDecrypted.Close()
    End Sub

  2. Přidejte následující řádky na Main() postup volání EncryptFile a DecryptFile.
        Public Sub Main()      'Must be 64 bits, 8 bytes.      Dim sSecretKey As String

    ' Get the key for the file to encrypt.
    ' You can distribute this key to the user who will decrypt the file.
    sSecretKey = GenerateKey()

    ' For additional security, pin the key.
    Dim gch As GCHandle = GCHandle.Alloc(sSecretKey, GCHandleType.Pinned)


    ' Encrypt the file.
    EncryptFile("%USERPROFILE%\MyData.txt", _
    "%USERPROFILE%\Encrypted.txt", _
    sSecretKey)

    ' Decrypt the file.
    DecryptFile("%USERPROFILE%\Encrypted.txt", _
    "%USERPROFILE%\Decrypted.txt", _
    sSecretKey)

    ' Remove the key from memory.
    ZeroMemory(gch.AddrOfPinnedObject(), sSecretKey.Length * 2)
    gch.Free()
    End Sub
  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í a není důležitý soubor.
zpět na horní

Ověřte, že šifrování a dešifrování práce

Testování tento kód textového souboru (TXT) potvrďte správně zašifrovat a dešifrovat soubor. Ujistěte se, dešifrovat soubor do nového souboru (jako Sub Main() postup v tomto článku) namísto původního souboru. Prohlédněte si dešifrovaný soubor a porovnat dešifrovaný soubor původní.

zpět na horní

Kompletní kód seznamu

Imports SystemImports System.IO
Imports System.Security
Imports System.Security.Cryptography
Imports System.Runtime.InteropServices
Imports System.Text


Module Module1

' Call this function to remove the key from memory after it is used for security.
<DllImport("kernel32.dll")> _
Public Sub ZeroMemory(ByVal addr As IntPtr, ByVal size As Integer)
End Sub

' Function to generate a 64-bit key.
Function GenerateKey() As String
' Create an instance of a symmetric algorithm. The key and the IV are generated automatically.
Dim desCrypto As DESCryptoServiceProvider = DESCryptoServiceProvider.Create()

' Use the automatically generated key for encryption.
Return ASCIIEncoding.ASCII.GetString(desCrypto.Key)

End Function

Sub EncryptFile(ByVal sInputFilename As String, _
ByVal sOutputFilename As String, _
ByVal sKey As String)

Dim fsInput As New FileStream(sInputFilename, _
FileMode.Open, FileAccess.Read)
Dim fsEncrypted As New FileStream(sOutputFilename, _
FileMode.Create, FileAccess.Write)

Dim DES As New DESCryptoServiceProvider()

'Set secret key for DES algorithm.
'A 64-bit key and an IV are required for this provider.
DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey)

'Set the initialization vector.
DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey)

'Create the DES encryptor from this instance.
Dim desencrypt As ICryptoTransform = DES.CreateEncryptor()
'Create the crypto stream that transforms the file stream by using DES encryption.
Dim cryptostream As New CryptoStream(fsEncrypted, _
desencrypt, _
CryptoStreamMode.Write)

'Read the file text to the byte array.
Dim bytearrayinput(fsInput.Length - 1) As Byte
fsInput.Read(bytearrayinput, 0, bytearrayinput.Length)
'Write out the DES encrypted file.
cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length)
cryptostream.Close()
End Sub

Sub DecryptFile(ByVal sInputFilename As String, _
ByVal sOutputFilename As String, _
ByVal sKey As String)

Dim DES As New DESCryptoServiceProvider()
'A 64-bit key and an IV are required for this provider.
'Set the secret key for the DES algorithm.
DES.Key() = ASCIIEncoding.ASCII.GetBytes(sKey)
'Set the initialization vector.
DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey)

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

Public Sub Main()
'Must be 64 bits, 8 bytes.
Dim sSecretKey As String

' Get the key for the file to encrypt.
' You can distribute this key to the user who will decrypt the file.
sSecretKey = GenerateKey()

' For additional security, pin the key.
Dim gch As GCHandle = GCHandle.Alloc(sSecretKey, GCHandleType.Pinned)


' Encrypt the file.
EncryptFile("%USERPROFILE%\MyData.txt", _
"%USERPROFILE%\Encrypted.txt", _
sSecretKey)

' Decrypt the file.
DecryptFile("%USERPROFILE%\Encrypted.txt", _
"%USERPROFILE%\Decrypted.txt", _
sSecretKey)

' Remove the key from memory.
ZeroMemory(gch.AddrOfPinnedObject(), sSecretKey.Length * 2)
gch.Free()
End Sub

End Module

zpět na horní

Odkazy

Další informace o tom, jak pomocí kryptografických funkcí .NET a o kryptografii naleznete na následujících webech společnosti Microsoft:

http://msdn.microsoft.com/net

http://code.msdn.microsoft.com/

zpět na horní
Vlastnosti

ID článku: 301070 - Poslední kontrola: 19. 1. 2017 - Revize: 1

Váš názor