DES Şifreleme
Önceki XXXII. Oylum - Şifrelemeyle İlgili İşlevler Sonraki
DES Şifreleme
Veri Şifreleme Standardı (Data Encryption Standard), Ulusal Standartlar ve Teknoloji Enstitüsü (National Institute of Standards and Technology - NIST) tarafından yayınlanan ABD Hükümeti Federal Bilgi İşleme Standartları (US Government Federal Information Processing Standards - FIPS) 46-3 içinde anlatılmaktadır. DES geliştirildiği 1970lerden beri tamamen analiz edilmiştir ve yeni önemli bir kusuru bulunamamıştır.
Ancak, DES sadece 56 bitlik bir anahtar kullanmaktadır (artı 8 eşlik biti), ve 1998 yapımı 200.000 Amerikan Doları değerinde bir makine 6 günde olası bütün anahtarları deneyebilmektedir; daha fazla parayla daha hızlı sonuçlar elde edilebilmektedir. Bu basit DES'i bir çok amaç için güvensiz kılmaktadır ve NIST, US hükümet sistemlerinde basit DES'in kullanım iznini kaldırmıştır.
Ciddi şifreleme işlevselliği için, bu yordamlar yerine özgür şifreleme kütüphanelerinden birinin kullanılması tavsiye edilir.
DES 64-bitlik bir blok ve 64-bitlik anahtar alarak 64-bitlik başka bir blok üreten, tersine çevrilebilir bir işlemdir. Genelde bitler numaralandırılır böylece en-anlamlı bit, yani her bloğun ilk biti 1 ile numaralandırılır.
Bu numaralama altında, anahtarın her 8. biti (8., 16., vs.) şifreleme algoritmasında kullanılmaz. Fakat anahtar tekil eşlik bitine sahip olmalıdır; 1'den 8'e, 9'dan 16'ya, şeklinde devam eden bitler `1'in tek sayılı eş bitlerine sahip olmalıdır ve bu tamamen kullanılmayan bitleri belirtir.
void setkey
(const char *anahtar)
işlev
setkey işlevi anahtar'ın genişletilmiş bir biçimi olan bir iç veri yapısı kurar. anahtar her biti char içinde saklanan 64 bitlik bir dizi olarak tanımlanmıştır, ilk bit anahtar[0] ve 64. bit anahtar[63]'dür. anahtar doğru eşlik değerine sahip olmalıdır.
void encrypt
(char *blok,
 int   bayrak)
işlev
encrypt işlevi eğer bayrak 0 ise blok'u şifreler, aksi takdirde setkey ile belirtilen anahtarı kullanarak blok'u deşifre eder. Sonuç blok içinde saklanır.
setkey gibi, blok da her biti char içinde saklanan 64 bitlik dizi olarak tanımlanır, fakat blok içinde eşlik biti yoktur.
void setkey_r
(const char         *anahtar,
 struct crypt_data * veri)
işlev
void encrypt_r
(char               *blok,
 int                 bayrak,
 struct crypt_data * veri)
işlev
Bunlar setkey ve encrypt'in evresel (reentrant) sürümleridir. Tek fark anahtar değerini saklayan ek parametresidir. setkey_r ilk kez çağrılmadan önce veri sıfırlarla doldurularak ilklendirilmelidir.
setkey_r ve encrypt_r işlevleri GNU oluşumlarıdır. setkey, encrypt, setkey_r ve encrypt_r işlevleri crypt.h içinde tanımlıdır.
int ecb_crypt
(char    *anahtar,
 char    *bloklar,
 unsigned uzunluk,
 unsigned kip)
işlev
ecb_crypt işlevi DES kullanarak bir veya daha fazla blok şifreler veya şifresini çözer. Her blok bağımsız olarak şifrelenir.
bloklar ve anahtar 8-bitlik bayt paketleri içinde saklanır, böylece anahtarın ilk biti anahtar[0]'in en-anlamlı biti olarak, anahtarın 63. biti anahtar[7]'nin en az anlamlı biti olarak saklanır. anahtar doğru eşlik değerine sahip olmalıdır.
uzunluk, bloklar içindeki bayt sayısıdır. Bu değer 8'in katları olmalıdır (böylece bütün bloklar şifrelenebilir). uzunluk, DES_MAXDATA azami bayt sayısı ile sınırlandırılmıştır.
Şifrelemenin sonucu bloklar girdisi ile değiştirilir.
kip parametresi aşağıdaki ikisinin bit bit VEYAlanmasıdır:
DES_ENCRYPT
Bu sabit, kip parametresinde kullanılır ve bloklar'ın şifreleneceğini belirtir.
DES_DECRYPT
Bu sabit, kip parametresinde kullanılır ve bloklar'ın şifresinin çözüleceğini belirtir.
DES_HW
Bu sabit, kip parametresinde kullanılır ve bir donanım cihazı kullanılacak mı sorar. Eğer donanım yoksa, şifreleme gerçekleşir ancak yazılımla.
DES_SW
Bu sabit, kip parametresinde kullanılır ve donanım kullanılmayacağını belirtir.
İşlev sonucu aşağıdaki değerlerden biri olur:
DESERR_NONE
Şifreleme başarıldı.
DESERR_NOHWDEVICE
Şifreleme başarıldı, ancak donanım bulunamadı.
DESERR_HWERROR
Şifreleme donanım sorunu nedeniyle başarılamadı.
DESERR_BADPARAM
Şifreleme kötü parametre nedeniyle başarılamadı, örneğin uzunluk 8'in katı değil veya uzunluk DES_MAXDATA değerinden büyük.
int DES_FAILED
(int hata)
makro
Bu makro eğer ecb_crypt veya cbc_crypt sonucu hata bir `başarı' sonuç koduysa 1, aksi takdirde 0 döndürür.
int cbc_crypt
(char    *anahtar,
 char    *bloklar,
 unsigned uzunluk,
 unsigned kip,
 char    *yedek)
