29 Kasım 2008 Cumartesi

Windows Live Id ile Login Olma

Bu özet kullanılabilir değil. Yayını görüntülemek için lütfen burayı tıklayın.

22 Kasım 2008 Cumartesi

XNA’ de Oyuncu İsmini Input Olarak Alma

XNA klavyeden girdiğin her tuşu tutar. Bu tuşlara göre yerleştirdiğin nesneleri hareket ettirirsin ya da bir sonraki aşamaya geçersin,.. vs. Ancak ne zamanki ismini oyuna yazmak istediğinde bastığın tuşlardaki karakterler ekranda görünmez. XNA kütüphanesinin sağladığı bir textbox nesnesi yok. Bu nedenle oyunu oynayan kişi adını yazabilmesi için bizim bir takım kodları yazmamız gerekmektedir.

Bu makalede bu işlemlerin nasıl yapıldığı ve kullanıcının adını girmesi için uygulamaya eklenmesi gereken kodlar açıklanmaktadır.

1. Karakterleri Tutan Diziyi Tanımlama

Klavyeden girilen karakterler “Keys” adı verilen bir dizide tutulur. Bu diziden karakterlere “GetPressedKeys” mesajı ile ulaşabiliriz. Bu dizi içinde karakterler tutulurken özel bir tanımlama ile tutuluyor. Örneğin NumPad’ den girilen numaralardan “1” “NumPad1” olarak, klavyedeki numaralar başlarına “D” karakteri gelerek (“1” “D1” olarak tutulmaktadır. ) ve harfler aynı klavyedeki haliyle tutulmaktadır.

Bunun için iki boyutlu bir dizi tanımlanır. Dizinin adı “keyToCharacter” olsun. Bu dizi girilen karakterlerin kullanıcının anlayacağı türe çevrilmesi için kullanılır. Örneğin kullanıcı bir tuşa bastığında; bu karakteri ekrana basmak için girilen karakterin “Keys” tipinde tanımlı olan dizideki karşılığı bulunur. “NumPad1” ise bu karakter ekrana 1 olarak ekrana yazılacak olan tipi karakter katarı olarak tanımlanmış değişkene (“string”) eklenir.

Tanımlanması gereken dizi:

private string[,]keyToCharacter = {{"A", "a"},{"B", "b"}, {"C", "c"}, {"D", "d"}, {"E", "e"}, {"Space", " "},
{"F", "f"}, {"G", "g"}, {"H", "h"}, {"I", "i"}, {"J", "j"},
{"K", "k"}, {"L", "l"}, {"M", "m"}, {"N", "n"}, {"O", "o"},
{"P", "p"}, {"Q", "q"}, {"R", "r"}, {"S", "s"}, {"T", "t"},
{"U", "u"}, {"V", "v"}, {"W", "w"}, {"X", "x"}, {"Y", "y"},
{"Z", "z"},
{"NumPad1", "1"}, {"NumPad2", "2"},{"NumPad3", "3"},{"NumPad4", "4"},
{"NumPad5", "5"}, {"NumPad6", "6"},{"NumPad7", "7"},{"NumPad8", "8"},
{"NumPad9", "9"}, {"NumPad0", "0"},
{"D1", "1"}, {"D2", "2"}, {"D3", "3"}, {"D4", "4"}, {"D5", "5"},
{"D6", "6"}, {"D7", "7"}, {"D8", "8"}, {"D9", "9"}, {"D0", "0"}
};



2. “EkranaYazma” Sınıfı

Kullanıcını ekrana ismini girmesi için yapılan işlemleri gerçekleştiren kodları bir sınıfta toplarsak daha kullanışlı ve anlaşılır bir program yazmış oluruz. Bunun için bu programda tanımlanan sınıfın adı “EkranaIsimYazma” dır. Bu sınıfta 2 adet metot geçekleştirimi yapılmıştır ve gerekli alt alanlar tanımlanmıştır.

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using Microsoft.Xna.Framework.Net;
using Microsoft.Xna.Framework.Storage;

