Visual Studio Kriptografik Güvenlik Ad Alanı AES Şifreleme Sınıfı





Gelişmiş şifreleme standartları (AES) tüm uygulama altyapılarının kullanması gereken soyut temel sınıfı temsil etmektedir. Şifreleme algoritmalarına yönelik yapılan saldırılarda kullanılan yöntemlerin başarılı olması o algoritmanın da aynı şekilde başarılı ve dayanıklı olduğunu gösterir. AES’in ortaya çıkmasıyla birlikte temelde DES şifreleme algoritmasının gelen saldırılara karşı yetersiz, dayanıksız ve kapasitesinin düşük olması yatar. 1997’de RSA Security firması yapmış olduğu bir konferansta İngilizce bir cümle, Des ile şifrelenerek internete konuldu. Ardından kırabilecek olan ilk kişiye 10,000 dolar şeklinde ödül vereceklerini söylediler. 56 bit uzunluğundaki bu anahtar güçlü bilgisayarların bir araya gelmesi ile kırılmış oldu. Kriptografi uzmanları olan Joan Daemen ve Vincent Rijmen tarafından geliştirilmiş 128, 192, 256-bitlik anahtar uzunluğu seçeneklerine sahip olan Rijndael algoritması, Gelişmiş Şifreleme Standardı (AES) ismiyle elektronik ortamda veri güvenliğini sağlanması amacıyla veri şifreleme standardı olarak ortaya konulmuştur.

Aes şifreleme algoritması günümüzde hala güvenilir olarak kullanılan algoritmalar arasında yer almakta ve bilişim sektöründe güvenlik amaçlı kullanılmaktadır. Günümüz gelişen teknolojisinde ürün boyutlandırmalarının küçük ölçekte ve hızlı olması aranan özelliklerindendir. Bundan dolayı AES’in en az sayıda bellek kullanması ve yeterli hızda olması gerekmektedir. Kriptografik işlemcide kullanılan algoritmalar, yazılımsal ve donanımsal olarak gerçekleşe biliyorlar. Yazılımla yapılmış olan gerçekleşenler daha az maliyete ve esnekliğe sahipken donanımsal gerçekleşenler hızlı çalışır ve daha güvenilirdir.

 

System.Security.Cryptography :: Aes

 

public abstract class Aes : SymmetricAlgorithm

 

System.Security.Cryptography . SimetrikAlgorithm

Tüm simetrik algoritma uygulamalarının alması gereken soyut temel sınıfı temsil eder.

 

[ComVisibleAttribute(true)]
public abstract class SymmetricAlgorithm : IDisposable

 

SymmetricAlgorithm sınıfından türeyen sınıflar, şifreli dönüşümler (CBC) adı verilen bir zincirleme modunu kullanırlar ve bu, anahtar ( Key )  veri üzerinde kriptografik dönüşümler gerçekleştirmek için bir başlatma vektörü ( IV ) gerektirir. SymmetricAlgorithm sınıflarından biri kullanılarak şifrelenmiş verilerin şifresini çözmek için, anahtar özelliği ve IV özelliğini şifreleme için kullanılan değerlere ayarlamanız gerekir. Simetrik bir algoritmanın faydalı olması için, gizli anahtar sadece gönderici ve alıcı tarafından bilinmelidir.

private static void EncryptData(String inName, String outName, byte[] rijnKey, byte[] rijnIV)
 {    
     //Create the file streams to handle the input and output files.
     FileStream fin = new FileStream(inName, FileMode.Open, FileAccess.Read);
     FileStream fout = new FileStream(outName, FileMode.OpenOrCreate, FileAccess.Write);
     fout.SetLength(0);

     //Create variables to help with read and write.
     byte[] bin = new byte[100]; //This is intermediate storage for the encryption.
     long rdlen = 0;              //This is the total number of bytes written.
     long totlen = fin.Length;    //This is the total length of the input file.
     int len;                     //This is the number of bytes to be written at a time.

     SymmetricAlgorithm rijn = SymmetricAlgorithm.Create(); //Creates the default implementation, which is RijndaelManaged.         
     CryptoStream encStream = new CryptoStream(fout, rijn.CreateEncryptor(rijnKey, rijnIV), CryptoStreamMode.Write);

     Console.WriteLine("Encrypting...");

     //Read from the input file, then encrypt and write to the output file.
     while(rdlen < totlen)
     {
         len = fin.Read(bin, 0, 100);
         encStream.Write(bin, 0, len);
         rdlen = rdlen + len;
         Console.WriteLine("{0} bytes processed", rdlen);
     }

     encStream.Close();  
     fout.Close();
     fin.Close();                   
 }