işlev
cbc_crypt işlevi Zincirleme Blok Şifreleme (Cipher Block Chaining) kipinde DES kullanarak bir veya daha fazla bloğu şifreler veya şifre çözer.
CBC kipinde şifreleme için, her blok şifrelenmeden önce yedek ile XOR'lanır, ardından yedek şifreleme sonucuyla yer değiştirilir, sonra diğer blok işlenir. Şifre çözme bu işlemin tersidir.
Bunun avantajı, şifrelenmeden önce aynı olan blokları şifrelendikten sonra yine aynı ama oldukça farklı yaptığı için, veri içindeki şablonları algılamanın daha zor olmasıdır.
Genellikle, şifreleme başlamadan önce yedek 8 rastgele bayt ile ayarlanır. Ardından 8 rastgele bayt şifrelenen veriyle birlikte aktarılır (kendisi şifrelenmeden) ve şifre çözmek için yedek olarak geri aktarılır. Diğer olasılık yedek'i ilk başta 8 sıfır yapmak ve ilk bloğu 8 rastgele bayt ile şifrelemektir.
Aksi takdirde, bütün parametreler ecb_crypt için olduğu gibidir.
void des_setparity
(char *anahtar)
işlev
des_setparity işlevi her baytın düşük bitlerini değiştirerek tek eşlik bitine sahip olmak için 8-bitlik baytlar içinde paketlenerek saklanan 64-bit anahtar'ı değiştirir,
ecb_crypt, cbc_crypt ve des_setparity işlevleri ve onlara eşlik eden makrolar rpc/des_crypt.h başlık dosyası içinde tanımlıdır.
Önceki Üst Ana Başlık Sonraki
Parolaların Şifrelenmesi Başlangıç XXXIII. Oylum - Hata Ayıklama Desteği
Bir Linux Kitaplığı Sayfası