namespace EkranaOyuncuAdiniYazma
{
class EkranaIsimYazma
{
//tanımlanan alt alanlar
private string[,]keyToCharacter = {{"A", "a"},{"B", "b"},{"C", "c"}, {"D", "d"}, {"E", "e"}, {"Space", " "},
{"F", "f"}, {"G", "g"}, {"H", "h"}, {"I", "i"}, {"J", "j"},
{"K", "k"}, {"L", "l"}, {"M", "m"}, {"N", "n"}, {"O", "o"},
{"P", "p"}, {"Q", "q"}, {"R", "r"}, {"S", "s"}, {"T", "t"},
{"U", "u"}, {"V", "v"}, {"W", "w"}, {"X", "x"}, {"Y", "y"},
{"Z", "z"},
{"NumPad1", "1"}, {"NumPad2", "2"},{"NumPad3", "3"},{"NumPad4", "4"},
{"NumPad5", "5"}, {"NumPad6", "6"},{"NumPad7", "7"},{"NumPad8", "8"},
{"NumPad9", "9"}, {"NumPad0", "0"},
{"D1", "1"}, {"D2", "2"}, {"D3", "3"}, {"D4", "4"}, {"D5", "5"},
{"D6", "6"}, {"D7", "7"}, {"D8", "8"}, {"D9", "9"}, {"D0", "0"}
};

private Keys[] keyMap;
private KeyboardState keyboardState, lastKeyboardState;
private const int maxNameLength = 15;
private const int characterNum = 47;
private string userName = "player 1";



“maxNameLength” kullanıcının gireceği adın maksimum kaç karakterde olacağını, “userName” kullanıcı adını, "keyMap" kalvyeden basılan karakterlerin tümünü, “characterNum” dizide tanımlanan karakter sayısını tutmaktadır.

“CharacterDelete” metodu:

Bu metot kullanıcının isim girerken yanlış ya da istemediği bir karakter girdiğinde bu karakter veya karakterlerin silme işlemini gerçekleştirmek için yazılmıştır. Bu metot her “back space” tuşuna basıldığında çağrılır.

Metot gerçekleştirimie baktığımızda önce şu anki tuş durumunu anlamamız için “keyboardState” adlı değişkene basılan tuşu aktaran metottan dönene değer atılır. Ardından “keyboardState” nesnesine “IsKeyDown” mesajını “Keys.Back” argümanını vererek göndeririz. Böylece “backspace” tuşunu elde tutmuş oluruz eğer basıldıysa. Bu ifadenin bulunduğu kontrole bir de kullanıcı adının 0’dan büyük olması koşulunu ekleriz.

Koşullar sağlandığında girilen kullanıcı adının sonundaki karakter silinir. Bu işlem için kullanılan metot string işlemlerde kullanılan “SubString” metodudur.

public string CharacterDelete()
{
keyboardState = Keyboard.GetState();

if (keyboardState.IsKeyDown(Keys.Back) && lastKeyboardState.IsKeyUp(Keys.Back) && userName.Length > 0)
{
userName = userName.Substring(0, userName.Length - 1);
}

return userName;
}//end of void CharacterDelete


“CharacterDisplay” metodu:

Kullanıcının klavyeden girdiği karakterleri kullanıcı adını içeren değişkene eklenmesini sağlayan metottur. Bunun için basılan tüm karakterler “keyMap” adlı diziye atılır. Ardından foreach döngüdü sayesinde bu karakterler tek tek kontrol edilir, bu kontrol işleminin gerçekleştirimi nasıl yapılıyor?

Programda en başta belirtilen karakterleri içeren “keyToCharacter” dizisindeki karakterlerle girilen karakterler karşılaştırılır ve bu dizi içinde yer alan karakterler kullanıcı adını tutan “userName” karakter katarına (“string”) eklenir.

Public string CharcterDisplay()
{
keyMap = (Keys[])keyboardState.GetPressedKeys();
foreach (Keys key in keyMap)
{
for (int i = characterNum-1; i >=0; i--)
{
if (key.ToString() == keyToCharacter[i, 0] && lastKeyboardState.IsKeyUp(key))
{
userName += keyToCharacter[i, 1];
break;
}//end of inner if condition
}//end of for loop
}//end of foreach loop
lastKeyboardState = keyboardState;
return userName;
}//end of void CharcterDisplay
“keyboardState” değişkenini “lastKeyboardState” içine atmamız daha önceden bir karaktere basılıp basılmadığını kontrol etmemizi sağlar. XNA’ de FPS (saniyede kaç kere ekrana yazdırdırdığın) kavramı çok önemlidir.. Eğer bu satırı silersek “backspace” tuşuna bir kere bastığımızda birden fazla karakter silinir. Klavyeden bir karakter girdiğimizde ise aynı karakter birden fazla yazılır. FPS kavramı bu nedenle önemlidir. Bu nedenle son basılna karakterle ilk karakter aynı ise bu işlem bir kere yapılır, son karakterle ilkinin aynı olma olasılığını kontrol etmezsek bir kere bastığımızda bire karakter saniyedeki karakter yazma miktarı ne akdarsa ekrana o kadar yazılır (4 FPS ise saniyede 4 kere ekrana yazılır).

3. “Game1.cs” Sınıfı İçinde Yapılan Değişiklikler

Texture2D backgroundTexture;
Rectangle viewportRect;
EkranaIsimYazma ekranaYazmaObj;
string userName;

Sade bir ekrana yazı yazmaktansda bir arka plana yazı yazmak daha gösterişli olabilir. Zaten bu uygulamayı oyunlarımızda kullandığımızda bir resim üzerine yazacağız. İki boyutlu bir arka plan resmi eklemek için bu resim bilgilerini tutan “backgroundTexture” isimli değişkeni ve bu resmin başlangıç koordinatlarını tutacak olan “viewportRect” nesnesini tanımlarız.

Ardından bu tanımlamalara ekrana isim yazmamış için gerekli olan değişkenleri ekleriz. Bunlardan biri “EkranaIsim Yazma” sınıfındaki mesajları göndereceğimiz “ekranaYazmaObj” nesnesidir. Diğer değişken ise geri mesaj sonunda geri döndürülen kullanıcı adını tutması için tanımlanmış olan “userName” değişkenidir.

Ardından “LoadContent” metodu içine:
backgroundTexture =Content.Load("Sprites\\background");
Arial = Content.Load("Fonts/Arial");
ekranaYazmaObj = new EkranaIsimYazma();
//drawable area of the game screen.
viewportRect = new Rectangle(0, 0,
graphics.GraphicsDevice.Viewport.Width, graphics.GraphicsDevice.Viewport.Height);
Yukarıdaki kod satırlarının yazılması gerekir ki oyun sırasında bir kere çağrılacak olan bu metotla birlikte gerekli yüklemeler ilgili nesnelere yapılsın.

Arial = Content.Load("Fonts/Arial");

Bu kod satırı sayesinde ekranda belirlenecek olan kullanıcı adının hangi yazı tipinde olacağı belirtilir. Bunun için yapmamız gereken bir işlem ise “Solution” daki “Content” e sağ tıklayıp Fonts adında bir klasör eklemek , ardından bu klasöre yine sağ tıklatıp “Add new Item” seçeneğini seçtikten sonra “Sprite Font” a tıklayıp “Arial.spritefont” html’ ini projeye eklemektir.

“Update” metodu içine yazılması gerekenler programda birden çok kez yapılan olan işlemlerdir. Kullanıcını karakter girmesi ya da bir karakteri silmesi birden fazla kez yapılancak olan işlemlerdir. Bu nedenle bu mesajları ilgili nesneye verdiğimiz uygun yer bu metodun içidir. Yazılacak satırlar:

userName = ekranaYazmaObj.CharacterDelete();
userName = ekranaYazmaObj.CharcterDisplay();

Sıra geldi ismin ekrana çizilmesine. Çizilmek eyleminim kullandım, çünkü bir resim üzerine işlem yapıyoruz.

Ekrana resmi bastırmayı sağlayan metot “Draw” metodudur. Bu metot içinde önce resmi ekleriz ardında bu resmin üzerine kullanıcın girmiş olduğu ismi ekleriz.

spriteBatch.Begin(SpriteBlendMode.AlphaBlend);
//Draw the backgroundTexture sized to the width
//and height of the screen.
spriteBatch.Draw(backgroundTexture, viewportRect, Color.White);
//ikinci sekli de dogru arka plani ekrana bastirmada
//aşagidaki satirda kullanilabilir
//spriteBatch.Draw(backgroundTexture, new Vector2(0, 0), Color.White);
spriteBatch.DrawString(Arial, "Your Name: " + userName + "<", new Vector2(100, 100), Color.White); spriteBatch.End();


3 Ekim 2008 Cuma

Imagine Cup 2009

Imagine Cup 2009 finalleri bu yıl Mısır' da yapılıyor. Herkesin hayalinde Mısır' a gitmek vardır herhalde ve bu yılki teması önceki yıllara göre daha geniş. Bu da aklımızı sonuna kadar zorlamamızı sağlayacak. İşte şu olsaydı bunu yapardım olayından çok artık bunları bunları yapabilirim fikri egemen oluyor. Biz gençlerden Dünyayı değiştirecek bir fikir bulmamız isteniyor. "Dünyanın en zorlu problemlerini teknoloji sayesinde çözdüğünüz bir dünya düşleyin!" Evet yarışmanın teması bu.

Imagine Cup'ta hepimizin ilgi alanlarından en az birini içeren 9 kategori var:

