Batuhan TOSUN
       confidentiality, integrity, availability

MD5 Algoritması

clock Nisan 14, 2009 12:02 author Batuhan Tosun tarafından yayınlanmıştır

MD 5(Message Digest 5)  algoritması bu zamana kadarki md algoritmaları içinde türetilen en iyi algoritmadır.MD algoritmasından türetilerek MD4 ü yaratan RON RİVEST  MD4 üzerinde zafiyetleri ve açıkları gidererek MD 5 algoritmasını yaratmıştır.

MD5  algoritma veriyi sonsuz uzunlukta kabul ederek 128 bitlik bir boyutta  şifreler.MD5  de veri 512 bitlik boyutlara ayrılarak üzerlerinde işlem sağlar.

MD5 bir hash algoritmasıdır.Hash algoritması için daha öncede dediğim bir tanım vardı ;”hash algoritmaları bir nevi şifreyi şifreleyen algoritmalardır.Bu nedenle koyduğumuz şifreyi örneğin bir web site içinde tekrar şifreler,ve böylelikle örneğin bir sql atağında sistemi kıran ve panele giren hacker şifrenin md5  ile şifrelenmiş haline ulaşılır.”.

Örneğin: 1234 rakamlarına sahip bir şifrenin md5 ile şifrelenmiş hali;

0F037584C99E7FD4F4F8C59550F8F507 ‘ budur. 

MD5 algoritması çoğu algoritmaya nazaran tek yönlü çalışır ve sadece şifreleme yapar.MD5 eski türetilen diğer md algoritmalarına göre daha yavaş ancak daha güçlü çalışır.

MD5 algoritması;güvenli şifre saklama protokollerinde sıklıkla kullanılır.Bunun ilgili bir örnek yapacağız.

Öncelikle md5 i .net üzerinde inceleyelim ve rahat anlaşılabilmesi için önce hash fonksiyonlarını gösterelim.

 

Hash algoritma hiyerarşisi altında aşağıdaki algoritmalar kullanılabilir.

 

System.Security.Cryptography. KeyedHashAlgorithm
System.Security.Cryptography.
MD5
System.Security.Cryptography.
RIPEMD160
System.Security.Cryptography.
SHA1
System.Security.Cryptography.
SHA256
System.Security.Cryptography.
SHA384
System.Security.Cryptography.
SHA512 

 

Söz dizimlerine bakacak olursak 


VB 

 

<ComVisibleAttribute(True)> _

Public MustInherit Class HashAlgorithm _ 
Implements ICryptoTransform, IDisposable 

 

 C# 

 

[ComVisibleAttribute(true)]
public abstract class HashAlgorithm : ICryptoTransform, 
    IDisposable


   C++ 

 

[ComVisibleAttribute(true)]
public ref class HashAlgorithm abstract : ICryptoTransform, 
    IDisposable
 


Hash algoritmalarında ve hashten türetilen algoritmalarda hash fonksiyonları kullanılır.Hash fonksiyonları gizliliği sağlar ve imzalama şeklinde anahtarlama oluşturur.
  

Aşağıdaki koda bakacak olursanız md5 i tetikleyen c# kodlamadını göreceksiniz.

 

 static string getMd5Hash(string input) 
  
{
               

 MD5 md5Hasher = MD5.Create(); 
          
byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(input));
     
  
       
StringBuilder sBuilder = new StringBuilder();
    
 
       
for (int i = 0; i < data.Length; i++)
       

 {           

 sBuilder.Append(data[i].ToString("x2"));       
}
       

  return sBuilder.ToString();   

 }  

 

Aşağıdaki kod ise aynı uygulama içerisinde md5 doğrulamasını sağlayan kod bloğudur. 

  static bool verifyMd5Hash(string input, string hash)   

 {              

 string hashOfInput = getMd5Hash(input);        

 StringComparer comparer = StringComparer.OrdinalIgnoreCase;       

  if (0 == comparer.Compare(hashOfInput, hash))       

{           

return true;       

 }       

else       

 {           

return false;      

  }   

}   

 

MD5 in web üzerinde yapılmış bir küçük kod uygulamasını mantığını daha iyi anlamanız için yazıyorum.(Aşağıda)

class Crypto


    {
        private static byte[] ToByteArray(object value)
        {
            byte[] result = new byte[] { };
            string val = value as string;
            if (val != null)
                result = new System.Text.UnicodeEncoding().GetBytes(val);
            return result;
        }        public static string ToMD5(string value)
        {
            byte[] hash = new System.Security.Cryptography.MD5CryptoServiceProvider().ComputeHash(ToByteArray(value));
            string result = System.BitConverter.ToString(hash);
            result = result.Replace("-", "");
            return result;


        }
    } 

 

Şimdi biraz daha konsept bir analiz uygulama ile noktayı koyalım.

Hash Algoritmaları ile MD5 üzerinde CryptoStream Testi


public
void CryptoStream_Test ()

{

DebugStream debug = new DebugStream ();

 

byte[] key = {0, 1, 2, 3, 4, 5, 6, 7};

byte[] iv = {0, 1, 2, 3, 4, 5, 6, 7};

DES des = DES.Create ();

CryptoStream cse = new CryptoStream (debug, des.CreateEncryptor (key, iv), CryptoStreamMode.Write);

MD5 hash = MD5.Create ();

CryptoStream csh = new CryptoStream (cse, hash, CryptoStreamMode.Write);

byte[] data = Encoding.UTF8.GetBytes ("http://www.testlink.com");

csh.Write (data, 0, data.Length);

csh.FlushFinalBlock ();

byte[] result = debug.ToArray ();

AssertEquals ("Encrypted", "8C-24-76-74-09-79-2B-D3-47-C3-32-F5-F3-1A-5E-57-04-33-2E-B8-50-77-B2-A1", BitConverter.ToString (result));

byte[] digest = hash.Hash;AssertEquals ("Hash", "71-04-12-D1-95-01-CF-F9-8D-8F-F8-0D-F9-AA-11-7D", BitConverter.ToString (digest));

}

 