Private Shared Sub EncryptData(inName As String, outName As String, _
   rijnKey() As Byte, rijnIV() As Byte)

       'Create the file streams to handle the input and output files.
       Dim fin As New FileStream(inName, FileMode.Open, FileAccess.Read)
       Dim fout As New FileStream(outName, FileMode.OpenOrCreate, _
          FileAccess.Write)
       fout.SetLength(0)

       'Create variables to help with read and write.
       Dim bin(100) As Byte 'This is intermediate storage for the encryption.
       Dim rdlen As Long = 0 'This is the total number of bytes written.
       Dim totlen As Long = fin.Length 'Total length of the input file.
       Dim len As Integer 'This is the number of bytes to be written at a time.
       'Creates the default implementation, which is RijndaelManaged.
       Dim rijn As SymmetricAlgorithm = SymmetricAlgorithm.Create()
       Dim encStream As New CryptoStream(fout, _
          rijn.CreateEncryptor(rijnKey, rijnIV), CryptoStreamMode.Write)

       Console.WriteLine("Encrypting...")

       'Read from the input file, then encrypt and write to the output file.
       While rdlen < totlen
           len = fin.Read(bin, 0, 100)
           encStream.Write(bin, 0, len)
           rdlen = Convert.ToInt32(rdlen + len)
           Console.WriteLine("{0} bytes processed", rdlen)
       End While

       encStream.Close()
fout.Close()
fin.Close()
   End Sub




 

void EncryptData( String^ inName, String^ outName, array<Byte>^rijnKey, array<Byte>^rijnIV )
{

   //Create the file streams to handle the input and output files.
   FileStream^ fin = gcnew FileStream( inName,FileMode::Open,FileAccess::Read );
   FileStream^ fout = gcnew FileStream( outName,FileMode::OpenOrCreate,FileAccess::Write );
   fout->SetLength( 0 );

   //Create variables to help with read and write.
   array<Byte>^bin = gcnew array<Byte>(100);
   long rdlen = 0; //This is the total number of bytes written.

   long totlen = (long)fin->Length; //This is the total length of the input file.

   int len; //This is the number of bytes to be written at a time.

   SymmetricAlgorithm^ rijn = SymmetricAlgorithm::Create(); //Creates the default implementation, which is RijndaelManaged.         

   CryptoStream^ encStream = gcnew CryptoStream( fout,rijn->CreateEncryptor( rijnKey, rijnIV ),CryptoStreamMode::Write );
   Console::WriteLine( "Encrypting..." );

   //Read from the input file, then encrypt and write to the output file.
   while ( rdlen < totlen )
   {
      len = fin->Read( bin, 0, 100 );
      encStream->Write( bin, 0, len );
      rdlen = rdlen + len;
      Console::WriteLine( "{0} bytes processed", rdlen );
   }

   encStream->Close();
   fout->Close();
   fin->Close();
}

Türetilmiş sınıfları kullanırken, güvenlik açısından, nesneyi kullanmayı bitirdikten sonra bir çöp toplama işlemini zorlamaya yeterli olmadığını unutmayın. Nesne üzerindeki Clear yöntemini, nesne serbest bırakılmadan önce herhangi bir hassas veriyi sıfırlamak için açıkça çağırmalısınız. Çöp toplamanın toplanan nesnelerin içeriğini sıfırlamadığını, ancak hafızanın yeniden tahsis edilmesi için mevcut olduğunu işaret ettiğini unutmayın. Böylelikle, bir çöp toplanmış nesne içinde bulunan veriler, ayrılmamış bellekte bellek yığında hala mevcut olabilir. Kriptografik nesneler söz konusu olduğunda, bu veriler anahtar veriler veya düz metin bloğu gibi hassas bilgiler içerebilir.

 

Özellikleri

BlockSize: Gets or sets the block size, in bits, of the cryptographic operation.(Inherited from SymmetricAlgorithm.)

FeedbackSize: Gets or sets the feedback size, in bits, of the cryptographic operation.(Inherited from SymmetricAlgorithm.)