  • Yazılım tasarımı
  • Gömülü Devre Geliştirme
  • Oyun Geliştirme
  • Mash up
  • IT
  • Robotics ve Algoritma
  • Fotoğraf
  • Kısa Film
  • Tasarım

Mash up diğerlerine göre daha yeni bir kategori. Mash up' ın anlamı Dj'lerin farklı şarkıları karıştırıp yeni bir şarkı yapmasıdır. Oyun geliştirmede XNA az kodla ne kadar çok iş yapıldığını gösteriyor. Hem keyif alarak oynuyoruz hem de sosyal bir mesaj veriyoruz. Robotics' te Dünya finalinde gerçek robotları yönetebilme şansı. Gömülü sistem geliştirmede yarı finalist olanlara eBox 2300 ile projeyi gerçekleme fırsatı.

Genciz, yetenekliyiz, aklımızda gerçekleştirmeyi planladığımız projeler var. Dünya böyle olsa değişir diyoruz. Eee o halde neden bir köşede oturup birgün keşfedilmeyi bekliyoruz. Biz zaten kendimizi keşfetmedik mi? Yazdığımız bir programla, hazırladığımız bir tasarımla, çektiğimiz bir fotoğraf karesiyle, kaydettiğimiz bir an ile ve nice teknoloji nimetleriyle isteklerimizi anlatabiliriz.

Microsoft ayrıca yarışmaya kaydolan her öğrenciye yazılımlarını ücretsiz indirebileceği DreamSpark üyeliği sağlıyor. Böylece kaliteli işler çıkarmak için herşey elimizin altında oluyor.

Yok artık olmaz demeyin denemeden hiç bir sonuca varamayız. O halde hep beraber Dünyayı Değiştirelim ve şu sözü hatırlayalım O Benim Dünyaaammm!!!


9 Ekim 2008' de Dokuz Eylül Üniversitesi Tınaztepe Kampüsü' ndeki Dekanlık konferans salonunda İmagine Cup lansmanı düzenlenecektir. Lansmandaki katılım formunu dolduran herkese DreamSpark' a giriş yapmalarını sağlayacak key dağıtılacaktır. Herkesi beklerizzzz :)

**Kayıt için bu linki tıklamanız ve formu doldurmanız yeterli.

7 Ağustos 2008 Perşembe

TEK ANAHTARLI YENİ BİR ŞİFRELEME ALGORİTMASI DAHA


ÖZET

Simetrik algoritmalar karakter tabanlı ve bit tabanlı sistemler olmak üzere iki bölümde incelenir. Açıklanan şifreleme algoritması bit tabanlı şifreleme algoritmalarını baz alarak gerçekleştirilmiştir. Bu makalede, öncelikle bit tabanlı algoritmalar hakkında bilgi verilmiştir ve bu kategoriye giren algoritmalardan örnekler sunulmuştur. Bu anlatımın takibinde projede kullanılan algoritma hakkında detaylı açıklamaya yer verilmiştir. Simetrik anahtar kullanılan bu algoritmada aynı anahtar ile şifreleme ve şifre çözümü yapılabilmektedir. Algoritma Feistel yapısı üzerine geliştirilmiştir, kullanılan teknikler arasında XOR operatörü ile şifreleme, S-box, E-box ve bitlerle ilgili işlemlerde kullanılan çeşitli operatörler bulunmaktadır. Algoritmanın başarılı çalıştığı örneklerle ispatlanmıştır ve bu örneklerden bir tanesi makalede sunulmuştur.

Anahtar Kelimeler: Simetrik şifreleme algoritması, şifreleme algoritması, bit tabanlı şifreleme.


YET ANOTHER ONE-KEY ENCYRPTION ALGORITHM

ABSTRACT

Symmetric algorithms is examined in two groups character wise systems and bit wise systems. Clarified encryption algorithm is implemented base on bit wise encryption algorithms. In this article, firstly some explanations are given about bit wise algorithms, and some examples are given about the algorithms in this category. Following the algorithm used in project is expounded in details. Via the same key encryption and decryption can be done in this algorithm that uses symmetric key. Algorithm is improved on Feistel structure, some of used techniques are encryption with XOR operator, substitution box, expansion box, and some operators used for bit operations. It is proved that, algorithm works successfully with examples and one of these algorithms is presented in this article.

Keywords: Symmetric encryption algorithm, encryption algorithm, bit wise encryption.


1. GİRİŞ
Şifreleme bir mesajın gizliliğini sağlamak için kullanılan bir yöntemdir. Şifreleme çeşitlerinden biri olan simetrik şifrelemede ise amaç gönderici ile alıcının ortak bir anahtar üzerinde ve ortak bir şifreleme ile deşifreleme algoritması üzerinde anlaşıp, mesajı diğer kişilerden korumaktır.

Simetrik şifrelemede beş bileşen bulunmaktadır. Bu bileşenler ve şifreleme işleminin nasıl yapıldığı Şekil 1’de gösterilmektedir.

Simetrik şifrelemede güvenliği sağlayan anahtardır. Çünkü gizli olan tek şey anahtardır, şifreleme ve deşifreleme algoritmaları herkese açıktır. Farklı anahtarlar sayesinde aynı mesaj ve aynı algoritma ile birbirinden bağımsız şifreli metinler üretilebilir.

Simetrik şifreleme yöntemleri metin üzerindeki işlemlerine göre iki grup altında sınıflandırılabilir. Bunlardan biri karakter tabanlı yani geleneksel şifreleme sistemleri (Monoalfabetik ve polialfabetik) ve diğeri ise bit tabanlı şifreleme yani modern şifreleme sistemleridir.

Bit tabanlı şifreleme sistemlerine örnek olarak DES, TWOFISH, IRON ve AES verilebilir.

a.) DES (Data Encryption Standard) : Dünyada en yaygın kullanılan şifreleme algoritmalarından birisidir. DES, IBM tarafından geliştirilmiştir. 1975 yılında “Federal Register” tarafından yayınlanmıştır. DES 64 bitlik veriyi 56 bitlik anahtar kullanarak şifreler [2]. Ayrıca klasik Feistel Ağı kullanılarak [3] temelde şifreleme işleminin deşifreleme işlemiyle aynı olması sağlanmıştır. Kullanılan teknikler yayılma ve karıştırmadır. DES’in en büyük dezavantajı anahtar uzunluğunun 56 bit olmasıdır. 1975 yılında yayınlanan bu algoritma günümüzde geliştirilen modern bilgisayarlar tarafından yapılan saldırılar karşısında yetersiz kalmaktadır. Daha güvenli şifreleme ihtiyacından dolayı DES, Triple-DES olarak geliştirilmiştir. Triple-DES algoritması geriye uyumluluğu da desteklemek amacıyla 2 adet 56 bitlik anahtar kullanır. Triple-DES algoritması, DES algoritmasının şifreleme, deşifreleme, şifreleme şeklinde uygulanmasıdır.

b.) TWOFISH : 1998 yılında yayınlanan bu algoritma Bruce Schneier - John Kelsey - Doug Whiting - David Wagner - Chris Hall - Niels Ferguson tarafından yaratılmış ve analiz edilmiştir [4]. AES finalistlerinden biridir ve AES kadar hızlıdır. Aynı DES gibi Feistel yapısını kullanır. DES’den farklarından biri anahtar kullanılarak yaratılan değişken S-box (Substitution box – Değiştirme kutuları)’lara sahip olmasıdır. Ayrıca 128 bitlik düz metni 32 bitlik parçalara ayırarak işlemlerin çoğunu 32 bitlik değerler üzerinde gerçekleştirir. AES’den farklı olarak eklenen 2 adet 1 bitlik rotasyon, şifreleme ve deşifreleme algoritmalarını birbirinden farklı yapmış, bu ise uygulama maliyetini arttırmış, aynı zamanda yazılım uygulamalarını %5 yavaşlatmıştır [5].

