کد افزونگی چرخشی

از ویکی‌پدیا، دانشنامهٔ آزاد
پرش به: ناوبری، جستجو

یک کد افزونگی دوره ای (به انگلیسی: Cyclic redundancy code) (سی‌آرسی) تابع درهم‌سازی غیرایمنی است که جهت تشخیص تغییرات تصادفی رو داده‌های خام طراحی شده‌است. این تابع عموماً در شبکه‌های مخابراتی دیجیتال و وسایل ذخیره‌سازی داده‌ها از جمله دیسک سخت مورد استفاده قرار می‌گیرد. یک دستگاه دارای قابلیت سی‌آرسی، یک توالی کوتاه و با طول ثابت را، به نام کد سی‌آرسی (یا فقط سی‌آرسی)، برای هر بلاک از داده‌ها محاسبه نموده و آن را همراه با داده‌ها ذخیره یا ارسال می‌کند. زمانی که یک بلاک دریافت یا خوانده می‌شود دستگاه محاسبه را تکرار می‌کند؛ در صورت مغایرت با کد محاسبه شده قبلی مشخص می‌شود که این بلاک دارای خطای داده است و در این حالت دستگاه ممکن است عملی را جهت اصلاح خطا از جمله خواندن یا درخواست ارسال مجدد بلاک انجام دهد. اصطلاح سی‌آرسی می‌تواند به کد اعتبارسنج یا تابع تولید کد اطلاق شود. سی‌آرسی‌ها به جهت پیاده‌سازی ساده در سخت‌افزار دودویی، سادگی تحلیل ریاضی آن‌ها و عملکرد خوب در تشخیص خطاهای معمول حاصل از اختلال در کانال‌های انتقال دارای محبوبیت زیادی هستند. سی‌آرسی توسط W. Wesley Peterson اختراع و در مقاله ۱۹۶۱ وی منتشر شد.[۱] سی‌آرسی 32بیتی پیشنهادی موسسه مهندسین الکتریک و الکترونیک (IEEE)، که در اترنت و سایر جاها استفاده شده‌است، در کنفرانس مخابراتی سال 1975 ظاهر شد.

مقدمه[ویرایش]

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

اگرچه سی‌آرسی‌ها می‌توانند با استفاده از هر میدان محدودی ساخته شوند، همه سی‌آرسی‌های پرکاربرد از میدان محدود GF(2) بهره می‌برند. این میدانی از دو عنصر، عموماً به نام ۰ و ۱، است که به راحتی با معماری کامپیوتر سازگار است.

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

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

سی‌آرسی‌ها و تمامیت داده‌ها[ویرایش]

سی‌آرسی‌ها، به خودی خود، راهکار مناسبی برای حفاظت در مقابل تغییرات عمدی روی داده نیستند (مثلاً در برنامه‌های اعتبارسنجی)، چون مبانی ساده ریاضیات آن‌ها باعث می‌شود که بتوان هر تغییر دلخواه را روی داده‌ها طوری اعمال کرد که سی‌آرسی داده‌ها تغییر نکند.

اغلب این فرض غلط وجود دارد که وقتی پیامی به همراه سی‌آرسی آن از یک کانال آزاد دریافت می‌شود و سی‌آرسی دریافتی با سی‌آرسی محاسبه شده مطابقت می‌کند پس پیام ممکن نیست در حین دریافت تغییر کرده باشد. این درست نیست چون هر دوی آن‌ها می‌توانند تغییر کرده باشند، به طوری که سی‌آرسی جدید با پیام جدید مطابقت کند. بنابراین سی‌آرسی‌ها می‌توانند جهت بررسی درستی داده‌ها استفاده شوند ولی نه برای اطمینان از تمامیت آن.

ایجاد پیام‌های دیگری که همان سی‌آرسی را ایجاد کنند کار ساده‌ای است، خصوصاً پیام‌هایی که بسیار شبیه پیام اصلی هستند. طبق طراحی پیامی که بسیار شبیه پیام اصلی است (و تفاوت آن تنها در یک الگوی تداخل تصادفی است) سی‌آرسی کاملاً متفاوتی خواهد داشت و بنابراین تشخیص داده خواهد شد.