IV: Gets or sets the initialization vector (IV) for the symmetric algorithm.(Inherited from SymmetricAlgorithm.)

Key: Gets or sets the secret key for the symmetric algorithm.(Inherited from SymmetricAlgorithm.)

KeySize: or sets the size, in bits, of the secret key used by the symmetric algorithm.(Inherited from SymmetricAlgorithm.)

LegalBlockSizes: Gets the block sizes, in bits, that are supported by the symmetric algorithm.(Inherited from SymmetricAlgorithm.)

LegalKeySizes: Gets the key sizes, in bits, that are supported by the symmetric algorithm.(Inherited from SymmetricAlgorithm.)

Mode: Gets or sets the mode for operation of the symmetric algorithm.(Inherited from SymmetricAlgorithm.)

Padding: Gets or sets the padding mode used in the symmetric algorithm.(Inherited from SymmetricAlgorithm.)

 

Yöntemler

using System;
using System.IO;
using System.Security.Cryptography;

namespace Aes_Example
{
    class AesExample
    {
        public static void Main()
        {
            try
            {

                string original = "Here is some data to encrypt!";

                // Create a new instance of the Aes
                // class.  This generates a new key and initialization 
                // vector (IV).
                using (Aes myAes = Aes.Create())
                {

                    // Encrypt the string to an array of bytes.
                    byte[] encrypted = EncryptStringToBytes_Aes(original, 
myAes.Key, myAes.IV);

                    // Decrypt the bytes to a string.
                    string roundtrip = DecryptStringFromBytes_Aes(encrypted, 
myAes.Key, myAes.IV);

                    //Display the original data and the decrypted data.
                    Console.WriteLine("Original:   {0}", original);
                    Console.WriteLine("Round Trip: {0}", roundtrip);
                }

            }
            catch (Exception e)
            {
                Console.WriteLine("Error: {0}", e.Message);
            }
        }
        static byte[] EncryptStringToBytes_Aes(string plainText, byte[] Key, 
byte[] IV)
        {
            // Check arguments.
            if (plainText == null || plainText.Length <= 0)
                throw new ArgumentNullException("plainText");
            if (Key == null || Key.Length <= 0)
                throw new ArgumentNullException("Key");
            if (IV == null || IV.Length <= 0)
                throw new ArgumentNullException("IV");
            byte[] encrypted;
            // Create an Aes object
            // with the specified key and IV.
            using (Aes aesAlg = Aes.Create())
            {
                aesAlg.Key = Key;
                aesAlg.IV = IV;

                // Create a decrytor to perform the stream transform.
                ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key
, aesAlg.IV);

                // Create the streams used for encryption.
                using (MemoryStream msEncrypt = new MemoryStream())
                {
                    using (CryptoStream csEncrypt = new
, encryptor, CryptoStreamMode.Write))
                    {
                        using (StreamWriter swEncrypt = new StreamWriter(
csEncrypt))
                        {

                            //Write all data to the stream.
                            swEncrypt.Write(plainText);
                        }
                        encrypted = msEncrypt.ToArray();
                    }
                }
            }


            // Return the encrypted bytes from the memory stream.
            return encrypted;

        }

        static string DecryptStringFromBytes_Aes(byte[] cipherText, byte
, byte
        {
            // Check arguments.
            if (cipherText == null || cipherText.Length <= 0)
                throw new ArgumentNullException("cipherText");
            if (Key == null || Key.Length <= 0)
                throw new ArgumentNullException("Key");
            if (IV == null || IV.Length <= 0)
                throw new ArgumentNullException("IV");

            // Declare the string used to hold
            // the decrypted text.
            string plaintext = null;

            // Create an Aes object
            // with the specified key and IV.
            using (Aes aesAlg = Aes.Create())
            {
                aesAlg.Key = Key;
                aesAlg.IV = IV;

                // Create a decrytor to perform the stream transform.
                ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key
, aesAlg.IV);

                // Create the streams used for decryption.
                using (MemoryStream msDecrypt = new MemoryStream(cipherText))
                {
                    using (CryptoStream csDecrypt = new CryptoStream(msDecrypt
                         (StreamReader srDecrypt = new StreamReader(
csDecrypt))
                        {

                            // Read the decrypted bytes from the decrypting 
stream
                            // and place them in a string.
                            plaintext = srDecrypt.ReadToEnd();
                        }
                    }
                }

            }

            return plaintext;

        }
    }
}








 