c.) IRON : Diğer iki algoritma gibi Feistel yapısını kullanır. IRON, 64 bitlik veri bloklarını 128 bitlik anahtarla şifrelemede kullanılır. Döngü (round) sayısı 16 ile 32 arasındadır. Alt anahtarlar döngü sayısına bağlıdır. Alt anahtarların sayısı döngü sayısına eşittir. Bu nedenden dolayı algoritma anahtar bağımlıdır. IRON algoritmasının var olan algoritmalardan farkı da budur. Bu algoritmanın avantajı bitler yerine 16-tabanındaki sayılar kullanmasıdır, dezavantajı ise yazılım için tasarlanmış olmasıdır [6].

d.) AES (The Advanced Encryption Standard) : AES, John Daemen ve Vincent Rijmen tarafından Rijndael adıyla geliştirilmiş ve 2002 yılında standart haline gelmiştir. AES uzunluğu 128 bitte sabit olan blok ile uzunluğu 128, 192 ya da 256 bit olan anahtar kullanır. Kullanılan tekniklerden bazıları baytların yer değiştirmesi, 4x4’ lük matrisler üzerine yayılmış metin parçalarının satırlarına uygulanan kaydırma işlemleridir. 2006 yılı itibariyle en popüler simetrik algoritmalardan biridir [7].