Son Söz

MD5 güvenli şifre saklama protokollerinde ve web uygulamalarında sıklıkla kullanabilceğimiz bir algoritmadır.Özellikle web uygulamalarında source kaynaklı olarak çabuk tanımlanması,esnek olması ve hızlı olması en önemli özelliğidir.Bir sonraki makalemde görüşmek üzere….  



.NET Güvenliği-2

clock Nisan 14, 2009 12:02 author Batuhan Tosun tarafından yayınlanmıştır

Daha önce .net güvenliği ve kriptografi isimli makalemde .net güvenliğinden genel olarak bahsetmiştim ve kriptografi konusuna değinmiştim.Gelen mailler ve istekler doğrultusunda sırf .net güvenliği ve bu politikalar doğrultusunda sınıfları ve kullanım alanlarını anlatacağım.Biraz sözel bir makale olabilir çünkü ana temel biçim ve kavramları anlatmaya çalışacağım.

Daha önce CLR in Security isimli makalemde .net güvenliğinin api ve formasyonlarla framework yapısında clr ve cls tabanlı sunulduğunu anlatmıştım.Bunlar için en güzel iki örneği ;Serializing Permission Requests ve Assembly Permission Requests i vermiştim.Net güvenliği CLR(Common Langue Runtime) ve CLS(Common Langue Specification) tabanlı olarak CryptoAPI gibi yapıları hizmetimize sunar ve bu api lerle işlemlerimizi daha önceden hazırlanmış namespace ler ile using System.Security; sınıflarında gerçekleştiririz.

.Net ortamının bize sunduğu provider lar ile işlemlerimizin yapılmasını sağlar ve streamreader,filestream,memorystream gibi yapılar ilede dosya ve bellek işlemlerimizi gerçekleştiririz.Bunlar gibi birçok yapı vardır.Fakat ben bana gelen sorularda üzerlerinde en çok durulan ve "bu ne işe yarıyor" sıfatıyla gelen yapılara değineceğim.

Şimdi bunların tam olarak görevlerine bir göz atalım.

...ServiceProvider : Bunun için crytoserviceprovider örneğini vereceğim.Dosya veya veri üzerinde şifreleme yapılmasını sağlar.Şifreleme değeri ve parmak izlerini elde değer.Genel olarak Security bazında yapacağımız işlemleri gerçekleştirir.

StreamReader : Dosyadan  okuma işlemlerini yapmamızı sağlar.

FileStream : Dosyalar üzerinde yapılacak işlemler için kullanılır.FileStream in bu alanda tercih edilmesinin en büyük etkeni dosyaya yazdığımız veriyi direk dosyaya yazmayıp bir bufferda bekletmesidir.

MemoryStream : Şifrelenecek veya güvenli bölgeye taşınacak veriyi belleğe yazdırır.Yane örneklendirecek olursak;veriyi cryptoserviceprovider şifreler işte bu şifrelenecek olan veriyi memory stream hafızada tutar ve cryptostream yardımı ile şifreleme modülü ile bellekte tutulan veri birleştirilir ve şifreleme gerçekleştirilir.

...Managed : Sınıfın algoritmasını api ve dll lerden çeken ve kullanıma sunan yapıdır.

 

Güvenlik sistemine baktığımız zaman CLR yapısında .security sınıfına çalışma ortamında hep yardım eden Reflection ve Serialization iç sınıfları vardır.Bunları bazı güvenlik politikalarında tekrar referans olarak kullanıp üzerlerinde işlem yaptığımız anlar gelir.

Şimdi .Net ortamının bize sunduğu referenslara ve görevlerine bakalım.

 using.System.Security; ile tabire açtığımız alanda bize 6 adet sınıf yardımcı olur.Bunlar;

 

1)using System.Security.AccessControl; Dosya erişim güvenliği platformudur.Dosyalar üzerinde kullanıcı erişim haklarını yapılandırabilir.

2)using System.Security.Principal; Asp.Net ten bildiğimiz Rol-Tabanlı güvenlik prosedürü bu sınıfa dayanır.Rol işlemleri ve görev işlemleri için kullanılabilir.

3)using System.Security.Authentication;  Kimlik doğrulama ve yetki sorgulama gibi asp.net ve IIS üzerinde bilgiğimiz kavramların dayandığı sınıftır.

4)using System.Security.Permission; Kaynak ve işlemlerde erişimi kontrol eder.Yetki arttırma veya kısıtlama işlemlerinde kullanılır.

5)using System.Security.Policy; Güvenli bölge tanımı ve sabit güvenlik politikaları için yaratılmış sınıftır.

6)using System.Security.Cryptography; Dosya ve veri üzerinde saklama,şifreleme,koruma işlemlerini gerçekleştireceğimiz sınıftır.

Bunları okuduğunuz zaman kafanızdaki soru işaretlerinin büyük bir kısmının bittiğine eminim.Çünkü basitte olsa,indirgenmişte olsa bu sınıfların bir çoğunu siz kullandınız.Gördüğünüz gibi asp.net te authentication dan tutun Rol-Based işlemlerine kadar hepsi .net Güvenliği içerisinde tanımlanmış yapılardır.

 