در مقابل، یک راه موثر برای محافظت پیام‌ها در برابر تغییرات عمدی استفاده از کدهای اعتبار سنجی پیام همچون HMAC است.

محاسبه سی‌آرسی[ویرایش]

برای محاسبه یک سی‌آرسی دودویی nبیتی، بیت‌های ورودی را در یک سطر بنویسید، و الگوی (n+1)بیتی را که نشان‌دهنده مقسوم علیه سی‌آرسی است (و چندجمله‌ای نامیده می‌شود) زیر سمت چپ‌ترین بیت قرار دهید. در زیر، اولین محاسبه برای ایجاد یک سی‌آرسی ۳بیتی نشان داده شده‌است:

11010011101100 <--- ورودی
          1011 <--- مقسوم علیه (4 بیت)
----
01100011101100 <--- نتیجه

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

00000000001110 <--- نتیجه محاسبه قبلی
1011           <--- مقسوم علیه
----
00000000000101 <--- باقی‌مانده (3 بیت)

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

مشخصات سی‌آرسی[ویرایش]

مفهوم سی‌آرسی به عنوان یک کد تشخیص خطا هنگام پیاده‌سازی آن در یک سامانه واقعی می‌تواند شامل برخی پیچیدگی‌های دیگر نیز باشد. در ذیل، تعدادی از آن‌ها آمده‌است:

  • یک پیاده‌سازی خاص ممکن است یک الگوی بیتی ثابت را پیشوند قرار دهد. این زمانی مفید است که خطاهای ساعتی ممکن است است بیت‌های صفر را در ابتدای پیام قرار دهد و در این صورت با این الگو قابل تشخیص است.
  • یک پیاده‌سازی خاص ممکن است به پیام n بیت صفر الحاق کند. این می‌تواند بررسی صحت پیامی را که سی‌آرسی به آن الحاق شده‌است ساده‌تر کند. در این روش پس از الحاق n بیت صفر و محاسبه مجدد سی‌آرسی، نتیجه دقیقاً صفر می‌شود و باقی‌مانده کافیست با صفر مقایسه شود.
  • یک پیاده‌سازی خاص ممکن است نتیجه را با یک الگوی ثابت XOR کند.
  • ترتیب بیت‌ها: برخی روش‌ها کم‌ارزش‌ترین بیت را نخست قرار می‌دهند و برخی بالعکس. ترتیب بیت‌ها در سخت‌افزارهای انتقال سریالی داده بسیار اهمیت دارد زیرا اکثر روش‌های انتقال که به صورت وسیع استفاده می‌شوند از الگوی ابتدا-کم‌ارزش‌ترین-بیت استفاده می‌کنند.
  • ترتیب بایت‌ها: در سی‌آرسی‌های چند بایتی، ممکن است این تردید پیش آید که آیا بایت منتقل شده اول، کم‌ارزش‌ترین بایت است یا باارزش‌ترین. به عنوان مثال در برخی روش‌ها بایت‌های سی‌آرسی ۱۶بیتی را جابجا می‌کنند.
  • حذف باارزش‌ترین بیت چندجمله‌ای مقسم: از آنجایی که باارزش‌ترین بیت همیشه یک است، و از آنجایی که یک سی‌آرسی nبیتی باید به صورت یک مقسوم علیه (n+1)بیتی تعریف شود و در این صورت می‌تواند از یک ثبات nبیتی سرریز می‌شود، برخی نویسندگان بیان بیت بالای مقسوم علیه را غیرضروری می‌دانند.

سی‌آرسی‌های پرکاربرد و استانده[ویرایش]

اگرچه سی‌آرسی‌ها از اجزای استانده‌های متعددی هستند اما خودشان، از منظر وجود الگوریتمی جهانی، استانده نیستند. به عنوان مثال دو چندجمله‌ای سی‌آرسی-۱۲[۲]، ده نوع مستند سی‌آرسی-۱۶ و چهار سی‌آرسی-۳۲ وجود دارد. این چندجمله‌ای‌ها عموماً بهترین چندجمله‌ای‌های ممکن نیستند. بین ۱۹۹۳ و ۲۰۰۴، کوپمن، کستاگنولی و سایرین فضای چندجمله‌ای‌ها تا ۱۶ بیت، 24 و ۳۲ بیتی را جهت یافتن مثال‌هایی با کارایی بهتر (از نظر فاصله هامنی برای یک طول پیام خاص) از چندجمله‌ای‌های پروتکل‌های پیشین بررسی کردند و بهترین آن‌ها را در جهت بهبود ظرفیت تشخیص خطای استانده‌های آتی منتشر کردند. به طور خاص، iSCSI یکی از یافته‌های این پژوهش را مورد استفاده قرار داده‌است.

