.NET Frameworkun Kriptografi Alanadları ile Veri Güvenliği

.NET Frameworkun Kriptografi Alanadları ile Veri Güvenliği

Artan kullanıcı sayısıyla birlikte güvenliğin önemi her geçen gün artıyor. Günlük işlerde güvenlikle ilgili konuların (ve tabi problemlerin) oldukça yoğunlaştığı bu günlerde güvenlik ile ilgili makaleler yazmak şart oldu sanırım. Buradan günlük hayatımızda yaşadıklarımızın yazdığımız makalelere yansıdığı sonucuna varabiliriz sanırım. Gerçi ne derece sağlıklı bir tesbit olduğu tartışılır bunun tabi. Yani hiçbir problemle karşılaşmadığımız bir gün makale yazmaya kalkarsak yemek tarifi yazabileceğimiz sonucuna da varabiliriz buradan.. Sanırım konuyu fazla dağıtmadan asıl konuya geçsem iyi olacak :)

Verilerin şifrelenmesi için sıklıkla kullanılan metotlardan biri Windowsun Crypto APIsi. .NET Framework, her alanda olduğu gibi güvenlik alanında da son derece geniş çözümler sağlıyor. Bu makalede verilerin güvenliğini sağlamak için en sık kullanılan yöntemlerden biri olan şifreleme konusunda .NET Frameworkun System.Security.Cryptography alan adının sunduğu özellikleri ele alıyor olacağız. Veri şifrelemenin .NET ile .NET öncesine göre nasıl daha güvenli ve daha kolay hale geldiğini tartışıp, kısa kodlar ile veri şifrelemenin .NETte daha kolay ve daha güvenli olduğu yönündeki tezimizi savunacağız.

İnternete dahil kullanıcı sayısının her geçen gün artması ve e-commerce platformlarının hızlı büyüyüşü, verilerin güvenliğini sağlamak için daha güçlü, daha güvenilir algoritmalara olan ihtiyacı arttırdı. Microsoft 1996 yılında Cryptography API (Crypto API) ile veri güvenliği alanındaki ilk adımını attı. Yapılan çalışmalar sonucunda Crypto API ile çıktığımız yolda bugün bulunduğumuz nokta, Common Language Runtime tarafından sunulan System.Security.Cryptography alanadı.

Bu alanadı size çeşitli şifreleme servislerine programatik olarak erişebilme, verileri şifreleyerek ve şifre çözerek verilerinizin güvenliğini sağlama ve dijital imza ve sertifikaları yönetebilme imkanı vermektedir. Bu algoritmaların bazıları herhangi bir .NET uygulamasında (örneğin ASP.NET ile authentication işleminde) kullanılmıştır. Bu yazıda .NET Framework tarafından sunulan temel şifreleme servislerini ele alarak uygulamalarımızda bu sınıfları nasıl kullanabileceğimizi inceliyor olacağız.

Cryptography AlanadıEn üst katmanda Cryptography alanadı dört ana bölümde ele alınabilir. Cryptography alanadının birinci fonksiyonu şifreleme ve hash oluşturma gibi işlemleri sağlayacak sınıfları sağlamaktır. Bu algoritmalar iki kalıtım seviyesinden oluşan genişletilebilir bir örnek kullanılarak oluşturulmuştur. AsymmetricAlgorithm veya hashAlgorithm gibi soyut tabanlı sınıflar hiyerarşinin en üstünde yer alır ve algoritmanın türünü belirtirler. İkinci katmandaki soyut sınıf ise algoritmanın genel interfaceini sağlamak için birinci katmandaki sınıftan türetilmiştir. Örneğin; SHA1 sınıfı HashAlgorithm sınıfından türetilmiştir ve SHA1 algoritmasına özgü metotlar ve özellikler içerir. Son olarak algoritmanın implementasyonu ikinci seviyedeki sınıftan türetilmiştir. Bu somut seviyede implementasyonlar managed, unmanaged veya hem managed hem unmanaged olabilirler.