Makalenin devamında projede kullanılan algoritmadan, bu algoritmanın avantajlarından ve kısıtlamalarından söz edilmektedir. Ek olarak algoritmanın geliştirilmesi için neler yapılabilir konusu ele alınmıştır.

2. ALGORİTMANIN DETAYLARI

2.1 ) Şifreleme Algoritması

Şekil 2’de belirtilen şifreleme algoritmasında kullanıcıdan şifrelenmesi istenen bir düz metin ve anahtar girmesi beklenmektedir. Anahtar uzunluğu sabit olmakla beraber 64 bittir. Yani 8 karakter uzunluğuna denk gelmektedir. Anahtar herhangi bir sayı, alfabede yer alan harfler ya da özel karakterler olabilir. Türkçe karakterler içerisinde bulunan ş,ğ,ö,ç,ü gibi harfler girildiğinde ise bu karakterler s,g,o,c,u harfleriyle yer değiştiriliyor. Temel şifreleme işlemi Şekil 2’de belirtilmiştir. Kullanılan yapı Feistel’dir.

Anahtar uzunluğu 64 bitten kısa girildiğinde kullanıcıya 64 bitten daha kısa uzunlukta anahtar girmemesini söyleyen bir hata mesajı gönderiliyor. Eğer anahtar uzunluğu 64 bitten büyük girilirse ilk 64 biti alınıp geri kalan kısmı önemsenmiyor.