جدول زیر تنها شامل چندجمله‌ای‌های مورد استفاده در الگوریتم‌های متداول است. همانطور که پیش‌تر توضیح داده شد هر پروتکل خاص می‌تواند دارای چینش‌های بیت مختلفی باشد. سی‌آرسی‌ها در پروتکل‌های تجاری ممکن است از مقدار اولیه خاص و XOR نهایی جهت مبهم‌سازی استفاده کنند ولی این کار استحکام رمزنگاری الگوریتم را افزایش نمی‌دهد.

توجه: در این جدول باازرش‌ترین بیت حذف شده است؛ جهت توضیح به قسمت مشخصات سی‌آرسی در بالا مراجعه کنید.

نام چندجمله‌ای نمایش: عادی یا قرینه (قرینه معکوس)
CRC-1 x + 1 (اغلب در سخت‌افزار؛ و همچنین معروف به بیت زوجیت) 0x1 or 0x1 (0x1)
CRC-4-ITU x^4 + x + 1 (ITU G.704، صفحه 12) 0x3 or 0xC (0x9)
CRC-5-EPC x^5 + x^3 + 1 (RFID نسل دوم[۳]) 0x09 or 0x12 (0x14)
CRC-5-ITU x^5 + x^4 + x^2 + 1 (ITU G.704، صفحه 9) 0x15 or 0x15 (0x1A)
CRC-5-USB x^5 + x^2 + 1 (بسته‌های USB) 0x05 or 0x14 (0x12)
CRC-6-ITU x^6 + x + 1 (ITU G.704، صفحه 3) 0x03 or 0x30 (0x21)
CRC-7 x^7 + x^3 + 1 (سامانه‌های مخابراتی, MMC, SD) 0x09 or 0x48 (0x44)
CRC-8-ATM x^8 + x^2 + x + 1 (ATM HEC) 0x07 or 0xE0 (0x83)
CRC-8-CCITT x^8 + x^7 + x^3 + x^2 + 1 (گذرگاه تک-سیم) 0x8D or 0xB1 (0xC6)
CRC-8-Dallas/Maxim x^8 + x^5 + x^4 + 1 (گذرگاه تک-سیم) 0x31 or 0x8C (0x98)
CRC-8 x^8 + x^7 + x^6 + x^4 + x^2 + 1 0xD5 or 0xAB (0xEA)
CRC-8-SAE J1850 x^8 + x^4 + x^3 + x^2 + 1 0x1D or 0xB8 (0x8E)
CRC-10 x^{10} + x^9 + x^5 + x^4 + x + 1 0x233 or 0x331 (0x319)
CRC-11 x^{11} + x^9 + x^8 + x^7 + x^2 + 1 (FlexRay) 0x385 or 0x50E (0x5C2)
CRC-12 x^{12} + x^{11} + x^3 + x^2 + x + 1 (سامانه‌های مخابراتی, 0x80F or 0xF01 (0xC07)
CRC-15-CAN x^{15} + x^{14} + x^{10} + x^8 + x^7 + x^4 + x^3 + 1 0x4599 or 0x4CD1 (0x62CC)
CRC-16-CCITT x^{16} + x^{12} + x^5 + 1 (سرآیندهای G.hn PHY, 802.15.4, X.25, V.41, CDMA, بلوتوث, XMODEM, HDLC,PPP, IrDA, BACnet؛ معروف به CRC-CCITT, MMC, SD) 0x1021 or 0x8408 (0x8810)
CRC-16-DNP x^{16} + x^{13} + x^{12} + x^{11} + x^{10} + x^8 + x^6 + x^5 + x^2 + 1 (DNP, IEC 870, M-Bus) 0x3D65 or 0xA6BC (0x9EB2)
CRC-16-IBM x^{16} + x^{15} + x^2 + 1 (SDLC, USB، غیره؛ و همچنین معروف به CRC-16) 0x8005 or 0xA001 (0xC002)
CRC-24 x^{24} + x^{22} + x^{20} + x^{19} + x^{18} + x^{16} + x^{14} + x^{13} + x^{11} + x^{10} + x^8 + x^7 + x^6 + x^3 + x + 1 (FlexRay) 0x5D6DCB or 0xD3B6BA (0xAEB6E5)
CRC-24-Radix-64  x^{24} + x^{23} + x^{18} + x^{17} + x^{14} + x^{11} + x^{10} + x^7 + x^6 + x^5 + x^4 + x^3 + x + 1 (OpenPGP) 0x864CFB or 0xDF3261 (0xC3267D)
CRC-30 x^{30} + x^{29} + x^{21} + x^{20} + x^{15} + x^{13} + x^{12} + x^{11} + x^{8} + x^{7} + x^{6} + x^{2} + x + 1 (CDMA) 0x2030B9C7 or 0x38E74301 (0x30185CE3)
CRC-32-IEEE 802.3 x^{32} + x^{26} + x^{23} + x^{22} + x^{16} + x^{12} + x^{11} + x^{10} + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1 (V.42, MPEG-2, PNG، کد مجموع POSIX) 0x04C11DB7 or 0xEDB88320 (0x82608EDB)
CRC-32C (Castagnoli) x^{32} + x^{28} + x^{27} + x^{26} + x^{25} + x^{23} + x^{22} + x^{20} + x^{19} + x^{18} + x^{14} + x^{13} + x^{11} + x^{10} + x^9 + x^8 + x^6 + 1 (G.hn payload) 0x1EDC6F41 or 0x82F63B78 (0x8F6E37A0)
CRC-32K (Koopman) x^{32} + x^{30} + x^{29} + x^{28} + x^{26} + x^{20} + x^{19} + x^{17} + x^{16} + x^{15} + x^{11} + x^{10} + x^{7} + x^{6} + x^{4} + x^{2} + x + 1 0x741B8CD7 or 0xEB31D82E (0xBA0DC66B)
CRC-32Q x^{32} + x^{31} + x^{24} + x^{22} + x^{16} + x^{14} + x^{8} + x^{7} + x^{5} + x^{3} + x + 1 (aviation; AIXM [۴]) 0x814141AB or 0xD5828281 (0xC0A0A0D5)
CRC-64-ISO x^{64} + x^4 + x^3 + x + 1 (HDLC — ISO 3309) 0x000000000000001B or 0xD800000000000000 (0x800000000000000D)
CRC-64-ECMA-182 x^{64} + x^{62} + x^{57} + x^{55} + x^{54} + x^{53} + x^{52} + x^{47} + x^{46} + x^{45} + x^{40} + x^{39} + x^{38} + x^{37} + x^{35} + x^{33} + x^{32} + x^{31} + x^{29} + x^{27} + x^{24} + x^{23} + x^{22} + x^{21} + x^{19} + x^{17} + x^{13} + x^{12} + x^{10} + x^9 + x^7 + x^4 + x + 1 (ECMA-182 صفحه 51) 0x42F0E1EBA9EA3693 or 0xC96C5795D7870F42 (0xA17870F5D4F51B49)

سی‌آرسی‌های زیر نیز وجود دارند ولی از نظر فنی کارایی ندارند و عمدتاً با توابع درهم‌سازی رمزی جایگزین شده‌اند:

  • سی‌آرسی-128 (IEEE)
  • سی‌آرسی-256 (IEEE)

منابع[ویرایش]

  • ویکی‌پدیای انگلیسی
  1. Peterson, W. Wesley. ; Brown, D. T.. Cyclic Codes for Error Detection. . Proceedings of the IRE 49 ({{{day}}} January ‎1961): 228. 
  2. (slib) Cyclic Checksum”.  Retrieved on 6 April 2008.
  3. Class-1 Generation-2 UHF RFID Protocol”. EPCglobal, 23 October 2008. 108 35. 
  4. AIXM Primer”. European Organisation for the Safety of Air Navigation, 20 March 2006. 

پیوند به بیرون[ویرایش]

ابزارهای برخط[ویرایش]