S
|St_AnGeR|
Guest
.netFramework modern şifreleme biliminde genel kabul görmüş tüm şifreleme yöntemleri için hazır abstract ve bu abstract class ları implement eden somut (concrete) classlar içerir. Asbtract class ların inheritance yolu ile alınmasından yeni ve değişik classlar da hazırlanabilir.
Bu classların tamamı System.Security.Cryptography namespace i altındadır.
.net içerisinde temelde bütün bu şifreleme işlemlerini gerçekleştirmek için iki tane temel sınıf oluşturulmuştur.
System.Security.Cryptography.SymmetricAlgorithm ve
System.Security.Cryptography.AsymmetricAlgorithm
Simetrik algoritmalar ve kullanım yerleri
Simetrik algoritmalar (yada secret-key algoritmaları) genelde block ciphers (blok şifreleyiciler) olarak adlandırılırlar. Kullanılan simetrik algoritmalar büyük miktardaki verilerin (.txt, .jpg, mp3, mpeg, avi, iso vb.) şifrelenmesinde kullanılır. Bu kullanım için hazırlanmış classlar vardır.
DESCryptoServiceProvider
RC2CryptoServiceProvider
RijndaelManaged
TripleDESCryptoServiceProvider
Belirtilen 4 adet class simetrik key algoritmasıyla çalışır. Bir tane gizli anahtar oluşturulur ve bu anahtara ek olarak da bir IV (Initialization Vector) değeri oluşturulur. Ve bu iki değere göre veri bloklar halinde şifrelenir. Örneğin 100 byte lık blok lar halinde. Gizli anahtarın dışında IV değerine ihtiyaç şu sebebten ötürü duyulmaktadır. Şifrelenmesi istenen yazı bloğu içerisinde aynı cümleler yada kelimeler bulunabilir. Eğer direk olarak veri şifrelenirse aynı kelime veya cümleler aynı şekilde şifrelenecektir ve şifrelenmiş metin içerisinde aynı görünecektir. Bu aynı görünmeyi (ve buna ait şifre çözmeyi zorlaştırmak için) IV değeri kullanılır. Bu değer ikinci aynı veriyi, birinci veriyi kullanarak şifrelemek ve sonuçta aynı değerler yada kelimeler için farklı şifrelenmiş biçimler oluşturmak amacı ile kullanılır. Böylece şifre çözme zorlaştırılmış olur.
Burada belirtilen örneklerden bazıları .netFramework SDK v1.1 den alınmış ve üzerlerinde küçük değişiklikler yapılmıştır. Diğer örneklerde baştan yazılmıştır. Örnekler dikkatle incelendiğinde her şifreleme işleminin sonucunun farklı çıktığı gözlenir. Her değişik çalıştırmada oluşturulan secret-key ve IV değerleri farklıdır. Her class a ait constructor çalıştırıldığında .netframework bu class lara ait secret-key ve IV değerlerini yeniden oluşturur. Oluşturulmuş bir secret-key ve IV değerini daha sonra şifreli metin çözme için saklayabilir ve bu değerleri Key ve IV property lerine aktarıp şifrelenmiş dosyaları eski haline getirebilirsiniz. Bu tip örnekleri siz oluşturun.
DESCryptoServiceProvider (DES – Data Encryption Standart)
8 byte secret key ve IV değeri kullanır. Örnek.
/*
* DES
* DesCrypto.cs
* 21.04.2004
*
*/
using System;
//Added namespaces
using System.IO ;
using System.Security.Cryptography ;
namespace DesCrypt
{
class DesCrypto
{
public static DES des ;
[STAThread]
static void Main(string[] args)
{
des = new DESCryptoServiceProvider();
des.GenerateKey() ;
des.GenerateIV() ;
byte[] desKey = des.Key ;
byte[] desIV = des.IV ;
Console.WriteLine("Des.Key : ") ;
for(int i = 0; i < des.Key.Length; i++)
{
Console.WriteLine(des.Key.ToString()) ;
}
Console.WriteLine("\nDes.IV : ") ;
for(int i = 0; i < des.Key.Length; i++)
{
Console.WriteLine(des.Key.ToString()) ;
}
EncryptData("1.jpg", "Encrypted.jpg", desKey, desIV) ;
DecryptData("Encrypted.jpg", "Decrypted.jpg", desKey, desIV) ;
Console.WriteLine() ;
}
private static void EncryptData(String inName, String outName,
byte[] desKey, byte[] desIV)
{
//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[10000];//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.
CryptoStream encStream = new CryptoStream(fout, des.CreateEncryptor(desKey, desIV), CryptoStreamMode.Write);
Console.Write("\nEncrypting...");
//Read from the input file, then encrypt and write to the output file.
while(rdlen < totlen)
{
len = fin.Read(bin, 0, 10000);
encStream.Write(bin, 0, len);
rdlen = rdlen + len;
Console.Write(".");
}//While
encStream.Close();
fout.Close();
fin.Close();
}//EncryptData
private static void DecryptData(String inName, String outName,
byte[] desKey, byte[] desIV)
{
//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[10000];//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.
CryptoStream encStream = new CryptoStream(fout, des.CreateDecryptor(desKey, desIV), CryptoStreamMode.Write);
Console.Write("\nDecrypting...");
//Read from the input file, then encrypt and write to the output file.
while(rdlen < totlen)
{
len = fin.Read(bin, 0, 10000);
encStream.Write(bin, 0, len);
rdlen = rdlen + len;
Console.Write(".");
}//While
encStream.Close();
fout.Close();
fin.Close();
}//DecryptData
}
}
Bu classların tamamı System.Security.Cryptography namespace i altındadır.
.net içerisinde temelde bütün bu şifreleme işlemlerini gerçekleştirmek için iki tane temel sınıf oluşturulmuştur.
System.Security.Cryptography.SymmetricAlgorithm ve
System.Security.Cryptography.AsymmetricAlgorithm
Simetrik algoritmalar ve kullanım yerleri
Simetrik algoritmalar (yada secret-key algoritmaları) genelde block ciphers (blok şifreleyiciler) olarak adlandırılırlar. Kullanılan simetrik algoritmalar büyük miktardaki verilerin (.txt, .jpg, mp3, mpeg, avi, iso vb.) şifrelenmesinde kullanılır. Bu kullanım için hazırlanmış classlar vardır.
DESCryptoServiceProvider
RC2CryptoServiceProvider
RijndaelManaged
TripleDESCryptoServiceProvider
Belirtilen 4 adet class simetrik key algoritmasıyla çalışır. Bir tane gizli anahtar oluşturulur ve bu anahtara ek olarak da bir IV (Initialization Vector) değeri oluşturulur. Ve bu iki değere göre veri bloklar halinde şifrelenir. Örneğin 100 byte lık blok lar halinde. Gizli anahtarın dışında IV değerine ihtiyaç şu sebebten ötürü duyulmaktadır. Şifrelenmesi istenen yazı bloğu içerisinde aynı cümleler yada kelimeler bulunabilir. Eğer direk olarak veri şifrelenirse aynı kelime veya cümleler aynı şekilde şifrelenecektir ve şifrelenmiş metin içerisinde aynı görünecektir. Bu aynı görünmeyi (ve buna ait şifre çözmeyi zorlaştırmak için) IV değeri kullanılır. Bu değer ikinci aynı veriyi, birinci veriyi kullanarak şifrelemek ve sonuçta aynı değerler yada kelimeler için farklı şifrelenmiş biçimler oluşturmak amacı ile kullanılır. Böylece şifre çözme zorlaştırılmış olur.
Burada belirtilen örneklerden bazıları .netFramework SDK v1.1 den alınmış ve üzerlerinde küçük değişiklikler yapılmıştır. Diğer örneklerde baştan yazılmıştır. Örnekler dikkatle incelendiğinde her şifreleme işleminin sonucunun farklı çıktığı gözlenir. Her değişik çalıştırmada oluşturulan secret-key ve IV değerleri farklıdır. Her class a ait constructor çalıştırıldığında .netframework bu class lara ait secret-key ve IV değerlerini yeniden oluşturur. Oluşturulmuş bir secret-key ve IV değerini daha sonra şifreli metin çözme için saklayabilir ve bu değerleri Key ve IV property lerine aktarıp şifrelenmiş dosyaları eski haline getirebilirsiniz. Bu tip örnekleri siz oluşturun.
DESCryptoServiceProvider (DES – Data Encryption Standart)
8 byte secret key ve IV değeri kullanır. Örnek.
/*
* DES
* DesCrypto.cs
* 21.04.2004
*
*/
using System;
//Added namespaces
using System.IO ;
using System.Security.Cryptography ;
namespace DesCrypt
{
class DesCrypto
{
public static DES des ;
[STAThread]
static void Main(string[] args)
{
des = new DESCryptoServiceProvider();
des.GenerateKey() ;
des.GenerateIV() ;
byte[] desKey = des.Key ;
byte[] desIV = des.IV ;
Console.WriteLine("Des.Key : ") ;
for(int i = 0; i < des.Key.Length; i++)
{
Console.WriteLine(des.Key.ToString()) ;
}
Console.WriteLine("\nDes.IV : ") ;
for(int i = 0; i < des.Key.Length; i++)
{
Console.WriteLine(des.Key.ToString()) ;
}
EncryptData("1.jpg", "Encrypted.jpg", desKey, desIV) ;
DecryptData("Encrypted.jpg", "Decrypted.jpg", desKey, desIV) ;
Console.WriteLine() ;
}
private static void EncryptData(String inName, String outName,
byte[] desKey, byte[] desIV)
{
//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[10000];//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.
CryptoStream encStream = new CryptoStream(fout, des.CreateEncryptor(desKey, desIV), CryptoStreamMode.Write);
Console.Write("\nEncrypting...");
//Read from the input file, then encrypt and write to the output file.
while(rdlen < totlen)
{
len = fin.Read(bin, 0, 10000);
encStream.Write(bin, 0, len);
rdlen = rdlen + len;
Console.Write(".");
}//While
encStream.Close();
fout.Close();
fin.Close();
}//EncryptData
private static void DecryptData(String inName, String outName,
byte[] desKey, byte[] desIV)
{
//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[10000];//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.
CryptoStream encStream = new CryptoStream(fout, des.CreateDecryptor(desKey, desIV), CryptoStreamMode.Write);
Console.Write("\nDecrypting...");
//Read from the input file, then encrypt and write to the output file.
while(rdlen < totlen)
{
len = fin.Read(bin, 0, 10000);
encStream.Write(bin, 0, len);
rdlen = rdlen + len;
Console.Write(".");
}//While
encStream.Close();
fout.Close();
fin.Close();
}//DecryptData
}
}