در رمزنگاری، یک کد اصالت‌سنجی زنجیره رمز-قطعه (CBC-MAC) یک روش ساخت کد اصالت‌سنجی پیام از یک رمز قالبی است. در این روش پیام با استفاده از یک الگوریتم رمز قالبی در مد CBC رمز می‌شود و زنجیره‌ای از قالب‌ها به وجود می‌آورد به طوری که هر قالب به رمزنگاری صحیح قالب قبلی وابسته است. این وابستگی داخلی تضمین می‌کند که تغییر هر یک از بیت‌های متن اصلی باعث ایجاد تغییری در آخرین قالب رمز شده می‌شود که نمی‌توان بدون اطلاع از کلید رمز قالبی آن را پیش‌بینی یا خنثی کرد.

برای محاسبۀ CBC-MAC پیام m آن را در مد CBC با بردار اولیه صفر رمز می‌کنیم. شکل زیر محاسبۀ CBC-MAC یک پیام شامل قالب‌های {\displaystyle m\_{1}\|m\_{2}\|\cdots \|m\_{x}} را با استفاده از کلید مخفی k و رمز قالبی E نشان می‌دهد.

امنیت پیام‌های با طول ثابت و متغیّر
-----------------------------------

در صورتی که رمز قالبی مورد استفاده امن باشد (به عبارت دیگر یک جایگشت شبه‌تصادفی باشد)، CBC-MAC برای پیام‌های با طول ثابت امن خواهد بود. اما در حالت کلی، برای پیام‌های با طول متغیر امن نیست. به همین دلیل، هر کلید باید تنها برای پیام‌های با طول ثابت و مشخّص مورد استفاده قرار گیرد. دلیل این امر این است که مهاجمی که زوج‌های صحیح پیام-برچسب (همان CBC-MAC) دو پیام {\displaystyle (m,} {\displaystyle t)} و {\displaystyle (m',} {\displaystyle t')} را می‌داند می‌تواند پیام سوم {\displaystyle m''} را به گونه‌ای تولید کند که MAC آن نیز {\displaystyle t'} باشد. این کار به سادگی با XOR کردن اولین قالب {\displaystyle m'} با t و سپس الحاق m و {\displaystyle m'} تغییر یافته و تولید {\displaystyle m''=m\|[(m\_{1}'\oplus t)\|m\_{2}'\|\dots \|m\_{x}']} انجام می‌شود. هنگام محاسبۀ MAC پیام {\displaystyle m''}، MAC پیام m را به روش عادی برابر t محاسبه می‌کنیم و در مرحلۀ محاسبۀ {\displaystyle E\_{K\_{MAC}}(m\_{1}'\oplus t)} آن را با مقدار MAC اولین پیام XOR می‌کنیم. حضور این برچسب در پیام جدید باعث از بین رفتن کامل اثر MAC قالب‌های پیام m می‌شود: {\displaystyle E\_{K\_{MAC}}(m\_{1}'\oplus t\oplus t)=E\_{K\_{MAC}}(m\_{1}')} و در نتیجه برچسب پیام {\displaystyle m''} برابر {\displaystyle t'} است.

این مشکل را نمی‌توان با اضافه کردن قالب طول پیام به انتهای قالب‌ها حل کرد. سه راه‌حل اصلی اصلاح CBC-MAC و امن ساختن آن برای پیام‌های با طول متغیّر عبارتند از: ۱)جداسازی کلید ورودی-طول ۲)الحاق طول به ابتدای قالب‌ها ۳)رمز کردن آخرین قالب. در این حالت، هم‌چنین توصیه می‌شود که از مد عملیات متفاوتی، برای مثال، CMAC یا HMAC برای حفظ صحت و جامعیّت پیام‌های با طول متغیّر استفاده شود.

### الحاق طول به ابتدای قالب‌ها

یک راه قرار دادن طول پیام در اولین قالب است؛ ثابت شده‌است که CBC-MAC تا وقتی که دو پیامی که پیشوند یکدیگر هستند استفاده نشوند امن است و الحاق طول به ابتدای قالب‌ها حات خاص آن است. این مسئله در حالتی که طول پیام در آغاز محاسبات نامعلوم است می‌تواند گیج‌کننده باشد.

