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

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

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

مشخصهٔ رمز ویرایش

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

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

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

عملگر تعریف توضیح
+    
     
     
  الحاق مثال:  
    عدد x را n بیت به سمت راست شیفت می‌دهد.
    عدد x را n بیت به سمت چپ شیفت می‌دهد.
     
     

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

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

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

 

 

 

 

 

 

که x یک کلمهٔ ۳۲-بیتی به صورت   است،  ، که در آن   کم ارزش‌ترین بایت و   پر ارزش‌ترین بایت است.

فرایند اولیه ویرایش

گسترش کلید ویرایش

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

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

 

 

همچنین فرض کنید به ازای هر  ،

 

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

  (W دارای ۱۲۸۰ خانهٔ ۳۲-بیتی است)

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

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

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

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

به ازای هر i،  :

 

 

۱۰۲۴ گام ویرایش

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

 

     

 

     

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

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

j=i mod 512

if(i mod 1024 <۵۱۲) {

    
    

}

else{

    
    

}

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

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

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

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

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

منابع ویرایش

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