Unmanaged implementasyonlar, implementasyonun işletim sistemi seviyesinde yüklenmiş olan Cryptographic Service provider tarafından sağlandığını belirtmek amacıyla tipik olarak "CryptoServiceProvider" sonekini alırlar. Örneğin; SHA1CryptoServiceProvider. Managed implementasyonlar "managed" sonekini alırlar ve temelde CryptoAPIye dayanmadıkları için managed koda implemente edilirler. örneğin; SHA1Managed.

Bu algoritmalar hakkında hatırlamamız gereken bir diğer konu ise bu somut sınıfların örneklendiklerinde varsayılan constructorların her zaman algoritmanın varsayılan parametrelerini makul ve güvenli değerlerle populate edecekleridir. Örneğin; Simetrik algoritmalar, hem rastgele anahtar üretip hem de initialization vector (IV) üretirken ve Mode ve padding gibi özellikleri otomatik olarak belirlerken genel anahtar mantığıyla çalışan simetrik algoritmalar rastgele bir anahtar çifti üretecektir.

System.Security.Cryptography alanadındaki ikinci ana bölüm, verilerin şifrelenirken ve şifrelenmiş verilerin çözülmesi esnasında kullanılan sınıfları  ve bazı yardımcı sınıfları içerir. Bu alanadı aynı zamanda soyut RNGCryptoServiceproviderın türetildiği RandomNumberGenerator sınıfını içerir.

Şifreleme algoritmalarına ek olarak Cryptography alanadı aynı zamanda X509Certificate child alanadını içerir. Bu child alanadı X.509 v3 sertifikalarının yönetimi ve temsili ile ilgili sadece üç sınıf içerir. X509Certificate sınıfı bir sertifika örneği oluşturmak amacıyla CreateFrınCertFile ve CreateFromSignedFile statik metotlarını sunar:

Dim c As X509Certificatec = X509Certificate.CreateFromCertFile("yazgelistir.cer")Console.WriteLine(c.GetName)Console.WriteLine(c.GetPublicKeyString)Console.WriteLine(c.GetSerialNumberString)Console.WriteLine(c.GetExpirationDateString)