Gelen soru ve isteklere yönelik kendimde extra bilgiler katarak zenginleştirilmiş bir yazı oluşturdum.Gelen sorulara cevap verdiğim gibi ayrıca,bununla ilgili makale hazırlamak sizlerin çokdaha işinize yarayacaktır.

 

Son Söz:

Bir kavramın,sistemin veya yapının çalıştığını görmek ve bunlaral ilgili örnekler yapmak güzeldir.Fakat bunu ezbere yapmadığınıza emin olun.Benim bu yazımda dikkat ettiyseniz kavramları çalışma mantıkları ve örneklerle anlatmaya çalıştım.Lütfen önce mantığını oturtunuz , yoksa bir noktada çözülemez vir düğüm olduğunu görürsünüz.Bir sonraki makalemde gürüşmek ümidiyle...



AES(Advanced Encryption Standart) Algoritması

clock Nisan 14, 2009 12:01 author Batuhan Tosun tarafından yayınlanmıştır

AES(Advanced Encryption Standard) algoritması gelişmiş şifreleme standardı anlamına gelir.FIPS tarafından başarılı bulunmuş ve onaylanmış bir şifreleme algoritmasıdır.Yapısı ve güvenilirliği çok gelişmiştir.TribalDES algoritmasından altı kat,DES algoritmasından ü. Kat daha hızlı çalışır.

         AES,128,192 ve 256 byte uzunluklarda anahtarlama özelliğine sahiptir ve 128 byte lık kod bloklarını şifreleme ve deşifreleme yapısını taşıyan simetrik bir algoritmaya sahiptir.
        AES algoiritmasında tüm bayt lar birer eleman olarak kabul edilir ve iki bayt ın birbiri ile karşılıklı işlemleri

bayt=x dersek à   x-or işlemine tabi tutulur.

 

Algoritma iki ana temel üzerine oturtulmuştur.Birincisi şifreleyici ve çözücü, ikincisi ise anahtar üretici.Algoritma her şifreleme üreticisinde bir tur döner ve tur sayısı anahtar uzunluğuna göre değişir.

Örn: 128 bit lik AES 4 kelimelik anahtar uzunluğunda 10 tur atar.

AES algoritmasının sözsel işleyişini aşağıda göreceğiz.

 

AESşifreleme(GirişDurumu, Anahtar)                                                        

{

                               TurAnahtarı[Nr : 1] = AnahtarÜreteci(Anahtar);

                               Durum[0] = İlkAnahtarToplaması(GirişDurumu, Anahtar);

                              

for(i = 1; i < Nr ; i++)

               Tur(Durum[i-1], TurAnahtarı[i])

                              

FinalTuru(Durum[Nr-1], Tur Anahtarı[Nr])

}

 

AES algoritmasında tur dönümü için sözsel işleyiş ise aşağıdadır.

 

Tur(GirişDurumu, TurAnahtarı[i])                                                              (3.5)

{

                               Durum1 = BaytDeğişimi(GirişDurumu);

                               Durum2 = SatırKaydırma(Durum1);

                               Durum3 = SütunKarıştırma(Durum2);

                               ÇıkışDurumu = TurAnahtarınıTopla(Durum3, Tur Anahtarı[i])

}

 

SonTur(GirişDurumu, TurAnahtarı[Nr])                                                     (3.6)

{

                               Durum1 = BaytDeğişimi(GirişDurumu);

                               Durum2 = SatırKaydırma(Durum1);

                               ÇıkışDurumu = TurAnahtarınıTopla(Durum2, Tur Anahtarı[Nr])

}

  

AES her tur dönüşünde dört adım izler;

1.)    Bayt-değiştirme,

2.)    Satırları Kaydırma,

3.)    Sütunları Karıştırma,

4.)    Tur Anahtarının Toplanması.

  

Bu denli teorik bilgiden sonra .net platformu açısından bakalım.

  

AES algoritmasını namespace i yine aşağıdaki hiyerarşiyi takip eder.

 ---System.Object
  --System.Security.Cryptography
.
SymmetricAlgorithm
       System.Security.Cryptography.Aes

          * System.Security.Cryptography
.AesCryptoServiceProvider
           *System.Security.Cryptography
.AesManaged
 Algoritmanın syntax ini inceleyecek olursak; 

 

VB <HostProtectionAttribute(SecurityAction.LinkDemand, MayLeakOnAbort := True)>
_
Public MustInherit Class Aes _ 
  
Inherits SymmetricAlgorithm



Dim instance As Aes  

 

C#

[HostProtectionAttribute(SecurityAction.LinkDemand, MayLeakOnAbort = true)]

public abstract class Aes : SymmetricAlgorithm



Visual C++


[HostProtectionAttribute(SecurityAction::LinkDemand, MayLeakOnAbort = true)]

public ref class Aes abstract : public SymmetricAlgorithm



JScript



public abstract class Aes extends SymmetricAlgorithm  

 

AES in bulunduğu ikinci bir hiyerarşi ise webservices üzerindedir.

System.Object
   Microsoft.Web.Services2.Security.Cryptography.KeyAlgorithm
     Microsoft.Web.Services2.Security.Cryptography.SymmetricKeyAlgorithm
      Microsoft.Web.Services2.Security.Cryptography.AES
         Microsoft.Web.Services2.Security.Cryptography.AES128
         Microsoft.Web.Services2.Security.Cryptography.AES192
         Microsoft.Web.Services2.Security.Cryptography.AES256

 

 Bu hiyerarşi içinde syntax örneği vermek gerekirse….128 bit lik için;

 