### رمز کردن آخرین قالب

رمز کردن آخرین قالب به صورت {\displaystyle {\text{CBC-MAC-ELB}}(m,(k\_{1},k\_{2}))=E(k\_{2},{\text{CBC-MAC}}(k\_{1},m))} تعریف می‌شود. در مقایسه با بقیۀ روش‌های توسعۀ CBC-MAC به پیام‌های با طول متغیر که بیان شد، رمز کردن آخرین قالب دارای این مزیت است که نیازی به دانستن طول پیام تا پایان محاسبات نیست.

### روش‌های حمله

هم‌چون بسیاری از طرح‌های رمزنگاری، استفاده خام از رمزها و دیگر پروتکل‌ها حملات را ممکن می‌سازد، که باعث کاهش کارایی حفاظت رمزنگاری (یا حتی بلااستفاده ساختن آن) می‌شود. ما در این‌جا حملاتی که به علّت استفادۀ نادرست از CBC-MAC ممکن می‌شوند را بیان می‌کنیم.

### استفاده از کلید یکسان برای رمزنگاری و اصالت‌سنجی

یک اشتباه متداول استفادۀ مجدد از کلید k برای رمزنگاری CBC و CBC-MAC است. گرچه در حالت کلّی استفادۀ مجدد از یک کلید برای اهداف متفاوت تکنیک نامناسبی است، در این حالت خاص این اشتباه به حملۀ اعجاب‌انگیزی می‌انجامد:

فرض کنید Alice می‌خواهد قالب‌های رمزشدۀ {\displaystyle C=C\_{1}\ ||\ C\_{2}\ ||\ \dots \ ||\ C\_{n}} را به Bob بفرستد. در حین فرآیند انتقال، Eve می‌تواند در هر یک از قالب‌های رمزشدۀ {\displaystyle C\_{1},\dots ,C\_{n-1}} تغییر ایجاد کند و هر یک از بیت‌های آن را به انتخاب خود تغییر دهد، به طوری که آخرین قالب، {\displaystyle C\_{n}}، دست‌نخورده باقی بماند. بدون لطمه‌خوردن به کلیّت مسئله و برای تأمین اهداف این مثال فرض می‌کنیم بردار اولیه که در فرآیند رمزنگاری مورد استفاده قرار گرفته یک بردار تمام صفر است.

Bob پیام را دریافت می‌کند و ابتدا آن را با معکوس کردن فرآیند رمزنگاری که Alice اعمال کرده روی قالب‌های رمزشدۀ {\displaystyle C=C\_{1}\ ||\ C\_{2}\ ||\ \cdots \ ||\ C\_{n}} رمزگشایی می‌کند. در حین فرآیند انتقال، Eve می‌تواند در هر یک از قالب‌های رمزشدۀ {\displaystyle C\_{1},\dots ,C\_{n-1}} تغییر ایجاد کند و هر یک از بیت‌های آن را به انتخاب خود تغییر دهد، به طوری که آخرین قالب، ٰ{\displaystyle C\_{n}}، دست‌نخورده باقی بماند. سپس نسخۀ تغییر یافتۀ او، به‌جای نسخۀ اصلی Alice به Bob تحویل داده می‌شود.