Sertifikalar, pek çok amaçla kullanılabilir. Örneğin; System.Net.HttpWebRequest nesnesinin ClientCertificates özelliği kullanılarak web servera giden talebe eklenmek yoluyla kimlik doğru amaçlı olarak kullanılabilir.Cryptography alanadı aynı zamanda .NET Frameworkun güvenlik sistemi tarafından XML nesnelerini dijital olarak imzalanmasında kullanılan bir child XML alanadı içerir. Bu framework XML imza sözdizimi ve işlenmesine dair W3C örnek spesifikasyonuna (http://www.w3.org/TR/2000/WD-xmldsig-core-20000228/) dayanmaktadır. Spesifikasyon imzayı içeren XML dokumanındaki dahili veya harici herhangi bir içeriğe uygulanabilecek dijital imzaların oluşturulmasına dair sözdizimi ve işlem kurallarını içerir. Spesifikasyon henüz XMLin şifrelenmesini içermesede, güvenliği, mesaj doğrulamasını ve XML dosyaları içim imza sahibi doğrulama servislerini (signer authentication services) sunması açısından oldukça önemlidir.

Makalenin ilerleyen bölümlerinde şifreleme algoritmalarının kullanımı konusuna yoğunlaşacağız.

Şifreleme AlgoritmalarıÖrnek 1de belirtildiği üzere Cryptography alanadında bulunan şifreleme algoritma türlerinden biri simetrik kriptografi algoritmalarıdır. Simetrik algoritmalar şifreleme ve şifre çözme işlemleri için tek bir gizli anahtara sahiplerdir. Yani hem şifrelemeyi yapan, hem şifreyi çözecek tarafın şifrelemenin güvenliği açısından anahtarı gizli tutması gerekecektir. Ek olarak simetrik algoritmalar CBC modunda algoritmayı başlatabilmek (initialize) için IVe (initialization vector), gizli olmayan bir ikili değere gereksinim duyarlar. SymmetricAlgorithm sınıfı diğer algoritma-spesifik sınıfların türetildiği somut bir temel sınıftır.

Örnek 1 Cryptographynin Bileşenleri

Bölüm  Açıklama  Şifreleme Algoritmaları hem simetrik hem asimetrik şifreleme ve hash algoritmalarını içeren bir dizi sınıftır Yardımcı Sınıflar  Rastgele sayılar üretmek, Crypto API ile etkileşim sağlamak, stream tabanlı bir model aracılığıyla şifreleme işlemleri gerçekleştiren sınıflar X.509 Sertifikaları  System.Security.Cryptography.X509Certificates alanadı içinde tanımlanmış dijital sertifika işlemleri ile ilgili sınıflardır. XML Dijital İmzaları  System.Cryptography.Xml alanadında tanımlanmış XML dokumanlarında dijital imza kullanımına ilişkin sınıflardır. 

 

Desteklenen simetrik şifreleme algoritmaları; Data Encryption Standart (DES), RC2, Rijandael ve Triple Data Encryption Standart (TripleDES) tır. Her algoritma SymmetricAlgorithmden türemiş bir soyut temel sınıf içerir. Bu algoritmalar aynı zamanda temel sınıftan (örneğin: DESCryptoServiceProvider) türemiş olan bir servis sağlayıcı sınıf veya managed sınıf içerir. Bu sınıf verinin şifrelenmesi ve şifrenin çözülmesi için gerekli metotları içerir. Simetrik algoritmalardaki hiyerarşi Şekil 1de görülebilir.

Şekil 1: Simetrik Algoritmalar

Şekil 2de gösterilen RijandaelManaged gibi somut sınıflar örneklenebilir (instantiate) ve özellikleri (örnek 2) çağırılabilir. Örnek 2de otomatik olarak bir anahtar değeri ve byte dizisi olarak IV üreten ve daha sonra String değerlere serialize ederen ve konsola yazan algoritmanın yeni bir örneği oluşturuluyor. KeySize ve BlockSizeın anahtarın uzunluğunun ve bir işlemde ne kadar verinin (bit türünden) şifrelenebileceğinin veya şifresinin çözülebileceğini belirlenmesinde kullanılabileceğini atlamamalıyız.

İkinci tür ise public-key veya asimetrik algoritma olarak tanıtıdığımız türdür ve AsymmetricAlgorithm soyut sınıfından türemektedir. Bu tür Digital Signature Algorithm (DSA) ve RSA gibi tanınmış algoritmaları içerir. Asimetrik algoritmalar bir anahtar çiftine, bir özel ve bir genel anahtara dayanır. Genellikle, genel anahtar herkesin kullanımına açıktır ve şifrelemeyi yapan tarafından üretilir ve verinin şifrelenmesinde kullanılır, özel anahtar ise gizlidir ve genel anahtar ile şifrelenmiş verinin şifresinin çözülmesinde kullanılır.

Bu algoritmalar şekil 2de görüldüğü üzere AsymmetricAlgorithm sınıfından türemiş olan DSA ve RSA soyut sınıflarından türemiştir.

Şekil 2: Asimetrik Algoritmalar

Asimetrik algoritmaların varsayılan constructorlarının bir anahtar çifti oluşturmasına izin vermek yerine CSP tarafından saklanmış mevcut anahtar çiftinide kullanabilirsiniz. Bunu, asimetrik algoritmaları Crypto API key storageda mevcut olan bir key container adı ile örnekleyip, key container adını ve bu örneğin asimetrik algoritmanın constructorı olmasını sağlayarak ScpParameters nesnesi aracılığıyla populate ederek yapabilirsiniz. Asimetrik anahtar çiftlerinin saklanması ve yeniden kullanılması ile ilgili bir örneği http://www.gotdotnet.com/team/clr/about_security.aspx  adresinde bulabilirsiniz.

RijndaelManagedin Kullanımı Dim oEnc As New RijndaelManaged()Dim i As ShortDim strKey, strIV As StringFor i = 1 To (oEnc.KeySize / 8)  strKey &= oEnc.Key(i - 1).ToString & " "NextFor i = 1 To 16  strIV &= oEnc.IV(i - 1).ToString & " "NextConsole.WriteLine(strKey)Console.WriteLine(strIV)Console.WriteLine(oEnc.KeySize.ToString)Console.WriteLine(oEnc.BlockSize.ToString)

Cryptography alanadı tarafından sunulan son tür ise hash algoritmalarıdır. Bunlar, daha uzun bytelardan oluşan dizilere dayanan binary değerlerden oluşan sabit boyutlu bir unique diziyi (digest) hesaplarlar. Hash algoritmalarını veri üzerinde bir oynama, değişiklik yapılıp yapılmadığını anlamak amacıyla kullanırız. Digestı veri ile gönderdiğinizde, veriyi alan taraf yeniden hesaplama yapabilir. Örneğin dosyanın son değiştirilme tarihi değişmişse, hash algoritmasının çıktısı, orijinal çıktı ile farklılık gösterecektir. Hash algoritmaları genellikle dijital imza işlemlerinin temelinde kullanılmaktadır.

Cryptography alanadı HashAlgorithm adlı bir temel sınıf ve algoritmaları (MD5, SHA1, SHA256, SHA384 ve SHA512) destekleyen türemiş sınıflar içerir. SHA1 algoritması 160-bitlik bir hash gerçekleştirirken MD5 algoritması 128-bitlik bir hash gerçekleştirir. SHAnın diğer versiyonlarındaki sayılar, algoritmaların gerçekleştirdikleri hashin boyutunu temsil etmektedir. Daha büyük hash boyutu daha güvenli ve brute force ile daha zor kırılabilen bir algoritma anlamına gelmektedir.  Bu algoritmalar Şekil 3te görüldüğü üzere hem managed hem unmanaged olarak gelmektedir.

Şekil 3: Hash Algoritmaları

Bir digest hesaplamak için yapmanız gereken aşağıdaki örnekte olduğu gibi; hash algoritmasını örneklemeniz ve HashAlgorithmden türetilen overloaded ComputeHash metodunu çağırmaktır.

Dim fsData As New FileStream("yazgelistir.txt", _FileMode.Open, FileAccess.Read)Dim digest() As ByteDim oSHA As New SHA512Managed()digest = oSHA.ComputeHash(fsData)fsKey.Close()

Burada ComputeHash metodu bir Stream nesnesi gönderiyor ancak aynı zamanda bir byte dizisini arguman olarak kabul edebiliyor.

Cryptography alanadı aynı zamanda yukarıdaki şekilde görülebileceği üzere KeyedHashAlgorithm adlı bir soyut sınıf içermektedir.  HMACSHA1 ve MACTripleDES sınıflarındaki algoritmalar mesaj Doğrulama Kodu (MAC - Message Authentication Code) oluşturabilmek amacıyla KeyedhashAlgoritmasından türemişlerdir. Bir MAC, veriyi gönderen ve alan tarafın gizli anahtarı paylaşmaları durumunda, verinin gönderildiği kanalın değişiklik yapılmış güvenli olmayan bir kanal olup olmadığının tesbitinde kullanılabilir.

Soyut temel sınıf olan SymmetricAlgorithm, AsymmetricAlgorithm, HashAlgorithm ve KeyedHashAlgorithm bir istemci tarafından doğrudan örneklenemiyorlarsada, hepsi Create adlı bir overloaded static (shared) metot sunarlar. Bu metot herhangi bir parametre olmaksızın doğrudan çağrılarak bu algoritmalardan biri örneklenebilir. Bu işlemde varsayılan algoritmalar, simetrik için RijandaelManaged, asimetrik için RSACryptoServiceProvider, hash için SHA1CryptoServiceProvider ve keyed hash içinse HMACSHA1 dir. İkinci versiyon ise implementasyonu belirten bir string kabul eder. Diğer bir durumda nesne CryptoConfig sınıfının CreateFromName metoduna bir tanımlayıcı string gönderilerek oluşturulur. Create metodu çağrıldığında bu tanımlayıcı stringler yerine varsayılan değerler kullanılır. Örneğin; bir parametre göndermeden Create metodunu çağırdığımızda metot SHA1CryptoServiceprovider sınıfına varsayılan string olarak "System.Security.Cryptography.HashAlgorithm" ifadesini gönderecektir. "SHA1" ifadesi aktarıldığında ise metot yine aynı sınıfa yönlenecektir.

İsterseniz şimdi bu anlattıklarımızı kısa bir örnekle görelim. Aşağıdaki koddaki her ifade işlev olarak diğerinin aynısıdır ve RijndaelManaged sınıfını örnekler.

Dim r, r1, r2, r3 As RijndaelManagedr3 = CType(CryptoConfig.CreateFromName("Rijndael"), "_RijndaelManaged)r2 = CType(SymmetricAlgorithm.Create, RijndaelManaged)r1 = CType(Rijndael.Create, RijndaelManaged)r = New RijndaelManaged()

Bu biraz kafa karıştırıcı gibi görünebilir ancak sınıflar bu şekilde tasarlanmıştır böylece hangi algoritmanın kullanılacağı kararı runtimea veya konfigurasyon ile belirlenenmek üzere sonraya bırakılabilir. Gerçekte systemwide konfigurasyon dosyasının (machine.config) CryptoMapping alanı kullanılarak varsayılan seçimler değiştirilebilir. Örneğin aşağıdaki örnek koddaki XML ifadesi machine.config dosyasının configuration alanına eklenerek varsayılan hash algoritması olarak MD5CryptoServiceProviderın kullanılmasını ve işaretçi olarak "yazgelistir" ifadesini tanımlayabiliriz.

Cryptographynin konfigurasyonu                         "System.Security.Cryptography.MD5CryptoServiceProvider,        mscorlib, Ver=1.0.2411.0, Culture=neutral,         PublicKeyToken=b77a5c561934e089"/>                             class="myMD5"/>      

Kendi işaretçilerimizi oluşturmak?.. (Burada işaretçiden kastımızın hangi algoritmanın kullanılacağını tanımlayan ifadeler olduğunu söylememize gerek yok değil mi? varsa da söylemiş oldum zaten (: ) Bir cryptoClasses içine refere edilebilecek ve sınıf ve assemblyı tamamen açıklayıcı bir cryptoClass elemanı ekleyebilirsiniz. nameEntry elemanları ileride işaretçi oluşturmak için kullanılacaktır. Örnek kod şu şekilde olacaktır:

Dim m, m1 As MD5CryptoServiceProviderm = CType(HashAlgorithm.Create, MD5CryptoServiceProvider)m1 = CType(CryptoConfig.CreateFromName("dan"), "_MD5CryptoServiceProvider)Her iki örnektede nesneler MD5CryptoServiceProvider türünde oluşturulmuştur.

Kriptografi Servislerinin Kullanımı.NET Frameworkun tamamını Stream tabanlı bir programlama modeli kaplamıştır. Stream sınıfları System.IO.Stram alanadından türemiş ve metin, xml, msmq mesajları, bellek ve network gibi kaynaklardaki verilerin kullanımı ve  bu kaynaklardaki verilerin bir diğer kaynağa aktarımı amacıyla kullanılırlar. Cryptography alanadının bu konsepti kapsaması ve bahsettiğimiz verilerin önceden ele aldığımız algoritmalar ile şifrelenmesi ve şiflerli verilerin çözülmesini sağlaması elbetteki sürpriz olmayacaktır. Bu fonksiyonelliğin kalbi System.IO.Stream alanadından türeyen ve kriptografik iletişimde stram tabanlı bir model olarak işlev gören CryptoStream sınıfıdır.

Bu alanadının fonksiyonunu basit bir örnekle inceliyor olacağız. Aşağıdaki kodda TextFileInfo sınıfı görülmektedir. Bu sınıf bir dosyanın sınıf tarafından oluşturulmuş bir anahtar aracılığıyla DES algoritması kullanılarak simetrik olarak şifrelenmesini ve bir dosyaya kaydedilmesini sağlayacaktır.

DES Algoritmasının kullanımı ile temel şifreleme işlemleriOption Strict OnImports System.Security.CryptographyImports System.IOImports System.ThreadingPublic Class TextFileCrypto  Private mstrFile As String decrypt edilecek dosya  Private mstrKey As String anahtar dosyası  Private mKey(7) As Byte  DES anahtarı  Private mDES As DESCryptoServiceProvider  Private mIV(7) As Byte Initialization Vector  Public Sub New()    mDES = New DESCryptoServiceProvider()  End Sub  Public Property KeyFile() As String    Get      Return mstrKey    End Get    Set(ByVal Value As String)      If File.Exists(Value) Then        mstrKey = Value        OpenKeyFile() anahtar dosyasını aç ve içeriğini oku      Else        Throw New FileNotFoundException(Value & " dosya bulunamadı.")      End If    End Set  End Property  Public Property FileName() As String    Get      Return mstrFile    End Get    Set(ByVal Value As String)      If File.Exists(Value) Then        mstrFile = Value      Else        Throw New FileNotFoundException(Value & " dosya bulunamadı.")      End If    End Set  End Property  Private Sub OpenKeyFile()    Dim fsKey As New FileStream(mstrKey, _      FileMode.Open, FileAccess.Read)    anahtar dosyasını aç ve anahtarı oku    fsKey.Read(mKey, 0, 8)    fsKey.Read(mIV, 0, 8)    fsKey.Close()    mDES.Key = mKey    mDES.IV = mIV  End Sub  Public Function SaveKeyFile(ByVal FilePath As String) As Boolean    Dim fsKey As New FileStream(FilePath, _      FileMode.OpenOrCreate, FileAccess.Write)    Yeni bir random anahtar ve IV üret ve dosyaya kaydet    Bu değerleri bizim üretmememiz durumunda bu değerler    otomatik olarak üretilecektir.    mDES.GenerateKey()    mDES.GenerateIV()    mKey = mDES.Key    mIV = mDES.IV    fsKey.Write(mKey, 0, mKey.Length)    fsKey.Write(mIV, 0, mKey.Length)    fsKey.Close()    mstrKey = FilePath  End Function  Public Function EncryptFile() As Boolean    verilen dosyayı şifrele    anahtarı kontrol et    If mKey Is Nothing Then      Throw New Exception("Önce bir anahtarınız olmalı.")      Return False    End If    Dim fsInput As New FileStream(mstrFile, _      FileMode.Open, FileAccess.Read)    Dim fsOutput As New FileStream("temp.dat", _      FileMode.Create, FileAccess.Write)    fsOutput.SetLength(0)    Dim arInput() As Byte    Dim desEncrypt As ICryptoTransform = mDES.CreateEncryptor()    Dim sCrypto As New CryptoStream(fsOutput, desEncrypt, _      CryptoStreamMode.Write)    ReDim arInput(Convert.ToInt32(fsInput.Length - 1))    fsInput.Read(arInput, 0, Convert.ToInt32(fsInput.Length))    fsInput.Close()    DES ile şifrelenen dosyayı kaydet    sCrypto.Write(arInput, 0, arInput.Length)    sCrypto.Close()    Sil ve yeniden adlandır    File.Copy("temp.dat", mstrFile, True)    File.Delete("temp.dat")  End Function  Public Function DecryptFile() As Boolean    Belirtilen dosyanın şifresini çöz    Anahtarı kontrol et    If mKey Is Nothing Then      Throw New Exception("Önce bir anahtarınız olmalı.")      Return False    End If    Şifreli dosyayı okumak üzere bir file stream oluştur    Dim fsRead As New FileStream(mstrFile, FileMode.Open, _      FileAccess.Read)    Dim fsOutput As New FileStream("temp.dat", _      FileMode.Create, FileAccess.Write)    Dim desDecrypt As ICryptoTransform = mDES.CreateDecryptor()    Dim sCrypto As New CryptoStream(fsRead, desDecrypt, _      CryptoStreamMode.Read)    Dim swWriter As New StreamWriter(fsOutput)    Dim srReader As New StreamReader(sCrypto)    Şifresi çözülen dosyayı kaydet    swWriter.Write(srReader.ReadToEnd)    swWriter.Close()    fsOutput.Close()    fsRead.Close()    Sil ve yeniden adlandır    WaitForExclusiveAccess(mstrFile)    File.Copy("temp.dat", mstrFile, True)    File.Delete("temp.dat")  End Function  Private Sub WaitForExclusiveAccess(ByVal fullPath As String)    While (True)      Try        Dim file As FileStream        file = New FileStream(fullPath, FileMode.Append, _          FileAccess.Write, FileShare.None)        file.Close()        Exit Sub      Catch e As Exception        Thread.Sleep(100)      End Try    End While  End SubEnd Class

Gördüğünüz gibi class constructor, CreateEncryptor ve CreateDecryptor metotlarını sağlayan bir class-level DESCryptoServiceprovider sınıfı örnekledi. Bu metotlar ileride şifreleme ve şifre çözme işlemlerini gerçekleştiren nesnelerin dönmesinde kullanılacaktır.  Public keyFile ve FileName özellikleri anahtar ve IV içeren bir dosyayı açmak ve şifrelenecek veya şifresi çözülecek dosyanın tanımlanmasında kullanılmaktadır. Eğer anahtar dosyası mevcutsa dosya private openKeyFile metodu ile açılır ve anahtar ve IV okunur.  SavekeyFile metodu ise arkaplandaki DES sınıfının GenerateKey ve generateIV metotlarını çağırarak bir rastgele anahtar ve IV oluşturur. Bu değerler daha sonra parametre olarak verilen dosyaya kaydedilir. Bu noktada anahtar dosyası gizli tutulmalıdır.

DES algoritmasının 56-bitlik (7-byte) bir anahtar kullandığını unutmamak gerekir. DES sadece tek boyutlu anahtar boyutu desteklemektedir. Diğer algoritmaların destekledikleri geçerli anahtar boyutları MinSize, MaxSize, SkipSize değerlerini dönen LegalKeySizes özelliği kullanılarak öğrenilebilir. Örneğin Rijndael algoritması 128, 192 ve 256 bitlik anahtarları desteklemektedir. Daha güçlü bir şifreleme için yeni anahtar boyutu, KeySize özelliği ile değiştirilebilir.

EncryptFile ve DecryptFile metotları textFileCrypto sınıfının çekirdeğidir. EncryptFile metodu açılan dosyayı şifreler ve şifrelenen veriyi geçici bir dosyada saklar.  Daha sonra servis sağlayıcının (bu örnekte DESCryptoServiceProvider) CreateEncryptor metodu ile bir encryptor nesnesi oluşturur. Bu nesneICryptoTransform arabirimini sağlar böylelikle filestram tarafından (bu örnekte fsoutput) bir dosyaya yazılan veri CryptoStreamin constructorına aktarılabilir. Geçici dosya orijinal dosyanın üzerine yazılır. Sonuç, ftp veya email ile güvenli bir şekilde gönderilebileceğimiz şifrelenmiş bir dosya..

DecryptFile metodu ise CreateDecryptor metodu ile bir decryptor oluşturarak EncryptFile metodunun tam tersi işlev yapar. Sonuç olarak  şifresi çözülen veri StreamWriter aracılığıyla StreamReader sınıfının ReadToEnd metodu kullanılarak bir metin dosyasına kaydedilir.

Bir istemci textFileCrypto sınıfını veri şifrelemek amacıyla aşağıdaki örnekte olduğu gibi dört satırlık kısa bir kod ile kullanabilir:

Dim objCrypt As New TextFileCrypto()objCrypt.FileName = "ogrenciler.txt"anahtarı oluştur ve kaydetobjCrypt.SaveKeyFile("yazgelistir.dat")dosyayı şifreleobjCrypt.EncryptFile()

İstemci şfirelenmiş dosyanın şifresini aşağıdaki şekilde çözebilir;

Dim objCrypt As New TextFileCrypto()objCrypt.FileName = "ogrenciler.txt"anahtarı okuobjCrypt.KeyFile = "yazgelistir.dat"Şifreyi ÇözobjCrypt.DecryptFile()

Döküman Arama

Başlık :

Kapat