Alt anahtarlar 64 bitlik anahtar kullanılarak üretiliyor. Alt anahtarların sayısı 16 ve her biri 48 bitten oluşmakta. Anahtar boyutları DES algoritmasıyla aynı ancak alt anahtarları üretmede kullanılan işlemler farklı [Bkz.Şekil2].

Şifrelenecek metnin uzunluğu kullanıcının isteğiyle değişiklik gösteriyor. Sadece bir karakter olabileceği gibi çok uzun bir metin de olabilir. Ancak şifreleme algoritmasında bloklar halinde şifreleme tekniği kullanıldığından metin 64 bitlik bloklara bölünüyor.

Kullanıcının girdiği metindeki karakter sayısı 8’ e bölünebilen bir sayı değilse metne boşluklar eklenerek 8’in katı olması sağlanıyor. Bu işlemlerden sonra Anahtarlari_uret fonksiyonu çağrılıyor.

Anahtarlari_uret Fonksiyonu :

“Anahtarlari_uret” fonksiyonunun akış diyagramı Şekil 3’te verilmiştir.

Bu fonksiyonda karakter katarı (string) olarak okunan anahtardaki herbir karakterin ASCII karşılığı alınıyor ve elemanları bayt olan bir diziye konuluyor. Daha sonra bu dizideki elemanların indeksleri “karakterleri_karistir” fonksiyonu ile değiştiriliyor. Bu fonksiyonda dizideki her elemanın toplamı bir değişkene atılır.Bu işlemden sonra elde edilen değişkenin 127’ ye göre modu alınır. En son elde edilen değerler dizideki elemanların yerlerini kaydırmak için kullanılır.

Bu dizi fonksiyondan geri döndürüldükten sonra sahneye çıkma sırası ise Anahtarlar_uretiliyor fonksiyonundadır.

Anahtarlar_uretiliyor Fonksiyonu:

Şekil 4’te gösterilen her iki blok da 4 kez tekrar etmektedir.
Bu blokların işlenmesinden sonra anahtar_ascii dizisindeki her sayı tek tek bitlerine ayrılır. 1 sayıdan 8 tane bit elde edilir ve bu bitler bir dizide toplanır. Toplam 64 tane bit elde edilir. Artık 8 elemanlı dizi, 64 elemanlı başka bir bayt dizisine dönüştürülmüş oldu. Bu işlem yer kaybına neden olur ama bitler üzerinde işlem kolaylığı sağlaması açısından yararlıdır [Bkz. Şekil4].

Bu fonksiyonda Şekil 5’te belirtilen 4 tane alt fonksiyon çağrılmaktadır:

Bu fonksiyonlardan bir tanesi anahtara ait olan 64 bitin bnrstr dizisindeki yerini karıştırmak için kullanılmaktadır. Fonksiyonun çalışması modüler aritmetik üzerine kuruludur. Eğer indeksin modu 2’ ye göre 0’a eşitse bu indeksteki değer cift_indeksteki_bitler_sol_tarafa dizisine, 1’se tek_indeksteki_bitler_sag_tarafa dizisine atanır. Daha sonra cift_indeksteki_bitler_sol_tarafa dizisindeki elemanlar ile tek_indeksteki_bitler_sag_tarafa dizisindeki elemanlar sırayla OR operatörü yardımıyla bit tabanlı bir işleme tabi tutulur ve her işlemin sonucunda oluşan yeni değer bnrstr dizisine atanır. 32 defa devam eden bu atamadan sonra, tek_indeksteki_bitler_sag_tarafa dizisindeki elemanların değili ile cift_indeksteki_bitler_sol_tarafa dizisindeki elemanların değilleri sırasıyla OR operatörü ile işlenir ve bu 32 değer bnrstr dizisinin kalan 32 elemanlık yerini doldurur.

Anahtari_56ya_Dusur fonksiyonunda 64 bitlik anahtar uzunluğu permutation choice tekniği ile 56 bite düşürülür. Şekil 6’daki kod 56 kez bir döngü içinde tekrarlandığında hedefe ulaşılır [Bkz.Şekil6].

Bu fonksiyondan sonra Şekil 7’de belirtilen Anahtari_48e_Dusur fonksiyonu 56 bite düşen anahtarı 48 bite azaltmak için kullanılır. Fakat bu fonksiyon içinde başka bir fonksiyon daha çağrılır. Çağrılan fonksiyonun amacı anahtardaki karmaşıklığı arttırıp, olabilecek ataklara karşı güvenliği sağlamaktır [Bkz.Şekil7].