Bob ابتدا پیامی که دریافت کرده را با استفاده از کلید مخفی به اشتراک گذاشته شدۀ K رمزگشایی می‌کند و متن متناظر با آن را به دست می‌آورد. توجه کنید که همۀ متن به دست آمده با نسخۀ اصلی که Alice فرستاده متفاوت خواهد بود، زیرا Eve همۀ متن رمز شده به جز آخرین قالب آن را تغییر داده است. به بیان دقیق‌تر، متن نهایی، {\displaystyle P\_{n}'}، با متن اصلی که Alice فرستاده، {\displaystyle P\_{n}}، متفاوت است؛ با وجود یکسان‌بودن {\displaystyle C\_{n}}، {\displaystyle C\_{n-1}'\not =C\_{n-1}} است و در نتیجه با XOR کردن قالب رمز شدۀ قبلی با رمز گشایی شدۀ {\displaystyle C\_{n}} متن متفاوت به {\displaystyle P\_{n}'} دست می‌آید: {\displaystyle P\_{n}'=C\_{n-1}'\oplus E\_{K}^{-1}(C\_{n})}.

سپس Bob برچسب اصالت‌سنجی همۀ متن‌هایی که رمزگشایی کرده‌است را با استفاده از CBC-MAC محاسبه می‌کند. برچسب پیام جدید، {\displaystyle t'}، برابر است با:

{\displaystyle t'=E\_{K}(P\_{n}'\oplus E\_{K}(P\_{n-1}'\oplus E\_{K}(\dots \oplus E\_{K}(P\_{1}'))))}

توجه کنید که این عبارت معادل است با:

{\displaystyle t'=E\_{K}(P\_{n}'\oplus C\_{n-1}')}

که همان {\displaystyle C\_{n}} است:

{\displaystyle 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}}

