اچ‌سی-۱۲۸

از testwiki
نسخهٔ تاریخ ۸ مهٔ ۲۰۱۸، ساعت ۰۲:۳۴ توسط imported>FreshmanBot (اصلاح فاصله مجازی + اصلاح نویسه با استفاده از AWB)
(تفاوت) → نسخهٔ قدیمی‌تر | نمایش نسخهٔ فعلی (تفاوت) | نسخهٔ جدیدتر ← (تفاوت)
پرش به ناوبری پرش به جستجو

این الگوریتم توسط Hongjun Wu، ارائه شد. رمز دنبالیه‌ای اچ‌سی-۱۲۸ یک نسخهٔ ساده از اچ‌سی-۲۵۶ می‌باشد. الگوریتم HC-۱۲۸ ساده، امن و در پیاده‌سازی نرم‌افزاری کارا است که جزئیات آن به صورت رایگان در دسترس می‌باشد.

HC-۱۲۸ حاوی دو جدول مخفی است که هرکدام ۵۱۲ عضو ۳۲ بیتی دارند. در هر مرحله یک عضو از جدول را به وسیلهٔ یک تابع غیر خطی به روزرسانی می‌کنیم (پس بعد از ۵۱۲×۲=۱۰۲۴ مرحله تمام اعضای این جداول به روزرسانی می‌شود) همچنین در هر مرحله یک خروجی ۳۲ بیتی به وسیلهٔ یک تابع غیر خطی ایجاد می‌شود. و در نهایت جهت رمز کردن پیام، پیام را با خروجی حاصل از الگوریتم HC-۱۲۸، جمع (به پیمانهٔ ۲) می‌کنیم. (یا به عبارت دیگر پیام را با خروجی این الگوریتم Xor می‌کنیم.)

در HC-۱۲۸ وابستگی بین عملیت‌ها خیلی کم است بنابراین سه مرحلهٔ متوالی در HC-۱۲۸ را می‌توان به صورت موازی انجام داد. همچنین در هر مرحله تابع به روز رسانی‌کننده و تابعی که خروجی را تولید می‌کند قابلیت این را دارند که به صورت موازی پیاده‌سازی شوند.

مشخصهٔ رمز

در این قسمت ما به توصیف HC-۱۲۸ می‌پردازیم، که با استفاده از یک کلید ۱۲۸-بیتی ورودی و بردار ۱۲۸-بیتی اولیه، کلیدی به طول ۲۶۴ تولید می‌کند.

عملگرها، متغیرها و توابع

عملگرهای زیر در HC-۱۲۸ استفاده شده‌اند:

عملگر تعریف توضیح
+ x+ymod232 0x,y<232
xymod512 0x,y<232
Xor 01=1,11=0
الحاق مثال: 00011=00011
xn عدد x را n بیت به سمت راست شیفت می‌دهد.
xn عدد x را n بیت به سمت چپ شیفت می‌دهد.
xn:(xn)(x(32n)) 0n<32,0x<232
xn:(xn)(x(32n)) 0n<32,0x<232

دو جدول P و Q در HC-۱۲۸ استفاده شده‌است. کلید و بردار اولیه در HC-۱۲۸ به ترتیب با K و IV نام‌گذاری شده‌اند. ما کلیدی که قرار است تولید بشود را با s نمایش می‌دهیم.