Imports System
Imports System.IO
Imports System.Security.Cryptography



Class AesExample

    Public Shared Sub Main()
        Try

            Dim original As String = "Here is some data to encrypt!"

            ' Create a new instance of the Aes
            ' class.  This generates a new key and initialization 
            ' vector (IV).
            Using myAes As Aes = Aes.Create()

                ' Encrypt the string to an array of bytes.
                Dim encrypted As Byte() = EncryptStringToBytes_Aes(original, myAes.Key, myAes.IV)

                ' Decrypt the bytes to a string.
                Dim roundtrip As String = DecryptStringFromBytes_Aes(encrypted, myAes.Key, myAes.IV)

                'Display the original data and the decrypted data.
                Console.WriteLine("Original:   {0}", original)
                Console.WriteLine("Round Trip: {0}", roundtrip)
            End Using
        Catch e As Exception
            Console.WriteLine("Error: {0}", e.Message)
        End Try

    End Sub 'Main

    Shared Function EncryptStringToBytes_Aes(ByVal plainText As String, ByVal Key() As Byte, ByVal IV() As Byte) As Byte()
        ' Check arguments.
        If plainText Is Nothing OrElse plainText.Length <= 0 Then
            Throw New ArgumentNullException("plainText")
        End If
        If Key Is Nothing OrElse Key.Length <= 0 Then
            Throw New ArgumentNullException("Key")
        End If
        If IV Is Nothing OrElse IV.Length <= 0 Then
            Throw New ArgumentNullException("IV")
        End If
        Dim encrypted() As Byte
        ' Create an Aes object
        ' with the specified key and IV.
        Using aesAlg As Aes = Aes.Create()

            aesAlg.Key = Key
            aesAlg.IV = IV

            ' Create a decrytor to perform the stream transform.
            Dim encryptor As ICryptoTransform = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV)
            ' Create the streams used for encryption.
            Using msEncrypt As New MemoryStream()
                Using csEncrypt As New CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)
                    Using swEncrypt As New StreamWriter(csEncrypt)

                        'Write all data to the stream.
                        swEncrypt.Write(plainText)
                    End Using
                    encrypted = msEncrypt.ToArray()
                End Using
            End Using
        End Using

        ' Return the encrypted bytes from the memory stream.
        Return encrypted

    End Function 'EncryptStringToBytes_Aes

    Shared Function DecryptStringFromBytes_Aes(ByVal cipherText() As Byte, ByVal Key() As Byte, ByVal IV() As Byte) As String
        ' Check arguments.
        If cipherText Is Nothing OrElse cipherText.Length <= 0 Then
            Throw New ArgumentNullException("cipherText")
        End If
        If Key Is Nothing OrElse Key.Length <= 0 Then
            Throw New ArgumentNullException("Key")
        End If
        If IV Is Nothing OrElse IV.Length <= 0 Then
            Throw New ArgumentNullException("IV")
        End If
        ' Declare the string used to hold
        ' the decrypted text.
        Dim plaintext As String = Nothing

        ' Create an Aes object
        ' with the specified key and IV.
        Using aesAlg As Aes = Aes.Create()
            aesAlg.Key = Key
            aesAlg.IV = IV

            ' Create a decrytor to perform the stream transform.
            Dim decryptor As ICryptoTransform = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV)

            ' Create the streams used for decryption.
            Using msDecrypt As New MemoryStream(cipherText)

                Using csDecrypt As New CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)

                    Using srDecrypt As New StreamReader(csDecrypt)


                        ' Read the decrypted bytes from the decrypting stream
                        ' and place them in a string.
                        plaintext = srDecrypt.ReadToEnd()
                    End Using
                End Using
            End Using
        End Using

        Return plaintext

    End Function 'DecryptStringFromBytes_Aes 
End Class 'AesExample

 

.NET Framework
3.5+
Silverlight
2.0+
Windows Phone Silverlight
7.0+

KAYNAK

  1. http://cryptographicprocessor.weebly.com
  2. https://msdn.microsoft.com

About the author: Abdurrahman Kasım TÖK

#Bisiklet #Teknoloji #Yazılım #Researcher #Insider #Mkutup #UTM

You must be logged in to post a comment.