C#

 

public sealed class AES128 : AES


VB

NotInheritable Public Class AES128
    Inherits AES

Dim aES1281 As New AES128()
 
C++.NET
public sealed ref class AES128 : public AES
 
 
J#.NET
public final class AES128 extends AES
 
şeklinde olacaktır.
 
 
SON SÖZ
Gerçekten güzel ve özel bir algoritma olduğu için teorisinin çok üstünde durarak anlattım.

AES algoritması içerisinde birçok varyasyonu getiren bir algoritmadır.Algoritma bir nevi en uygun sürüm bulunması için AES algoritması üzerinden farklı algoritmalar çıkarıldı.En iyi seçilen 5 algoritma tekrar elendi ve en iyi AES algoritması Rijndael algoritması oldu.Uygulaması ile beraber Rijndael makalemi önümüzdeki zamanlar içerisinde yazacağım…. 

Mutlu kalın,Güvenle kalın .…..  



.net Güvenliği ve Kriptografi

clock Nisan 14, 2009 11:59 author Batuhan Tosun tarafından yayınlanmıştır

Günümüz teknololojisi ilerledikçe bazı güvenlik politikalarınıda izlememiz kaçınılmaz olacaktır.Bunlardan en önemlilerinden biride şifreleme ve ortam güvenliği sağlamaktır .Net güvenliği üzerinde bize bu güvenlik prosedürünü uygulayabileceğimiz ortam ve kodlama masası yaratılmaktadır.Daha önceki makalemde CLR ın sağladığı güvenlik prosedürleri ile uzun bir yazı dizisine başlamıştık.Bugünde .Net güvenliğine devam edeceğiz ve Kriptografi konusuna giriş yapacağız.

Kriptografi belli başlı şifreleme algoritmaları üzerine oturtulmuştur.Baktığımız zaman üç ayrı şifreleme algoritması olduğunu görüyoruz.

1)Simetrik Algoritma
2)Asimetrik Algoritma
3)Hash Algoritması dır.

Şimdi bunlara açıklamaları,namespaceleri ve bu algoritmalar üzerinde .net security ortamındaki şifreleme methodlarıyla giriş yapalım.

 

1)Simetrik Algoritma(Private-Key):

Basit şifreleme methodlarının mantığına oturtulmuş bir algoritmadır.Bilinen eski methotdur diyebiliriz.Julius Sezar  döneminden beri kullanılır.Şöyleki verinin şifrelenmesinde de şifrelendikten sonra açılmasındada aynı anahtarı gerektiren bir kodlama yapısı vardır.Yane Simetrik olarak şifrelenmiş bir dosyayı açabilmeniz için aynı anahtara sahip olabilmeniz gerekmektedir.Klasik bir method olduğu gibi güvenliği son derece max. Tutan bir methodtur..Net ortamında baktığımız zaman System.Security.Cryptography namespace ile kullanılır.

Sözdizimi

 

C#
ComVisibleAttribute(true)]
public abstract class SymmetricAlgorithm : IDisposable  şeklindedir.
VB
MustInherit Class SymmetricAlgorithm _
    Implements IDisposable
 
 
System.Object hiyerarşisi altında;
AES,DES,RC2,Rijndael,TripleDES 
şifreleme methodları simetrik algoritma düzeni ile oluşturulmuş ve .net in bize sunduğu yordamlardır.

System.Security.Cryptography.SymmetricAlgorithmSystem.Security.Cryptography.Aes    System.Security.Cryptography.DES    System.Security.Cryptography.RC2    System.Security.Cryptography.Rijndael    System.Security.Cryptography.TripleDES
Şeklindedir.

Simetrik algoritmaya örnek olarak Rijndael yordamıyla bir örnek kod a bakalım.
 

private static void EncryptData(String inName, String outName, byte[] rijnKey, byte[] rijnIV)       

 {           

//Giriş ve çıkış dosyalarımızı filestream altında tanımladık ve okuttuk. 
          
FileStream fin = new FileStream(inName, FileMode.Open, FileAccess.Read);
  
         
FileStream fout = new FileStream(outName, FileMode.OpenOrCreate, FileAccess.Write);
  
         
fout.SetLength(0);
                        
byte[] bin = new byte[100];
           
long rdlen = 0;
           
long totlen = fin.Length;   
int len;           
    
                
SymmetricAlgorithm rijn = SymmetricAlgorithm.Create(); //methodu yaratmaya başlıyoruz   
           
CryptoStream encStream = new CryptoStream(fout, rijn.CreateEncryptor(rijnKey, rijnIV), CryptoStreamMode.Write);
    
        
Console.WriteLine("Encrypting...");
                        

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();

        }
 
Kodlamayı örnek amacıyla verdim.
Şu an anlatmak istediğim şey algoritma türleri ve kullanım biçimleridir.Kodlama karmaşık gelebilir.Ancak kodlama bölümüne daha sonraki makalelerde algoritmaları tek tek ele alacağım zaman gireceğim.

 

 

 

2)Asimetrik Algoritma(Public-Key):

Asimetrik algoritmada simetrik algoritmadan farklıdır.Şifreleyen ve çözen anahtar farklıdır.
A ile şifrelenen sadece B ile çözülebilir.
Son 40 yıl içerisinde gelişmiştir ve en önemli örneği RSA dır.
Asimetrik algoritmaya diğer bir değişle açık anahtarlı algoritmada diyebiliriz.

