Microsoft .NET ile Dijital İmza Oluşturma

Microsoft .NET ile Dijital İmza Oluşturma Şifrelenmiş metin üzerinde yapılacak en önemli işlemlerden biri de nereden geldiğinin doğrulanması, kimlik denetiminin yapılmasıdır. Bu makalemizde Microsoft .NET teknolojileriyle dijital imza oluşturmayı öğreneceğiz. Zorluk Derecesi: 1 2 3 4 5 Anahtar Sözcükler: Şifreleme Algoritması, RSA, Dijital İmza, Anahtar Dağıtımı, Microsoft .NET, Kriptoloji DSACryptoServiceProvider sınıfı doğrudan DSA şifrelemesi için kullanılacak sınıfı ifade eder. Bu sınıf biraz evvel bahsettiğimiz DSA sınıfından türeyen mühürlü bir sınıftır. Mühürlü sınıf, hiç bir sınıfın kendisinden türetilemeyeceğini ifade eder. Bu sınıfın erişilebilir özellikleri şunlardır: KeyExchangeAlgorithm, anahtar değişimi algortimasının ismini belirtir. DSA için anahtar değişimi algoritması yoktur. KeySize, şifreleme ve deşifreleme için kullanılacak anahtarların kaç bitten oluşacağını gösterir. Bu özelliğin değerini değiştirerek, kullanılacak bit sayısını ayarlayabilirsiniz. Varsayılan anahtar boyutu 1024 bittir. PersistKeyInCsp, anahtarın CSP(Cryptographic Service Provider) içerisinde kalıcı olarak tutulup tutulmayacağını belirten özelliktir. Bu özelliğin değerini değiştirerek dışarıdan bu özelliği aktif/pasif kılabilirsiniz. LegalKeySize, bu algoritma tarafından desteklenen geçerli anahtarlar bit olarak büyüklüğünü gösterir. DSA algoritması için anahtar büyüklüğü en az 512 bit en fazla 1024 bittir. SignatureAlgorithm, imzalama için kullanılacak algoritmanın adını gösterir. DSA için “http://www.w3.org/2000/09/xmldsig#dsa-sha1” tir. UseMachineKeyStore, PersistKeyInCsp ile bilgisayar üzerinde kalıcı olarak tutulması istenen anahtarları o an ki kullanıcı profilinde mi yoksa tüm kullanıcılar için ortak olan bir yerde mi tutulacağını belirtir.Bu sınıfın erişilebilir metotları ise şunlardır: Clear, DSA tarafından kullanılan tüm kaynakları sisteme geri verir. CreateSignature, belirtilen bilgi için imza oluşturur. Equals, iki nesnenin birbirine eşit olup olmadığını test eder. ExportParameters, DSA"in tüm parametreleri özel ve genel anahtarlar dahil DSAParameter yapısından bir nesne içine kaydeder. FromXmlString, XML Deserileştirme gibidir. ToXMLString metotu ile XML"e aktarılmış nesneyi yeniden oluşturur, nesneyi XML"e yüklenmeden önceki durumuna getirir. GetHashCode, bellekteki o nesneye özgü bir hash kodu oluşturur. GetType, bu nesnenin tipini verir. ImportParameters, DSAParameters yapısından bir nesne içindeki, DSA"nın kullanacağı tüm parametreleri özel ve genel anahtarları dahil geri yükler. SignData, belirtilen veri için hash değerini hesaplar ve veriyi imzalaar. SignHash, özel anahtar ile şifreleyerek belirtilen hash değeri için imzayı hesaplar. ToString, şu an ki nesneyi ifade eden bir metin oluşturur. ToXmlString, XML Serileştirme gibidir. Nesnenin o anki durumunu yeniden oluşturulabilecek bir şekilde XML"e aktarır. VerifyData, belirtilen veri için tekrar imzayı oluşturup uyuşup uyuşmadığını kontrol eder. VerifyHash, belirtilen hash değeri için tekrar imzayı oluşturup uyuşup uyuşmadığını kontrol eder. VerifySignature, Belirtilen bilgi için DSA imzasını doğrular.Basit bir örnek ile imza oluşturup doğrulamayı gerçekleyelim. C#using System; using System.Security.Cryptography; namespace TestConsoleApplication { public class TestUygulaması { static void Main() { try { //Yeni bir anahtar çifti oluşturabilmek için yeni bir //DSACryptoServiceProvider nesnesi oluşturalım DSACryptoServiceProvider dsa = new DSACryptoServiceProvider(); //İmzalamak için kullanacağımız bir hash tanımlayalım byte[] hash= {59,4,248,102,77,97,142, 201,210,12,224,93,25,41,100,197,213,134,130,135}; //Hash"i imzalamak için DSASignatureFormatter nesnesi //oluşturalım. Anahtar bilgisini iletmek için kurucu //metoduna DSACryptoServiceProvider nesnemizi verelim. DSASignatureFormatter dsaFormatter = new DSASignatureFormatter(dsa); //İmza oluşturulurken kullanılacak algoritmayı belirtelim dsaFormatter.SetHashAlgorithm("SHA1"); //İmzalanmış Hash değerini tutacağımız bir byte dizisi //tanımlayalım DSASignatureFormatter sınıfını //kullanarak hash i imzalayalım byte[] SignedHash= dsaFormatter.CreateSignature(hash); //İmzalanmış hash değerini doğrulamak için //DSASignatureDeformatter sınıfından bir nesne //oluşturalım. Bu sınıfın kurucu metoduna //DSACryptoServiceProvider nesnemizi verelim. DSASignatureDeformatter dsaDeformatter = new DSASignatureDeformatter(dsa); //İmzalamak için SHA 1 hash algoritmasının kullanıldığını //biliyoruz dsaDeformatter.SetHashAlgorithm("SHA1"); //Şimdi de hash değerini doğrulayalım.. if (dsaDeformatter.VerifySignature(hash,SignedHash)) { Console.WriteLine("İmza Doğrulandı."); } else { Console.WriteLine("İmza Doğrulanamadı."); } } catch(CryptographicException e) { Console.WriteLine("Şifreleme Hatası Oluştu: "+e.Message); } Console.Read(); } } }VB.NETImports System Imports System.Security.Cryptography Module TestConsoleApplication Sub Main() Try "Yeni bir anahtar çifti oluşturabilmek için yeni bir "DSACryptoServiceProvider nesnesi oluşturalım Dim dsa As New DSACryptoServiceProvider "İmzalamak için kullanacağımız bir hash tanımlayalım Dim hash As Byte() = {59, 4, 248, 102, 77, 97, 142, 201, 210, 12,224,93,25,41,100,197,213,134,130,135} "Hash"i imzalamak için DSASignatureFormatter nesnesi "oluşturalım. Anahtar bilgisini iletmek için kurucu "metoduna DSACryptoServiceProvider nesnemizi verelim. Dim dsaFormatter As New DSASignatureFormatter(dsa) "İmza oluşturulurken kullanılacak algoritmayı belirtelim dsaFormatter.SetHashAlgorithm("SHA1") "İmzalanmış Hash değerini tutacağımız bir byte dizisi "tanımlayalım. DSASignatureFormatter sınıfını kullanarak "hash i imzalayalım. Dim SignedHash As Byte() = dsaFormatter.CreateSignature(hash) "İmzalanmış hash değerini doğrulamak için "DSASignatureDeformatter sınıfından bir nesne "oluşturalım. Bu sınıfın kurucu metoduna "DSACryptoServiceProvider nesnemizi verelim. Dim dsaDeformatter As New DSASignatureDeformatter(dsa) "İmzalamak için SHA 1 hash algoritmasının "kullanıldığını biliyoruz dsaDeformatter.SetHashAlgorithm("SHA1") "Şimdi de hash değerini doğrulayalım.. If(dsaDeformatter.VerifySignature(hash, SignedHash))Then Console.WriteLine("İmza Doğrulandı.") Else Console.WriteLine("İmza Doğrulanamadı.") End If Catch e As CryptographicException Console.WriteLine("Şifreleme Hatası Oluştu: "+e.Message) End Try Console.Read() End Sub End ModuleC++.NET#include "stdafx.h" #using using namespace System; using namespace System::Security::Cryptography; int _tmain() { try { //Yeni bir anahtar çifti oluşturabilmek için yeni bir //DSACryptoServiceProvider nesnesi oluşturalım DSACryptoServiceProvider __gc* dsa = __gc new DSACryptoServiceProvider(); //İmzalamak için kullanacağımız bir hash tanımlayalım Byte hash[]= {59,4,248,102,77,97,142, 201,210,12,224,93,25,41,100,197,213,134,130,135}; //Hash"i imzalamak için DSASignatureFormatter nesnesi //oluşturalım. Anahtar bilgisini iletmek için kurucu //metoduna DSACryptoServiceProvider nesnemizi verelim. DSASignatureFormatter __gc* dsaFormatter = __gc new DSASignatureFormatter(dsa); //İmza oluşturulurken kullanılacak algoritmayı belirtelim dsaFormatter->SetHashAlgorithm(S"SHA1"); //İmzalanmış Hash değerini tutacağımız bir byte dizisi //tanımlayalım. DSASignatureFormatter sınıfını kullanarak //hash i imzalayalım Byte SignedHash[]= dsaFormatter->CreateSignature(hash); //İmzalanmış hash değerini doğrulamak için //DSASignatureDeformatter sınıfından bir nesne oluşturalım. //Bu sınıfın kurucu metoduna DSACryptoServiceProvider //nesnemizi verelim. DSASignatureDeformatter __gc* dsaDeformatter = __gc new DSASignatureDeformatter(dsa); //İmzalamak için SHA 1 hash algoritmasının //kullanıldığını biliyoruz dsaDeformatter->SetHashAlgorithm(S"SHA1"); //Şimdi de hash değerini doğrulayalım.. if (dsaDeformatter->VerifySignature(hash,SignedHash)) { Console::WriteLine("İmza Doğrulandı."); } else { Console::WriteLine("İmza Doğrulanamadı."); } } catch(CryptographicException* e ) { Console::WriteLine(String::Concat( S"Şifreleme Hatası Oluştu: ",e->Message)); } Console::Read(); return 0; }J#package TestConsoleApplication; import System.*; import System.Security.Cryptography.*; public class TestUygulaması { public TestUygulaması() { } /** @attribute System.STAThread() */ public static void main(String[] args) { try { //Yeni bir anahtar çifti oluşturabilmek için yeni bir //DSACryptoServiceProvider nesnesi oluşturalım DSACryptoServiceProvider dsa = new DSACryptoServiceProvider(); //İmzalamak için kullanacağımız bir hash tanımlayalım ubyte[] hash= {59,4,248,102,77,97,142, 201,210,12,224,93,25,41,100,197,213,134,130,135}; //Hash"i imzalamak için DSASignatureFormatter nesnesi //oluşturalım. Anahtar bilgisini iletmek için kurucu //metoduna DSACryptoServiceProvider nesnemizi verelim DSASignatureFormatter dsaFormatter = new DSASignatureFormatter(dsa); //İmza oluşturulurken kullanılacak algoritmayı belirtelim dsaFormatter.SetHashAlgorithm("SHA1"); //İmzalanmış Hash değerini tutacağımız bir byte //dizisi tanımlayalım. DSASignatureFormatter sınıfını //kullanarak hash i imzalayalım ubyte[] SignedHash= dsaFormatter.CreateSignature(hash); //İmzalanmış hash değerini doğrulamak için //DSASignatureDeformatter sınıfından bir nesne //oluşturalım. Bu sınıfın kurucu metoduna //DSACryptoServiceProvider nesnemizi verelim. DSASignatureDeformatter dsaDeformatter = new DSASignatureDeformatter(dsa); //İmzalamak için SHA 1 hash algoritmasının //kullanıldığını biliyoruz dsaDeformatter.SetHashAlgorithm("SHA1"); //Şimdi de hash değerini doğrulayalım.. if (dsaDeformatter.VerifySignature(hash,SignedHash)) { Console.WriteLine("İmza Doğrulandı."); } else { Console.WriteLine("İmza Doğrulanamadı."); } } catch(CryptographicException e) { Console.WriteLine("Şifreleme Hatası Oluştu: "+ e.get_Message()); } Console.Read(); } } Son Söz: Günümüz güvenlik sistemlerinin temelini oluşturan dijital imzaları Microsoft .NET ile imza oluşturmayı inceledik. Bir sonraki makalemizde görüşünceye kadar güvende kalın... İlgili Makaleler: Dijital İmza Referanslar: Yazar : Yunus Emre ALPÖZENe-Posta : yunus.alpozen et msakademik.net

Döküman Arama

Başlık :

Kapat