Kriptografide, CBC-MAC, bir blok şifreleme ile mesaj kimlik doğrulama kodu oluşturmak için kullanılır. Mesaj, her blok önceki bloğun düzgün şifrelenmesine bağlı olacak şekilde, bir blok zinciri oluşturmak için CBC kipinde bir blok şifreleme algoritmasıyla şifrelenir. Bu bağlılık sayesinde, şifresiz metnin herhangi bir bitinde yapılan değişikliğin, şifrelenmiş son bloğun, blok şifreleme anahtarı bilinmeden tahmin edilmesini veya etkisiz hale getirilmesini engeller. mesajı için CBC-MAC hesaplarken CBC kipinde ilklendirme vektörü ile şifrelenir ve son blok tutulur. Aşağıdaki şekil, m_1\|m_2\|\cdots\|m_x bloklarından oluşan bir mesaj için, gizli anahtar ve bir blok şifre kullanarak CBC-MAC hesaplamasını göstermektedir. Dosya:CBC- MAC_structure_(en).svg == Sabit ve değişken uzunluklu mesajlarda güvenlik == Eğer kullanılan blok şifreleme güvenliyse (pseudorandom bir permütasyon ise),CBC-MAC sabit uzunluktaki mesajlar için güvenlidir.M. Bellare, J. Kilian and P. Rogaway. The security of the cipher block chaining message authentication code. JCSS 61(3):362–399, 2000.. Ancak, tek başına, değişken uzunluklu mesajlar için güvenli değildir. . Nitekim, herhangi tek anahtar sadece sabit ve bilinen uzunluktaki mesajlar için kullanılmalıdır. . Bunun sebebi ise, İki mesaj için doğru mesaj-etiket çiftlerini bilen saldırgan, (m, t) ve (m', t'), CBC-MAC'i t' olan üçüncü bir mesaj m üretebilir. Bu, m' ilk bloğunu ile xorladıktan sonra mesajını değiştirilmiş m' ile birleştirilerek yapılır; diğer bir deyişle m = m \| [(m_1' \oplus t) \| m_2' \| \dots \| m_x'] ile yapılır. m mesajı için MAC hesaplanırken, öncelikle için Mac’i deki gibi klasik şekilde hesaplanır, ama bu değer ileridekiE_{K_\text{MAC}}(m_1' \oplus t) hesaplayan bir adıma zincirlendiğinde, ilk mesajdaki macten ürettilen değer ile birlikte özel or operasyonu gerçekleştirilir. Yeni mesajda etiketin var olması, ilk mesajındaki şifresiz metin bloklarından üretilen mac’e etki bırakmadan iptal edileceği anlamına gelir:E_{K_\text{MAC}}(m_1' \oplus t \oplus t) = E_{K_\text{MAC}}(m_1')böylece m için etiket t' dir. Bu problem, sona mesaj boyutunda blok eklemek ile çözülemez.See Section 5 of Bellare, et al. CBC-MAC in değişken uzunluklu mesajlar için güvenli yapabilecek şekilde değiştirildiği üç ana yöntem vardır; 1) Girdi boyutlu anahtar ayırmak; 2) başa uzunluk eklemek; 3) son bloğu şifrelemek. Öyle bir durumda, farklı bir blok şifre çalışma kipi kullanılması önerilebilir, örneğin, değişken boyutlu mesajın bütünlüğünü korumak için CMAC veya HMAC. === Uzunluğu başa eklemek === Bir çözüm yöntemi olarak, mesaj uzunluğunu ilk blokta bulundurmaktır ISO/IEC 9797-1:1999 Information technology – Security techniques – Message Authentication Codes (MACs) – Part 1: Mechanisms using a block cipher , clause 6.1.3 Padding Method 3; herhangi iki birbirinin prefixi olan mesaj kullanılmadığı sürece CBC-MAC'in güvenli olduğu kanıtlanmıştır ve uzunluğu başa eklemek bunun özel bir durumudur.C. Rackoff and S. Gorbunov. On the Security of Block Chaining Message Authentication Code. İşlem başladığında mesajın uzunluğu bilinmiyorsa problemler oluşabilir. === Son bloğu şifrelemek === CBC-MACte son bloğu şifrelemek (ECBC-MAC) , şeklinde tanımlanır. Bahsedilen diğer yöntemlerden olan CBC-MAC'i değişken uzunluklu mesajlar için uzatmaya göre, son bloğu şifrelemenin avantajı hesaplama bitene kadar mesaj uzunluğunun bilinmesinin gerekmemesidir. sağ|küçükresim|300x300pik| CBC-MAC Encrypt-last-block'un hesaplanması. == Saldırı yöntemleri == Birçok kriptografik şemada olduğu gibi, şifrelerin ve protokollerin naif kullanımı, kriptografik korumanın etkenliğini düşürüp (hatta işe yaramaz hale getirip) saldırıları mümkün kılabilir. CBC-MAC'in yanlış kullanımından kaynaklanan saldırılardan bahsedeceğiz.Why I hate CBC-MAC by Matthew D. Green === Şifreleme ve kimlik doğrulama için aynı anahtarı kullanma === Aynı anahtar ’yi CBC şifreleme ve CBC-MAC için yeniden kullanmak yaygın bir hatadır. Her ne kadar bir anahtarın farklı amaçlar için yeniden kullanılması genel olarak kötü bir uygulama olsa da, bu özel durumda bir saldırıya sebep olur: Diyelim ki Alice Bob’a şifre metin blokları C = C_1 \| C_2 \| \dots \| C_n göndermiş olsun. Aktarma işlemi sırasında Eve, son metin bloğu C_n aynı kalacak şekilde, şifre metni bloklarından herhangi birini karıştırabilir ve seçtiği bitleri istediği gibi ayarlayabilir. Bu örneğin amaçları doğrultusunda başlangıç vektörünün sıfırlar vektörü olduğunu varsayıyoruz. Bob mesajı aldığında, şifre metin bloklarını C=C_1 \| C_2 \| \cdots \| C_n kullanarak, Alice’in uyguladığı şifleme işlemi tersine çevirerek mesajın şifresini çözecektir. Bob’a gelen, Alice’in orijinal mesajı yerine karıştırılmış olan mesaj C'=C_1' \| \dots \| C_{n-1}' \| C_n . Bob önce, şifresiz metni elde etmek için paylaşılan gizli anahtar kullanarak mesajın şifresini çözer. Eve sonuncu hariç bütün şifreli metin bloklarını değiştirdiği için, üretilen bütün şifresiz metin Alice’in gönderdiğinden farklı olacak. Özellikle, son şifresiz metin, P_n', Alice’in gönderdiği orijinal P_n'den farklıdır; C_n aynı olsa da, C_{n-1}' ot = C_{n-1} bu nedenle şifre çözme işleminden sonra önceki şifre bloğunu özel OR'a zincirlerken farklı P_n' üretilir.P_n' = C_{n-1}' \oplus E_K^{-1}(C_n) Bob, çözdüğü tüm düz metin değerleri üzerinden CBC-MAC kullanarak kimlik doğrulama etiketini hesaplar. Yeni mesajın etiketi olan t', şu şekilde elde edilir: : t' = E_K(P_n' \oplus E_K(P_{n-1}' \oplus E_K( \dots \oplus E_K(P_1')))) Bu ifadeler eşittir, : t' = E_K(P_n' \oplus C_{n-1}') tam olarak hangisi C_n : : t' = E_K(C_{n-1}' \oplus E_K^{-1}(C_n) \oplus C_{n-1}') = E_K(E_K^{-1}(C_n)) = C_n buradan t' = C_n = t çıkarılır. Bu nedenle Eve, iletilmekte olan şifre metnini (hangi şifresiz metne karşılık geldiğini bilmeden) değiştirebildi, öyle ki tamamen farklı bir mesaj, P', üretildi ama bu mesajın etiketi orijinal mesajın etiketiyle eşleşti ve Bob iletim aşamasında mesajın içeriğinin değiştirildiğinden habersizdi. Tanım olarak, önceki mesajla () aynı etiketi üreten farklı bir mesaj (şifresiz metin dizisi P' ve P ot = P') bulabilirsek mesaj kimlik doğrulama kodu bozuktur deriz. Bu senaryoda, mesaj kimlik doğrulama protokolünün bozulduğu ve Bob'un Alice'in üretmediği bir mesaj gönderdiğine inanmak için aldatılmıştır. Bunun yerine, şifreleme ve kimlik doğrulama aşamaları için farklı anahtarlar kullanırsak, K_1 ve K_2, saldırı başarısız olurdu. Değiştirilmiş şifreli metin bloklarının,C_i', şifresinin çözülmesi şifresiz metin dizisi, P_i', sağlar. Ancak, MACin farklı birK_2 anahtarını kullanması nedeniyle, aynı etiketi üretmek için ileti kimlik doğrulama kodunun hesaplanmasının ileri adımında şifre çözme işlemini "geri çeviremeyiz"; değiştirilmiş her P_i' artık CBC-MAC işleminde K_2 ile \mathrm{MAC}_i ot = C_i' değerine şifrelenecek. Bu örnek aynı zamanda CBC- MAC’in çarpışmaya dayanıklı tek yönlü bir fonksiyon olarak kullanılamayacağını da göstermektedir: bir anahtar verildiğinde, aynı etikete "özet"(hash?) yapan farklı bir mesaj oluşturmak önemsizdir. === Başlangıç vektörünün değerinin değişmesine izin verme === Şifreleme bloğu zincirleme (veya bir başka) kip içinde bir blok şifreleyici kullanarak verileri şifrelerken, şifreleme işleminin ilk aşamasına bir başlatma vektörü eklemek yaygındır. Tipik olarak bu vektörün rastgele seçilmesi (tek seferlik anahtar) ve blok şifresinin çalıştığı herhangi bir gizli anahtar için tekrar edilmemesi gerekir. Bu, aynı düz metnin aynı şifre metnine şifrelenmemesini sağlayarak, saldırganın bir ilişki oluşturmasına izin verir semantik güvenlik sağlar. Bir başlatma vektörünün CBC-MAC gibi bir mesaj kimlik doğrulama kodu hesaplanırken kullanılması olası bir saldırı vektörüdür. Bir şifre bloğu zincirleme şifresinin çalışmasında, düz metnin ilk bloğu başlatma vektörü ile özel OR kullanılarak karıştırılır (P_1 \oplus IV). Bu işlemin sonucu, şifreleme işlemi için blok şifrelemenin girdisidir. Ancak, şifreleme ve şifre çözme işlemleri gerçekleştirilirken, ilklendirme vektörü şifresiz metinle göndermekle yükümlüyüz -tipik olarak şifreli metnin ilk bloğundan önceki blok olarak- bu şekilde şifresiz metnin ilk bloğunun şifresi çözülebilir ve başarıyla kurtarılabilir. Eğer bir MAC hesaplıyorsanız, mesajdaki etiketin hesaplanan değer ile eşleştiğini doğrulayabilmek için ilklendirme vektörünü diğer tarafa şifresiz metin ile iletmemiz gerekecektir. Eğer ilklendirme vektörünün keyfi olarak seçilmesine izin verilirse, aynı mesaj etiketi oluşturulurken ilk şifresiz metin bloğu değiştirilebilir (farklı bir mesaj ileterek). Bir mesaj düşünün M_1 = P_1 | P_2 | \dots . Özellikle, CBC-MAC için mesaj etiketini hesaplarken, bir IV_1 ilklendirme vektörü seçtiğimizi varsayalım, öyle ki MAC'ın hesaplanması E_K(IV_1 \oplus P_1) ile başlasın. Bu bir (mesaj, etiket) çifti üretir (M_1, T_1) . Şimdi M_2 = P_1' | P_2 | \dots mesajı üret. P_1' içindeki değiştirilmiş her bit için, ilklendirme vektöründe karşılık gelen bitler çevirilir ve IV_1' ilklendirme vektörü üretilir. Bu mesaj için MAC'ı hesaplarken şu işlem ile başlıyoruz: E_K(P_1' \oplus IV_1'). Hem şifresiz metin hem ilklendirme vektörü bitleri aynı yerde değiştirildiği için, ilk aşamada değişiklik iptal edilir, yani blok şifre girişi M_1 için olan ile aynıdır. Eğer şifresiz metinde başka değişiklik yapılmazsa, farklı bir mesaj iletiliyor olsa dahi aynı etiket üretilir. İlklendirme vektörü seçme özgürlüğü kaldırılırsa, ve tüm CBC-MAC implementasyonları belirli bir ilklendirme vektörüne sabitlenirse(genelde sıfır vektörü ancak herhangi bir şey olabilir) bu saldırı devam edemez. Özetlemek gerekirse, saldırgan MAC doğrulaması için kullanılacak IV'ü belirleyebiliyorsa, MAC'i geçersiz kılmadan ilk veri bloğunda keyfi değişiklik yapabilir. === Öngörülebilir ilklendirme vektörü kullanma === Bazen IV, mesaj tekrar saldırılarını önlemek için bir sayaç olarak kullanılır. Ancak, saldırgan MAC doğrulaması için hangi IV'ün kullanılacağını tahmin edebiliyorsa, doğrulama için kullanılacak IV'deki değişikliği telafi etmek için ilk veri bloğunu değiştirerek önceden gözlemlenen mesajı tekrar dinleyebilir. Örneğin saldırgan IV_1 ile birlikte M_1 = P_1 | P_2 | \dotsmesajını gözlemlemişse ve IV_2biliyorsa M_1' = (P_1 \oplus IV_1 \oplus IV_2)| P_2 | \dots üretebilir, IV_2 ile MAC doğrulamasını geçer. En basit karşı tedbir, IV kullanmadan önce şifrelemektir (yani IV'ü veriler için hazırlamak). Alternatif olarak CFB kipindeki MAC kullanılabilir, çünkü CFB kipinde IV verilerle XOR edilmeden önce şifrelenir. Başka bir çözüm olarak (mesaj tekrarı saldırıları koruması gerekli değilse) her zaman sıfır vektörü IV kullanılırIntroduction to Modern Cryptography, Second Edition by Jonathan Katz and Yehuda Lindell. Yukarıdaki formül M_1' için M_1' = (P_1 \oplus 0 \oplus 0)| P_2 | \dots = P_1 | P_2 | \dots = M_1 haline gelir. M_1 ve M_1' aynı mesaj olduğu için, tanım gereği aynı etikete sahip olurlar. Bu bir sahtecilik değildir, CBC-MAC’in amaçlanan kullanımıdır. == Algoritmayı tanımlayan standartlar == FIPS PUB 113 Bilgisayar Verileri Kimlik Doğrulaması, CBC-MAC algoritmasını blok şifre olarak DES kullanarak belirleyen bir ABD hükümet standardıdır (artık kullanılmamaktadır) . CBC-MAC algoritması ISO / IEC 9797-1 MAC 1 Algoritması'na eşdeğerdir. == Ayrıca bakınız == * CMAC - Farklı uzunluklardaki mesajlar için güvenli olan (NIST tarafından önerilen) blok şifreleme tabanlı bir MAC algoritması. * OMAC ve PMAC - Blok şifrelemeleri mesaj kimlik doğrulama kodlarına (MAC) dönüştürmenin diğer yöntemleri. * Tek yönlü sıkıştırma işlevi - Karma işlevler blok şifrelerden yapılabilir. Ancak, MAC'lar (CBC-MAC gibi) ve karmalar arasında güvenlik için işlev ve kullanımlarda önemli farklılıklar olduğunu unutmayın. == Kaynakça == Kategori:Simetrik anahtar algoritmaları