.Net ortamında baktığımız zaman System.Security.Cryptography namespace ile kullanılır.



Sözdizimi

 

C#
[ComVisibleAttribute(true)]
public abstract class AsymmetricAlgorithm : IDisposable
VB
<ComVisibleAttribute(True)> _
Public MustInherit Class AsymmetricAlgorithm _
    Implements IDisposable
 

 

System.Object hiyerarşisi altında;
DSA,RSA,ECDsa,ECDiffieHellman 
şifreleme methodları asimetrik algoritma düzeni ile oluşturulmuş ve .net in bize sunduğu yordamlardır.
System.Security.Cryptography.AsymmetricAlgorithm    
System.Security.Cryptography.DSA    System.Security.Cryptography.RSA    System.Security.Cryptography.ECDsa    System.Security.Cryptography.ECDiffieHellman
 
 Kullanım yordamlarındandır.
 
Kod bloklarında bakacak olursak;
C#
using System.Security.Cryptography;
using System.Reflection;
 
[assembly: AssemblyKeyFile("CustomCrypto.snk")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: CLSCompliant(true)]
namespace Contoso
    public class CustomCrypto : 
        System.Security.Cryptography.AsymmetricAlgorithm
    {
        
        private CspParameters cspParameters;
        private readonly KeySizes[] keySizes = {new KeySizes(8, 64, 8)};
 
     
        public CustomCrypto()
        {
            this.KeySize = 8;
        }
………………..
…………
……..

 
VB
 
Imports System.Security.Cryptography
Imports System.Reflection
 
<Assembly: AssemblyKeyFile("CustomCrypto.snk")> 
<Assembly: AssemblyVersion("1.0.0.0")> 
<Assembly: CLSCompliant(True)> 
Namespace Contoso
    
    Class vbCustomCrypto
        Inherits System.Security.Cryptography.AsymmetricAlgorithm
 
        Private cspParameters As CspParameters
        Private ReadOnly keySizes() As keySizes = {New keySizes(8, 64, 8)}
 
        Public Sub New()
            Me.KeySize = 8
        End Sub
……………………..……………..………..…..   .
 
 
 Şeklinde tanımlanıp kullanılır ve uygulama içerisine yerleştirilir.
 

3)Hash Algoritması :

 

Ben hash algoritması için şifrelenmiş şifre demek istiyorum.
Çünkü güvenliğimiz açısından sisteme gönderilen
şifreyi otomatik olarak kendi sistemi içinde şifreler.
Hash algoritmasının içerisinde hash fonksiyonları verileri
tek yönlü ve çift düze şifreler.
Yane istediğimiz uzunlukta belirleyebiliriz.

Diğer algoritmalar gibi security.cryptography namespace i ile kullanılır.

Syntax ına bakacak olursak.

 

 

 
VB
<ComVisibleAttribute(True)> _
Public MustInherit Class HashAlgorithm _
    Implements ICryptoTransform, IDisposable
 
C#
 
[ComVisibleAttribute(true)]
public abstract class HashAlgorithm : ICryptoTransform, 
    IDisposable
 
Bize sunduğu 7 algoritma vardır.MD5,SHA1,SHA254,SHA384,SHA512,RIPEMD160,KeyedHashAlgorithm…
 
Şimdi bunların 2 farklı dilde kod bloklarına bakalım.
 
 
VB
Dim sha As New SHA1CryptoServiceProvider()
Dim result As Byte() = sha.ComputeHash(dataArray)
 
C#
HashAlgorithm sha = new SHA1CryptoServiceProvider();
byte[] result = sha.ComputeHash(dataArray);
………………………
 
Bahsedeceklerim bukadar..Net ortamının bize sağladığı güvenlik platformunu bir kez daha görmüş olduk.
 


CLR in Security

clock Nisan 14, 2009 11:59 author Batuhan Tosun tarafından yayınlanmıştır

Bu makalemde FrameWork ortamında çalışmasına devam eden common langue runtime ortamının .net üzerinde bize sunduğu güvenlik politikalarını inceleyeceğiz.İlk olarak Advanced c# yakı bir seviyeden Serialization tabanlı bir giriş yapacağız...

 

1)Serializing Permission Requests  :

using System;

using System.Security;

using System.Security.Permissions;

class App

{

static void Main(string[] args)

{

IPermission ıt = new EnvironmentPermission(EnvironmentPermissionAccess.Read,"hazirlanan");

IPermission bt = new FileDialogPermission(FileDialogPermissionAccess.Open);

PermissionSet ps = new PermissionSet(PermissionState.None);

ps.AddPermission(ıt);

ps.AddPermission(bt);

Console.WriteLine(ps.ToString());

 

}

 

}

Uygulamada gördüğünüz başlangıç mantığıyla beraber permision namespace lerini kullandık ve mantık hiç bozulmadı.Alıcağınız biçimi ToString değilde ToXml olarakda belirtebilirsiniz.O sizin nasıl kullandığınız ve neye göre kullandığınıza bağlıdır.Ben string olarak almayı uygun gördüm.

 

2)Assembly Permission Requests :

Burada göstereceğim şey sadece iki satırlık.AttributeUsage interface i ile yine permission namespace ini kullanarak security action düzeyinde minimum veya opsiyonel olarak istediğimiz dosyayı nasıl çekebiliriz?

using System.Security;

using System.Security.Permissions;

 