در نتیجه داریم: {\displaystyle t'=C\_{n}=t}.

دیدیم که Eve توانست متن رمزشده را در حین انتقال تغییر دهد (بدون اینکه لزومأ اطّلاعی از متن اصلی متناظر با آن داشته باشد) به طوری که یک پیام کاملأ متفاوت، {\displaystyle P'}، تولید شود که برچسب این پیام با برچسب پیام اصلی مطابقت می‌کرد و Bob از این که محتویات پیام در فرایند انتقال تغییر کرده اطلاعی نداشت. طبق تعریف، یک کد اصالت‌سنجی پیام آسیب دیده‌است اگر بتوانیم یک پیام متفاوت (یک دنباله از زوج متن‌های {\displaystyle P'}) که همان برچسب پیام قبلی، P، را تولید می‌کند بیابیم به طوری که {\displaystyle P\not =P'} باشد. بدین ترتیب پروتکل اصالت‌سنجی پیام آسیب دیده‌است و Bob فریب داده شده و باور می‌کند که Alice پیامی برای او فرستاده است در حالی که Alice پیام را تولید نکرده‌است.

اگر در عوض از کلیدهای متفاوت {\displaystyle K\_{1}} و {\displaystyle K\_{2}} برای مراحل رمزنگاری و اصالت‌سنجی استفاده کنیم، این حمله خنثی می‌شود. از رمزگشایی بلوک‌های رمز شدۀ تغییر یافتۀ {\displaystyle C\_{i}'} رشتۀ متن {\displaystyle P\_{i}'} به دست می‌آید. به هر حال، به علت استفادۀ MAC از یک کلید متفاوت {\displaystyle K\_{2}}، نمی‌توانیم فرایند رمزگشایی را در مرحلۀ بعدی محاسبۀ کد اصالت‌سنجی پیام خنثی کنیم و همان برچسب را تولید کنیم؛ اکنون هر {\displaystyle P\_{i}'} تغییر یافته به وسیلۀ {\displaystyle K\_{2}} در فرایند CBC-MAC به {\displaystyle MAC\_{i}\not =C\_{i}'} رمز می‌شود.

این مثال هم‌چنین نشان می‌دهد که یک CBC-MAC نمی‌تواند به عنوان یک تابع یک طرفۀ مقاوم در برابر برخورد مورد استفاده قرار گیرد: در صورتی که کلید داده شده باشد به سادگی می‌توان پیام متفاوتی تولید کرد که به همان برچسب فشرده شود.

### بردار اوّلیه با مقادیر متغیّر

منگام رمزنگاری داده با استفاده از یک رمز قالبی در مد زنجیره رمز-قطعه (یا مد دیگر)، به طور معمول یک بردار اولیه برای اولین مرحلۀ فرایند رمزنگاری معرفی می شود. به طور معمول لازم است که این بردار به طور تصادفی انتخاب شود () و برای هیچ کلید مخفی داده شده که رمز قالبی تحت آن عمل می‌کند تکرار نشود. این شرایط با تضمین این‌که متن‌های یکسان به متن‌های رمزشدۀ یکسان رمز نمی‌شوند امنیت معنایی را برقرار می‌سازد و به مهاجم اجازه می‌دهد استنباط کند که رابطه‌ای وجود دارد.

هنگام محاسبۀ کد اصالت‌سنجی پیام، مثلأ به وسیلۀ CBC-MAC، استفاده از یک بردار اولیه یک بردار حملۀ ممکن است.

در عملیات زنجیره رمز-قطعه، اوّلین قالب متن با بردار اولیه XOR می‌شود ({\displaystyle P\_{1}\oplus IV}). حاصل این عملیات ورودی رمز قالبی برای رمزنگاری است.

به هر حال، هنگام اجرای رمزنگاری و رمزگشایی، مستلزمیم بردار اولیه را در متن بفرستیم - معمولاً به عنوان قالبی که بلافاصله قبل از اولین قالب رمزشده می‌آید - به طوری که اولین قالب متن با موفقیت رمزگشایی و بازیابی می شود.

هنگام محاسبۀ MAC، مستلزمیم بردار اولیه اولیه را در متن به طرف مقابل بفرستیم که آن‌ها بتوانند تحقیق کنند که برچسب پیام با مقداری که محاسبه کرده‌اند مطابقت می‌کند.

اگر اجازه بدهیم بردار اولیه به طور دلخواه انتخاب شود، اولین قالب متن می‌تواند تغییر کند (و پیام متفاوتی قرستاده شود) ولی همان برچسب را تولید کند.

پیام {\displaystyle M\_{1}=P\_{1}|P\_{2}|\dots } را در نظر بگیرید. هنگام محاسبۀ برچسب پیام برای CBC-MAC، فرض کنید بردار اولیۀ {\displaystyle IV\_{1}} را به گونه‌ای انتخاب می‌کنیم که محاسبۀ MAC با {\displaystyle E\_{K}(IV\_{1}\oplus P\_{1})} شروع شود. در نتیجه زوج (پیام، برچسب) {\displaystyle (M\_{1},T\_{1})} تولید می شود.

اکنون پیام {\displaystyle M\_{2}=P\_{1}'|P\_{2}|\dots } را تولید می‌کنیم. برای هر بیت تغییر یافته در {\displaystyle P\_{1}'}، بیت متناظر با آن در بردار اولیه را تغییر می‌دهیم تا بردار اولیۀ {\displaystyle IV\_{1}'} تولید شود. برای محاسبه ی MAC این پیام، محاسبات را با {\displaystyle E\_{K}(P\_{1}'\oplus IV\_{1}')} آغاز می‌کنیم. از آن‌جا که بیت‌های متن اصلی و بردار اولیه در مکان‌های یکسان تغییر کرده‌اند، تغییر در مرحلۀ اول خنثی می شود، با این معنا که ورودی رمز قالبی همان {\displaystyle M\_{1}} خواهد بود. اگر تعییر دیگری در متن اصلی ایجاد نشود، همان برچسب از پیام دیگری مشتق می‌شود.

اکر آزادی انتخاب بردار اولیه حذف شود و همۀ اجراهای CBC-MAC روی یک بردار اولیۀ خاص ثابت شوند (معمولاً یک بردار تمام صفر، اما در تئوری، هر چیزی می‌تواند باشد مشروط بر این‌که با همۀ پیاده‌سازی‌ها سازگار باشد)، این حمله نمی‌تواند پیشروی کند.

استاندارد‌هایی که الگوریتم را تعریف می‌کنند
-------------------------------------------

اصالت‌سنجی داده‌های کامپیوتری یک (هم‌اکنون منسوخ) یک استاندارد دولت آمریکاست که الگوریتم CBC-MAC را با استفاده از DES به‌عنوان رمز‌قالبی تعیین می‌کند.

الگوریتم CBC-MAC هم‌ارز الگوریتم مک ۱ ISO/IEC 9797-1 است.

منابع
-----