Tek anahtarlı mesaj doğrulama kodu

**Tek anahtarlı mesaj doğrulama kodu** (**One-key MAC**, **OMAC**), CBC-MAC algoritmasına benzer bir blok şifresinden oluşturulan bir mesaj kimlik doğrulama kodudur .

Resmi olarak, küçük bir değişiklik dışında her ikisi de esasen aynı olan iki OMAC algoritması (OMAC1 ve OMAC2) vardır. Mayıs 2005'te NIST tarafından önerilmiş olan OMAC1, **CMAC** algoritmasına eşdeğerdir.

Algoritma, herhangi bir patent kapsamında olmadığından her kullanıcı için ücretsizdir. Kriptografide **CMAC** (**Cipher-based Message Authentication Code, Şifre Tabanlı Mesaj Kimlik Doğrulama Kodu**) bir çeşit blok şifreleme tabanlı mesaj kimlik doğrulama kodu algoritmasıdır. İkili verilerin kimliğinin doğruluğunu ve dolayısıyla da bütünlüğünü garanti etmek için kullanılabilir. Bu çalışma kipi, CBC-MAC'in güvenlik eksikliklerini giderir (CBC-MAC sadece sabit uzunluktaki mesajlar için güvenlidir).

CMAC algoritmasının temeli, Black ve Rogaway tarafından önerilmiş ve XCBC adı altında analiz edilip NIST'e gönderilmiş olan bir CBC-MAC varyasyonudur. XCBC algoritması, CBC-MAC'in güvenlik eksikliklerini etkili bir şekilde gidermektedir, ancak üç anahtar gerektiriyor. Iwata ve Kurosawa, XCBC için bir iyileştirme sunmuş ve elde ettikleri algoritmayı makalelerinde One-Key CBC-MAC (**OMAC**) olarak adlandırmış, ardından OMAC üzerine bir iyileştirme ve ilave güvenlik analizi olan OMAC1'i yayımlamışlardır. OMAC algoritması, XCBC için gereken anahtar miktarını azaltır. CMAC, OMAC1'e eşdeğerdir.

Bir adet *<math>b</math>-*bitlik blok şifresi *<math>(E)</math>* ve bir adet gizli anahtar *<math>(k)</math>* kullanarak*,* bir mesaja *<math>(m)</math>* ait  *<math>\mathcal{l}</math>*-bitlik bir CMAC etiketi *<math>(t)</math>* oluşturmak için; öncelikle aşağıdaki algoritma kullanılarak iki adet *<math>b</math>*-bitlik alt-anahatlar (*<math>k_1</math>* *ve <math>k_2</math>*) türetilir (Bu işlem, sonlu alan *<math>GF(x^b)</math>* üzerinde *<math>x</math>* ve x^2'nin çarpımına eşdeğerdir). \ll sembolü standart sola-kaydırma operatörü ve \oplus sembolü ise dışlayıcı veya işlemini, msb fonksiyonu ise sayının en anlamlı bitini (most significant bit) belirtmek üzere:

# Geçici bir k_0=E_k(0) değeri hesaplanır. 
# Eğer msb(k_0)=0 ise, k_1=k_0 \ll 1; aksi halde k_1=(k_0 \ll 1) \oplus C olur. Burada, *<math>C</math>* yalnızca *<math>b</math>'ye* bağlı belirli bir sabittir. (Spesifik olarak, C değeri, indirgenemeyen b. dereceden ikili polinomlar arasında en az sayıda 1 içeren ilk polinomun baş katsayısı haricindeki diğer katsayılarıdır: Mesela, 64 bit için 0x1B, 128 bit için 0x87 ve 256 bit bloklar için 0x425.) 
# Eğer msb(k_1)=0 ise, k_2=k_1 \ll 1, aksi halde k_2=(k_1 \ll 1) \oplus C olur. 
# MDK hesaplama işlemi için gerekli bu alt anahtarlar (k_1, k_2) döndürülür.

Küçük bir örnek olarak, b=4, C =0011_2 ve k_0 = E_k(0)=0101_2 olarak varsayılsın. O halde k_1 = 1010_2 ve k_2=0100 \oplus 0011 = 0111_2 olarak hesaplanmış olur.

CMAC etiketi oluşturma süreci aşağıdaki gibidir:

# Mesaj m=m_1\ ||\ m_2\ ||\ \dots\ ||\ m_n olacak şekilde b bitlik bloklara ayrılır. Burada m_1, m_2,  \dots, m_{n-1} tam bloktur. (Boş mesaj ise tamamlanmamış bir tane blok olarak değerlendirilir.) 
# Eğer M_n tam bloksa m_n^'=k_1 \oplus m_n, aksi halde m_n^'=k_2 \oplus (m_n\ ||\ 10...0_2) olur. 
# c_0=00...0_2 olsun. 
# Her i\in \{1,2,3, \dots, n-1\} için, c_i=E_k(c_{i-1} \oplus m_i) değeri hesaplanır. 
# c_n=E_k(c_{n-1} \oplus m_n^') olur. 
# Çıktı t=msb_{\mathcal{l}}(c_n) olarak bulunmuş olur.

Doğrulama işlemi ise aşağıdaki gibidir:

# Etiketi oluşturmak için yukarıdaki algoritma kullanılır. 
# Oluşturulan etiketin alınan etikete eşit olup olmadığı kontrol edilir.

## Uygulamalar

* Python uygulaması 
* Ruby uygulaması

## Kaynakça

## Dış bağlantılar

* RFC 4493 AES-CMAC Algoritması 
* RFC 4494 AES-CMAC-96 Algoritması ve IPsec ile Kullanımı 
* RFC 4615 Gelişmiş Şifreleme Standardı-Şifreleme Tabanlı İleti Kimlik Doğrulama Kodu-Sözde Rastgele İşlev-128 (AES-CMAC-PRF-128) 
* OMAC Çevrimiçi Testi 
* OMAC Hakkında Daha Fazla Bilgi 
* Phillip Rogaway'in CMAC'ın fikri mülkiyet durumu ile ilgili açıklaması