[assembly:
PermissionSetAttribute(SecurityAction.RequestMinimum,File = "min_perm.xml")]

[assembly: PermissionSetAttribute(SecurityAction.RequestOptional,File = "opt_perm.xml")]


 

Sağlıklı ve mutlu günler dilerim.



RSA Algoritması

clock Nisan 14, 2009 11:55 author Batuhan Tosun tarafından yayınlanmıştır

AES(Advanced Encryption Standard) algoritması gelişmiş şifreleme standardı anlamına gelir.FIPS tarafından başarılı bulunmuş ve onaylanmış bir şifreleme algoritmasıdır.Yapısı ve güvenilirliği çok gelişmiştir.TribalDES algoritmasından altı kat,DES algoritmasından ü. Kat daha hızlı çalışır.

         AES,128,192 ve 256 byte uzunluklarda anahtarlama özelliğine sahiptir ve 128 byte lık kod bloklarını şifreleme ve deşifreleme yapısını taşıyan simetrik bir algoritmaya sahiptir.
        AES algoiritmasında tüm bayt lar birer eleman olarak kabul edilir ve iki bayt ın birbiri ile karşılıklı işlemleri

bayt=x dersek à   x-or işlemine tabi tutulur.

 

Algoritma iki ana temel üzerine oturtulmuştur.Birincisi şifreleyici ve çözücü, ikincisi ise anahtar üretici.Algoritma her şifreleme üreticisinde bir tur döner ve tur sayısı anahtar uzunluğuna göre değişir.

Örn: 128 bit lik AES 4 kelimelik anahtar uzunluğunda 10 tur atar.

AES algoritmasının sözsel işleyişini aşağıda göreceğiz.

 

AESşifreleme(GirişDurumu, Anahtar)                                                        

{

                               TurAnahtarı[Nr : 1] = AnahtarÜreteci(Anahtar);

                               Durum[0] = İlkAnahtarToplaması(GirişDurumu, Anahtar);

                              

for(i = 1; i < Nr ; i++)

               Tur(Durum[i-1], TurAnahtarı[i])

                              

FinalTuru(Durum[Nr-1], Tur Anahtarı[Nr])

}

 

AES algoritmasında tur dönümü için sözsel işleyiş ise aşağıdadır.

 

Tur(GirişDurumu, TurAnahtarı[i])                                                              (3.5)

{

                               Durum1 = BaytDeğişimi(GirişDurumu);

                               Durum2 = SatırKaydırma(Durum1);

                               Durum3 = SütunKarıştırma(Durum2);

                               ÇıkışDurumu = TurAnahtarınıTopla(Durum3, Tur Anahtarı[i])

}

 

SonTur(GirişDurumu, TurAnahtarı[Nr])                                                     (3.6)

{

                               Durum1 = BaytDeğişimi(GirişDurumu);

                               Durum2 = SatırKaydırma(Durum1);

                               ÇıkışDurumu = TurAnahtarınıTopla(Durum2, Tur Anahtarı[Nr])

}

  

AES her tur dönüşünde dört adım izler;

1.)    Bayt-değiştirme,

2.)    Satırları Kaydırma,

3.)    Sütunları Karıştırma,

4.)    Tur Anahtarının Toplanması.

  

Bu denli teorik bilgiden sonra .net platformu açısından bakalım.

  

AES algoritmasını namespace i yine aşağıdaki hiyerarşiyi takip eder.

 ---System.Object
  --System.Security.Cryptography
.
SymmetricAlgorithm
       System.Security.Cryptography.Aes

          * System.Security.Cryptography
.AesCryptoServiceProvider
           *System.Security.Cryptography
.AesManaged
 Algoritmanın syntax ini inceleyecek olursak; 

 

VB <HostProtectionAttribute(SecurityAction.LinkDemand, MayLeakOnAbort := True)>
_
Public MustInherit Class Aes _ 
  
Inherits SymmetricAlgorithm



Dim instance As Aes  

 

C#

[HostProtectionAttribute(SecurityAction.LinkDemand, MayLeakOnAbort = true)]

public abstract class Aes : SymmetricAlgorithm



Visual C++


[HostProtectionAttribute(SecurityAction::LinkDemand, MayLeakOnAbort = true)]

public ref class Aes abstract : public SymmetricAlgorithm



JScript



public abstract class Aes extends SymmetricAlgorithm  

 

AES in bulunduğu ikinci bir hiyerarşi ise webservices üzerindedir.

System.Object
   Microsoft.Web.Services2.Security.Cryptography.KeyAlgorithm
     Microsoft.Web.Services2.Security.Cryptography.SymmetricKeyAlgorithm
      Microsoft.Web.Services2.Security.Cryptography.AES
         Microsoft.Web.Services2.Security.Cryptography.AES128
         Microsoft.Web.Services2.Security.Cryptography.AES192
         Microsoft.Web.Services2.Security.Cryptography.AES256

 

 Bu hiyerarşi içinde syntax örneği vermek gerekirse….128 bit lik için;

 

C#

 

public sealed class AES128 : AES


VB

NotInheritable Public Class AES128
    Inherits AES

 

Dim aES1281 As New AES128()
 
C++.NET
public sealed ref class AES128 : public AES
 
 
J#.NET
public final class AES128 extends AES
 
şeklinde olacaktır.

Şimdi RSA crypto service provider ile tanımlama kodlarımıza bakıyoruz.

 

  
VB
Inheritable Public Class RSACryptoServiceProvider
   Inherits RSA