Anahtari_32_yap_48e_Cikar fonksiyonu anahtarı 48 bitten 32 bite azaltmak için S-box adı verilen yapıyı kullanır. Bu yapı sayesinde rastgele üretilmiş sayılardan oluşan bir tablodan geçen her 6 bit 4 bit olarak çıkar (Bu algoritmada ise 6 dizi elemanı geliyor ve bu 6 taneden herhangi 4’ ü olarak çıkıyor.). Toplam 8 adet S-box kullanılmıştır. Bu fonksiyonun sonunda ise “expansion box” tekniği ile 32 bitlik anahtar 48 bite arttırılır.

“Expansion Box” Tekniği : Bazı bitler rastgele olarak tekrarlanır.

Anahtari_48e_Dusur fonksiyonunu Anahtari_Shift_et fonksiyonu takip etmektedir. Bu fonksiyonda 16 adet alt anahtar üretilmektedir. Bir sonraki anahtar bir önceki anahtarın bitlerinin 1 kez sola kaydırılmasıyla üretilmiştir. Bu nedenle her anahtar bir öncekine bağlıdır. Bir bit değiştirildiğinde bir çok anahtar üretilmektedir. Terminolojide bu olaya avalans etkisi denilmektedir.

SIFRELEME_FONKSIYONU Fonksiyonu :

Bu fonksiyonda (Şekil 8) öncelikle kullanıcıdan alınan düz metnin ilk 8 karakteri alınır ve Karakterleri_karistir_text fonksiyonunda her karakter ASCII değerine çevrilir ve bir dizide saklanır. Daha sonra bu dizinin elemanları anahtar dizisinin ASCII değerlerini toplayarak elemanlarını kaydırma algoritmasının nerdeyse aynısı olan bir algoritma ile yer değiştirir.

Daha sonra dizideki her eleman bitlerine ayrılır ve toplam 64 bit elde edilip bir dizi içinde saklanır. Bu 64 elemanlı dizi sol ve sağ blok olmak üzere iki parçaya ayrılır, ve artık sahnenin sahibi Feistel yapısıdır.

Li = Ri–1
Ri = Li–1 xor F(Ri–1, Ki)

16 kez döngü uygulanır ve bu 16 döngü sonunda elde edilen iki dizinin Feistel yapısındaki çaprazlaması sonucu şifreli metnin ilk bloğu oluşur. Şekil 8’de bu işlem akış diyagramı ile anlatılmıştır [Bkz. Şekil9]:

R16 ve L16 şifreli metni oluşturan parçalardır. Feistel yapısı kullanıldığı için şifrenin çözümü anahtarı bilen kişi olan alıcı için çok kolaydır, anahtarı bilmeyen kişi olan saldırgan (opponent) için ise oldukça zordur.

2.2 ) Deşifreleme Algoritması

Şifreyi çözmek için öncelikle şifreli metnin ilk 64 bitlik bloğundan başlanır. Bu bloğun şifresi çözüldükten sonra eğer varsa diğer 64 bitlik blok deşifre edilir. Bu işlem şifreli metnin sonuna kadar devam eder.
Şifreyi çözmede kullanılan fonksiyonda şifreli metin bloğu bitlerine ayrılır. Bu bitlerden ilk 32 si L0 parçasını, geri kalan 32 bit ise R0 parçasını oluşturur. Şifreleme algoritmasında anahtarları üretmek için kullanılan fonksiyonun aynısı deşifrelemede anahtarları tekrar üretmek için kullanılır. Aynı anahtardan 16 tane alt anahtar üretilir. Feistel yapısı kullanıldığından şifreyi çözmek için anahtarları fonksiyona tersten veririz (16. anahtardan başlanıp 1.anahtara doğru) .

Şekil 9’daki akış diyagramı şifrelemedekine çok benzer, tek farklılık anahtarların tersten verilmesidir [Bkz. Şekil10]:

En son aşamaya gelindiğinde yapılması gereken, şifrelerken karıştırılan dizideki karakterleri eski yerlerine geri koymaktır. Çünkü karakterleri karıştırılan dizi alt anahtarlarla şifreleme işlemine tabi tutulmuştur. Deşifrelemede tersten gidileceği için elimizdeki dizinin karakterlerindeki karışıklığı düzeltmemiz gerekmektedir.

Bu işlemde yapılması gereken toplama işleminin tersi olan çıkarma işlemini kullanmaktır (1). Detaylı açıklamak gerekirse; şifrelerken örneğin 3. indekste bulunan elemanın indeksine 2 ekleyerek 5. indekste yer alması sağlanır, deşifre ederken de 5. indeksteki elemanın indeksinden 2 çıkarttıldığında 3.indeks yani olması gereken indeks bulunur. Bunun için kullanılan kod satırı aşağıda verilmiştir:

