Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A visszafejtés a titkosítás fordított művelete. Titkos kulcs titkosításához ismernie kell az adatok titkosításához használt kulcsot és IV-et is. A nyilvános kulcsos titkosításhoz ismernie kell a nyilvános kulcsot (ha az adatokat titkos kulcs használatával titkosították) vagy a titkos kulcsot (ha az adatokat a nyilvános kulccsal titkosították).
Szimmetrikus visszafejtés
A szimmetrikus algoritmusokkal titkosított adatok visszafejtése hasonló az adatok szimmetrikus algoritmusokkal történő titkosításához használt folyamathoz. Az CryptoStream osztályt a .NET által biztosított szimmetrikus titkosítási osztályok használják a felügyelt streamobjektumokból beolvasott adatok visszafejtéséhez.
Az alábbi példa bemutatja, hogyan hozható létre az algoritmus alapértelmezett implementációs osztályának új példánya Aes . A példány egy objektum visszafejtésére CryptoStream szolgál. Ez a példa először létrehozza a implementálási osztály új példányát Aes . Beolvassa az inicializálási vektor (IV) értékét egy felügyelt streamváltozóból. fileStream
Ezután létrehoz egy CryptoStream objektumot, és inicializálja azt a fileStream
példány értékére. A SymmetricAlgorithm.CreateDecryptor példány metódusa Aes a IV értéket és a titkosításhoz használt kulcsot adja át.
Dim aes As Aes = Aes.Create()
Dim cryptStream As New CryptoStream(
fileStream, aes.CreateDecryptor(key, iv), CryptoStreamMode.Read)
Aes aes = Aes.Create();
CryptoStream cryptStream = new CryptoStream(
fileStream, aes.CreateDecryptor(key, iv), CryptoStreamMode.Read);
Az alábbi példa egy stream létrehozásának, a stream visszafejtésének, a streamből való olvasásnak és a streamek bezárásának teljes folyamatát mutatja be. Létrejön egy fájlstream objektum, amely beolvassa a TestData.txt nevű fájlt. A fájlstream ezután visszafejthető a CryptoStream és az Aes osztály használatával. Ez a példa az adatok titkosítására szolgáló szimmetrikus titkosítási példában használt kulcsértéket határozza meg. Nem jeleníti meg az értékek titkosításához és átviteléhez szükséges kódot.
using System.Security.Cryptography;
try
{
using (FileStream fileStream = new("TestData.txt", FileMode.Open))
{
using (Aes aes = Aes.Create())
{
byte[] iv = new byte[aes.IV.Length];
int numBytesToRead = aes.IV.Length;
int numBytesRead = 0;
while (numBytesToRead > 0)
{
int n = fileStream.Read(iv, numBytesRead, numBytesToRead);
if (n == 0) break;
numBytesRead += n;
numBytesToRead -= n;
}
byte[] key =
{
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16
};
using (CryptoStream cryptoStream = new(
fileStream,
aes.CreateDecryptor(key, iv),
CryptoStreamMode.Read))
{
// By default, the StreamReader uses UTF-8 encoding.
// To change the text encoding, pass the desired encoding as the second parameter.
// For example, new StreamReader(cryptoStream, Encoding.Unicode).
using (StreamReader decryptReader = new(cryptoStream))
{
string decryptedMessage = await decryptReader.ReadToEndAsync();
Console.WriteLine($"The decrypted original message: {decryptedMessage}");
}
}
}
}
}
catch (Exception ex)
{
Console.WriteLine($"The decryption failed. {ex}");
}
Imports System
Imports System.IO
Imports System.Security.Cryptography
Module Module1
Sub Main()
' Decryption key must be the same value that was used
' to encrypt the stream.
Dim key As Byte() = {&H1, &H2, &H3, &H4, &H5, &H6, &H7, &H8, &H9, &H10, &H11, &H12, &H13, &H14, &H15, &H16}
Try
' Create a file stream.
Using fileStream As New FileStream("TestData.txt", FileMode.Open)
' Create a new instance of the default Aes implementation class
Using aes As Aes = Aes.Create()
' Reads IV value from beginning of the file.
Dim iv As Byte() = New Byte(aes.IV.Length - 1) {}
Dim numBytesToRead As Integer = CType(aes.IV.Length, Integer)
Dim numBytesRead As Integer = 0
While (numBytesToRead > 0)
Dim n As Integer = fileStream.Read(iv, numBytesRead, numBytesToRead)
If n = 0 Then
Exit While
End If
numBytesRead += n
numBytesToRead -= n
End While
Using cryptoStream As New CryptoStream(fileStream, aes.CreateDecryptor(key, iv), CryptoStreamMode.Read)
' By default, the StreamReader uses UTF-8 encoding.
' To change the text encoding, pass the desired encoding as the second parameter.
' For example, New StreamReader(cryptoStream, Encoding.Unicode).
Using decryptReader As New StreamReader(cryptoStream)
' Display the message.
Console.WriteLine($"The decrypted original message: {decryptReader.ReadToEnd()}")
End Using
End Using
End Using
End Using
Catch
Console.WriteLine("The decryption Failed.")
Throw
End Try
End Sub
End Module
Az előző példa ugyanazt a kulcsot és az adatok titkosítására szolgáló szimmetrikus titkosítási példában használt algoritmust használja. Visszafejti a példában létrehozott TestData.txt fájlt, és megjeleníti az eredeti szöveget a konzolon.
Aszimmetrikus visszafejtés
Egy fél (A fél) általában nyilvános és privát kulcsot is létrehoz, és a kulcsot a memóriában vagy egy titkosítási kulcstárolóban tárolja. Az A fél ezután elküldi a nyilvános kulcsot egy másik félnek (B fél). A nyilvános kulcs használatával a B fél titkosítja az adatokat, és visszaküldi az adatokat az A félnek. Az adatok fogadása után az A fél visszafejti azokat a megfelelő titkos kulccsal. A visszafejtés csak akkor lesz sikeres, ha az A fél az adatok titkosításához használt B nyilvános kulcsnak megfelelő titkos kulcsot használja.
Az aszimmetrikus kulcs biztonságos titkosítási kulcstárolóban való tárolásával és az aszimmetrikus kulcs későbbi lekérésével kapcsolatos információkért tekintse meg az aszimmetrikus kulcsok kulcstárolóban való tárolását ismertető témakört.
Az alábbi példa két bájttömb visszafejtést mutat be, amelyek szimmetrikus kulcsot és IV-et jelölnek. Az aszimmetrikus nyilvános kulcsnak az RSA objektumból egy harmadik félnek könnyen elküldhető formátumban történő kinyerésével kapcsolatos információkért lásd az Adatok titkosítása című témakört.
'Create a new instance of the RSA class.
Dim rsa As RSA = RSA.Create()
' Export the public key information and send it to a third party.
' Wait for the third party to encrypt some data and send it back.
'Decrypt the symmetric key and IV.
symmetricKey = rsa.Decrypt(encryptedSymmetricKey, RSAEncryptionPadding.Pkcs1)
symmetricIV = rsa.Decrypt(encryptedSymmetricIV, RSAEncryptionPadding.Pkcs1)
//Create a new instance of the RSA class.
RSA rsa = RSA.Create();
// Export the public key information and send it to a third party.
// Wait for the third party to encrypt some data and send it back.
//Decrypt the symmetric key and IV.
symmetricKey = rsa.Decrypt(encryptedSymmetricKey, RSAEncryptionPadding.Pkcs1);
symmetricIV = rsa.Decrypt(encryptedSymmetricIV , RSAEncryptionPadding.Pkcs1);