C#
public sealed class RSACryptoServiceProvider : RSA
 
C++.NET
public __gc __sealed class RSACryptoServiceProvider : public RSA
 
JScript
public class RSACryptoServiceProvider extends RSA
 
 
 
 Şimdi c# üzerinde küçük birkaç kod bloğuyla devam edelim….
 
ÖRN:
 
                          …………………………
            RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
            RSA.ImportParameters(RSAKeyInfo);
            return RSA.Encrypt(DataToEncrypt, DoOAEPPadding);
 
                          ……………………………………..
 
 
            UnicodeEncoding ByteConverter = new UnicodeEncoding();
 
            byte[] dataToEncrypt = ByteConverter.GetBytes("Data to Encrypt");
            byte[] encryptedData;
            byte[] decryptedData;
            
            RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
 
            
            encryptedData = RSAEncrypt(dataToEncrypt,RSA.ExportParameters(false), false);
 
            
            decryptedData = RSADecrypt(encryptedData,RSA.ExportParameters(true), false);
 
 
 
 
ÖRN:
 
 
public abstract class RSA : AsymmetricAlgorithm {
 
               public static new RSA Create () 
               {
                       return Create ("System.Security.Cryptography. RSA");
               }
 
               public static new RSA Create (string algName)
               {
                       return (RSA) CryptoConfig.CreateFromName (algName);
               }
 