degisen_karistirilan_karakter_dizisi[i]=karistirilan_karakter_dizisi[(i-shift_etme_miktari+64) % 64] (1)

Elimizde artık düz metne ait olan bitler bulunmaktadır. Bu bitleri bir araya getirip topladığımızda düz metne ait karakterlerin ASCII karşılıklarını buluruz. Artık bu aşamadan sonra blokların birleştirilmesiyle düz metne ulaşılmış olunur.

3. ALGORİTMANIN AVANTAJLARI

Avalans etkisi ve anahtar uzunluğu bu algoritmanın güçlü parçalarıdır. Çünkü anahtarı bulmak için yapılan saldırılarda anahtarın bir bitindeki değişiklik bir değil birden fazla farklı anahtarların oluşmasına neden olur. Anahtar uzunluğundan dolayı Kaba Kuvvet (Brute Force) saldırısıyla anahtarın bulunması çok zordur.

4. ALGORİTMADAKİ KISITLAMALAR

Algoritmadaki ilk kısıtlama anahtar uzunluğunun sabit olmasıdır. Değişen uzunlukta anahtar kullanılamamaktadır. Diğer kısıtlama ise döngü sayısının sabit olmasıdır. Eğer döngü sayısı anahtar uzunluğuna bağlı olsaydı ve anahtar uzunluğu da değişebiliyor olsaydı, algoritma saldırılara karşı daha dirençli olurdu. Ayrıca donanım için tasarlanmadığından, donanıma uyum göstermeyebilir. Çalışma hızı, modüler aritmetik ve bit kaydırma işlemlerinden dolayı yavaşlamaktadır.

5. ÖRNEK UYGULAMA

Düz Metin: Kriptoloji şifreleme ve deşifreleme işlemlerini kapsayan bir bilimdir ve diğer bilimlerde olduğu gibi bu biliminde bir tarihi vardır.

Anahtar: Simetrik şifreleme bir mesajın gizliliğini sağlamak için kullanılan bir şifreleme türüdür.

Şifrelenmiş-Metin: 25F221670F1FEC9C5DD9DD1B0E16EF0389DB391A524AF1C9D019568830E98A6C7B1C069A62BE11AD810A01AEC139168AC82AA81F468A1108DD22099E8650E7DB5C5CDADACF96FC46F9131DC7D518268ED21F008536E5CB76D91AA31AE6BE3728F1472C82DD582682DB484A5E09C4BF85DD0213B014506FD52CDA8CBF33CAB039940955DA74EDD57B

De-şifre Edilmiş Metin: Kriptoloji sifreleme ve de-sifreleme islemlerini kapsayan bir bilimdir ve diger bilimlerde oldugu gibi bu biliminde bir tarihi vardir.

(ASCII kodlamadaki kısıtlamalardan dolayı düz metin hexadecimal formda gösterilmiştir).

6. SONUÇ

Algoritma daha önceden var olan şifreleme algoritmalarındaki tekniklerin üzerine yeni teknikler ekleyerek ve bu tekniklerin uygulama yerlerinin değiştirilmesiyle oluşturulmuştur. Algoritmanın başarılı bir şekilde çalıştığı örneklerle de test edilmiş, performans üzerindeki kısıtlamalarının ne olduğu açıkça dile getirilmiştir. Algoritma donanım için geliştirilmeye açıktır ve daha güvenilir bir sistem için yenilikleri içine alabilecek bir yapı üzerine kurulmuştur.

Algoritmayı geliştirmek için algoritmasındaki gibi anahtar uzunluğuyla döngü sayısının değişken olması sağlanabilir. Döngü sayısı anahtar uzunluğuna bağlı olduğu sürece anahtar uzunluğunu bulmak güç olduğundan döngü sayısının da bulunması güçleşecektir.


7. KAYNAKLAR

[1]. Stallings W., Cryptography and Network Security: Principles and Practice Fourth Edition, Prentice Hall, New Jersey, 2006, ss.30.

[2]. Stinson D. R., Cryptography, Theory and Practice, CRC Press, 1995, ss. 70.

[3]. Stallings W., Network Security Essentials: Applications and Standards, Second Edition, Prentice Hall, New Jersey, 2003, ss. 33

[4]. Twofish, Bruce Schneier kişisel websitesi, http://www.schneier.com/twofish.html.

[5]. Ferguson N., Schneir B., “Practical Cyrptography”, Wiley Publishing, 2003, ss. 59-61

[6]. Demir N., Dalkılıç G., “Anahtar Bağımlı Bir Şifreleme Algoritması (IRON)”, Akademik Bilişim 2007, 31 Ocak – 2 Şubat 2007, Kastamonu.

[7]. Wikipedia, The Free Encylopedia, http://en.wikipedia.org/wiki/Advanced_Encryption_Standard.