متغیر توضیح
P یک جدول با ۵۱۲ عضو ۳۲-بیتی که هر عضو را با [P[i نمایش می‌دهیم. که 0i<511
Q یک جدول با ۵۱۲ عضو ۳۲-بیتی که هر عضو را با [Q[i نمایش می‌دهیم. که 0i<511
K کلید ۱۲۸-بیتی HC-128.
IV بردار اولیه ۱۲۸-بیتی HC-128.
s کلیدی (keystream) که HC-۱۲۸ تولید می‌کند. عدد ۳۲-بیتی تولید شده به عنوان خروجی در مرحلهٔ iام را با si نمایش می‌دهیم. بنابراین s=s0s1...

شش تابع در HC-۱۲۸ استفاده می‌شود:

f1(x)=(x7)(x18)(x3)

f2(x)=(x17)(x19)(x10)

g1(x,y,z)=((x10)(z23))+(y8)

g2(x,y,z)=((x10)(z23))+(y8)

h1(x)=Q[x0]+Q[256+x2]

h2(x)=P[x0]+P[256+x2]

که x یک کلمهٔ ۳۲-بیتی به صورت x=x3||x2||x1||x0 است، 0i<4,xi:(8bits)، که در آن x0 کم ارزش‌ترین بایت و x3 پر ارزش‌ترین بایت است.

فرایند اولیه

گسترش کلید

روند بازگشتی جهت گسترش کلید الگوریتم اچ-سی-۱۲۸

کلید K و برداراولیه IV را به چهار قسمت مساوی (هر قسمت ۳۲-بیت) به صورت زیر تقسیم می‌کنیم:

K=K0K1K2K3

IV=IV0IV1IV2IV3

همچنین فرض کنید به ازای هر 0i<4،

Ki+4=Ki,IVi+4=IVi

حال کلید گسترش یافتهٔ W را به صورت زیر می‌سازیم:

Wi={Ki0i7IVi88i15f2(Wi2)+Wi7+f1(Wi15)+Wi16+i16i1279 (W دارای ۱۲۸۰ خانهٔ ۳۲-بیتی است)

به روزرسانی جداول P و Q با کلید گسترش یافته

جداول P و Q هر کدام ۵۱۲ خانه دارند، پس برای به روزرسانی آن‌ها به ۱۰۲۴ دادهٔ جدید نیاز داریم. که این داده‌ها قرار است از کلید گسترش یافتهٔ W تأمین شود اما همانطور که دیده می‌شود W حاوی ۱۲۸۰ خانه است یا به عبارتی ۲۵۶ خانه بیشتر از مقدار مورد نیاز است. یک سوالی که در اینجا به ذهن می‌رسد چرا باید ۲۵۶ خانهٔ حافظه را بیشتر مصرف کنیم؟ بهترین توجیه برای این مسئله این است:

همانطور که در شیوهٔ ساخت W مشاهده می‌کنید، در ساخت ۲۵۶ خانهٔ اول W از یکی از مقادیر کلید K و بردار اولیه IV به‌طور مستقیم استفاده شده‌است و
این از نظر طراح الگوریتم ضعف امنیتی تلقی شده‌است بنابراین در W به تعداد ۲۵۶ خانهٔ بیشتر ایجاد کرده‌است تا در نهایت بتواند هنگام مقدار دهی
جداول P و Q از ۲۵۶ خانهٔ اول W صرف نظر کند و بدین ترتیب این مشکل را حل کند.

جداول P و Q را به صورت زیر مقدار دهی می‌کنیم:

به ازای هر i، 0i511:

P[i]=Wi+256

Q[i]=Wi+768

۱۰۲۴ گام

با ۱۰۲۴ گام عناصر جداول P و Q را جایگزین می‌کنیم:

fori=0to511do:

الگو:چپ‌چین

    P[i]=(P[i]+g1(P[i3],P[i10],P[i511]))h1(P[i12])

الگو:پایان چپ‌چین

fori=0to511do:

الگو:چپ‌چین

    Q[i]=(Q[i]+g2(Q[i3],Q[i10],Q[i511]))h2(P[i12])

الگو:پایان چپ‌چین

الگوریتم تولید کلید (KeyStream) (خروجی)

روند زیر را تا جایی که خروجی به اندازهٔ کافی تولید شود، تکرار کنید:

الگو:چپ‌چین j=i mod 512

if(i mod 1024 <۵۱۲) {

   P[i]=(P[i]+g1(P[i3],P[i10],P[i511]))
   si=h1(P[j12])P[j]

}

else{

   Q[i]=(Q[i]+g2(Q[i3],Q[i10],Q[i511]))
   si=h2(Q[j12])Q[j]

} الگو:پایان چپ‌چین

بررسی امنیت HC-۱۲۸

تصادفی بودن کلید تولید شده توسط HC-۱۲۸

پیاده‌سازی HC-۱۲۸

پیچیدگی الگوریتم HC-۱۲۸

پیاده‌سازی به زبان ++C

منابع

الگو:پانویس الگو:چپ‌چین

الگو:پایان چپ‌چین

پیوند به بیرون

الگو:چپ‌چین

الگو:پایان چپ‌چین