               protected RSA ()
               public RSA ()
               {
               }
 
 
 

Algoritmanın yerleştirilme ve yaratılmasını,kod bloğunda nasıl kullanacağımızı öğrendikten sonra şimdi iki güzel geniş uygulama ile devam edelim.

  

Bu aşağıdaki uygulamamıza RSA algoritmanın Managed özelliklerini test edeceğiz.Ve RSA algoritmayla hangi methotlar nasıl kullanılabilir onları göreceğiz….

 

public class RSA Managed {static int minKeySize = 384;

 

public void ConstructorEmpty ()

{

 

RSA Managed rsa= new RSA Managed ();Assert.AreEqual (1024, rsa.KeySize, "Default key size");

}

 

public void ConstructorKeySize ()

{

RSA Managed rsa = new RSA Managed (minKeySize);Assert.AreEqual (minKeySize, rsa.KeySize, "Minimum key size");

}

 

[ExpectedException (
typeof (CryptographicException))]public void TooSmallKeyPair ()

{

RSA Managed rsa = new RSA Managed (256);

}

 

[ExpectedException (
typeof (CryptographicException))]public void TooBigKeyPair ()

{

RSA Managed RSA = new RSA Managed (32768);

}

 

public void Properties ()

{

RSA Managed rsa = new RSA Managed (minKeySize);

Assert.AreEqual (1, rsa.LegalKeySizes.Length, "LegalKeySize");Assert.AreEqual (minKeySize, rsa.LegalKeySizes [0].MinSize,

"LegalKeySize.MinSize");

Assert.AreEqual (16384, rsa.LegalKeySizes [0].MaxSize, "LegalKeySize.MaxSize");Assert.AreEqual (8, rsa.LegalKeySizes [0].SkipSize,

"LegalKeySize.SkipSize");

Assert.AreEqual ("RSA -PKCS1-KeyEx", rsa.KeyExchangeAlgorithm, "KeyExchangeAlgorithm");Assert.AreEqual (

"http://www.w3.org/2000/09/xmldsig# rsa-sha1", rsa.SignatureAlgorithm, "SignatureAlgorithm");

rsa.Clear ();

Assert.AreEqual (1, rsa.LegalKeySizes.Length,
"LegalKeySize(disposed)");

Assert.AreEqual (minKeySize, rsa.LegalKeySizes [0].MinSize, "LegalKeySize.MinSize(disposed)");Assert.AreEqual (16384, rsa.LegalKeySizes [0].MaxSize,

"LegalKeySize.MaxSize(disposed)");

Assert.AreEqual (8, rsa.LegalKeySizes [0].SkipSize, "LegalKeySize.SkipSize(disposed)");Assert.AreEqual (

"RSA -PKCS1-KeyEx", rsa.KeyExchangeAlgorithm, "KeyExchangeAlgorithm(disposed)");Assert.AreEqual ("http://www.w3.org/2000/09/xmldsig# rsa-sha1", rsa.SignatureAlgorithm, "SignatureAlgorithm(disposed)");

}

 

string CapiXml384 = "< RSAKeyValue><Modulus>vWi7cHIntTcrwIoD0zj/fxoJCDfUHtC5xkMe8pJri7G+T6nKs4zRcLDWRDA0cNhf</Modulus><Exponent>AQAB</Exponent>_
<P>5DwRzr4EPAk1NOUSwI/z1yBJzG2EyrhR</P><Q>1HOEBwbXvsrPQvV7C0MWtHJ22UWgwgmv</Q><DP>qQrEtbePM1gujErOJMl59O/5OOw02mDB</DP>_
<DQ>bUFGqXJsavLTaaTidSU4PO4MjqnPBVqD</DQ><InverseQ>Y+XUwMmlI2G63reScAyc9PHvTPX2fwCg</InverseQ>_
<D>o1Ku5cwZf0IegPzBRZ5NeYy6oxJ430V8n4BLZ8G8/N6kRHnXe70OyzwAylPtxjGh</D></ RSA KeyValue>"
;

 

string CapiXml576 = "< RSAKeyValue><Modulus>si995MicOWrr2/VlH1rUAhyFMPVLj5PvYHU8P8I8R77kh1ePn66zuJ0jRsMCpenUzYGuVtqgn0VDjiaYjo7cE2PZYESLkKJl</Modulus>_
<Exponent>AQAB</Exponent><P>3wDFrI6eUAh72YxjdZD0b93/a/NEV26pp1c8j5fN3UUzA14r</P><Q>zI0O3NKXCgn3cC3Pe2ZUYEPbQaQDyMdSAiF06L1miwVHu0mv</Q>_
<DP>uQaC/LE4WV8wo0gAHcOvjEG9c2vcAE8pJFcVQG7LuBN6SAkR</DP><DQ>THffOoYvmL0pF3LIweT7XhGAAgYCtChvbAR95BQKJaaPrmBZ</DQ>_
<InverseQ>KTOfvWHp363Cl6r2lXc/gINaRqNo+iWRLeoBa6/vk0Kt5sWn</InverseQ>_
<D>QZ9L9h4Lqvm9s1xEya9htQVb6BPuqAoLdrK2ZaTbHnEnKNEN7oLMr1Ca5zh/E6xXKCmwClWyULeKiYq7vYLUXhaemtT1rN9h</D></ RSAKeyValue>"
;

string CapiXml640 = "<RSAKeyValue><Modulus>vqS9CNxiRdSc6x3nJOWnPi7gVA4Vsnhd8cTAaMBKuvI0FRhhDsTRsjr8PeH4Y7yMg8XSucr3I8jkYgapBW8s5hmSvdWZhPHRGEe1MiEIeMM=_
</Modulus><Exponent>AQAB</Exponent><P>7Ojjp/PqeacLRM/MP76wDnp4k+BpUSbitNwkPBAxL5KcBFVwhp+YVw==</P>_
<Q>zgFxY3BFx/ISEciI3ONux4iXd/cIwxrmq9CS3tBIecHTq0JgjXNPdQ==</Q><DP>TstCdGjOsnlZaSCHuSfN3HLlSaGYxZHeUvLo5kUoZr8nPtW/4DaSbw==</DP>_
<DQ>DCIhn425TnF/hvScuwXaPH5bDYHLTlKDS5NZUy5JVoKICQo7zZkBEQ==</DQ><InverseQ>Xhn+9dXsK07s51n6SyRs3wRJEPwuIaNDq5EQJUQNb2Gbdb4HgdpM2w==_
</InverseQ><D>JhKALeTVO1zaeZnfL18tpx11b1PgwWOIX2ALjN/aDLuR6ySTPX/Q4I6zBOzVa/KB6VMNNk4abIKUvOp6MBNYIMRMK8veaIJxYrn+JAOShwE=</D></ RSAKeyValue>"
;

 

 

public void CapiXmlImportExport ()

{

RSA anaged rsa = new RSA anaged ();

rsa.FromXmlString (CapiXml384);

Assert.AreEqual (CapiXml384, rsa.ToXmlString (
true), "Capi-Xml384");

rsa.FromXmlString (CapiXml448);

Assert.AreEqual (CapiXml448, rsa.ToXmlString (
true), "Capi-Xml448");

rsa

.FromXmlString (CapiXml512);

Assert.AreEqual (CapiXml512, rsa.ToXmlString (true), "Capi-Xml512");

 

 

UYG.

Aşağıdaki uygulama metin şifreleme ve şifreleme parametrelerinin kullanımı hakkında olacak.

 

using System.Security.Cryptography;

class RSACSPSample

{

static void Main()

{

try

{

UnicodeEncoding ByteConverter = new UnicodeEncoding();

byte[] dataToEncrypt = ByteConverter.GetBytes("Data to Encrypt");

byte[] encryptedData;

byte[] decryptedData;

RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();

encryptedData = RSAEncrypt(dataToEncrypt, RSA.ExportParameters(false), false);

decryptedData = RSADecrypt(encryptedData, RSA.ExportParameters(true), false);

Console.WriteLine("Decrypted plaintext: {0}", ByteConverter.GetString(decryptedData));

}

catch (ArgumentNullException)

{

Console.WriteLine("Encryption failed.");

}

}

static public byte[] RSAEncrypt(byte[] DataToEncrypt, RSAParameters RSAKeyInfo, bool DoOAEPPadding)

{

try

{

RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();

RSA.ImportParameters(RSAKeyInfo);

return RSA.Encrypt(DataToEncrypt, DoOAEPPadding);

}

catch (CryptographicException e)

{

Console.WriteLine(e.Message);return null;

}

}

static public byte[] RSADecrypt(byte[] DataToDecrypt, RSAParameters RSAKeyInfo, bool DoOAEPPadding)

{

try

{

RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();

RSA.ImportParameters(RSAKeyInfo);

return RSA.Decrypt(DataToDecrypt, DoOAEPPadding);

}

catch (CryptographicException e)

{

Console.WriteLine(e.ToString());return null;

}

}

}  

 
SON SÖZ
Gerçekten güzel ve özel bir algoritma olduğu için teorisinin çok üstünde durarak anlattım.

AES algoritması içerisinde birçok varyasyonu getiren bir algoritmadır.Algoritma bir nevi en uygun sürüm bulunması için AES algoritması üzerinden farklı algoritmalar çıkarıldı.En iyi seçilen 5 algoritma tekrar elendi ve en iyi AES algoritması Rijndael algoritması oldu.Uygulaması ile beraber Rijndael makalemi önümüzdeki zamanlar içerisinde yazacağım…. 

Mutlu kalın,Güvenle kalın .…..