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

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

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

مشخصهٔ رمز
----------

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

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

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

| عملگر | تعریف | توضیح |
| --- | --- | --- |
| + | {\displaystyle x+y\,mod\,2^{32}} | {\displaystyle 0\leqslant x,y<2^{32}} |
| {\displaystyle \boxminus } | {\displaystyle x-y\,mod\,512} | {\displaystyle 0\leqslant x,y<2^{32}} |
| {\displaystyle \oplus } | {\displaystyle Xor} | {\displaystyle 0\,\oplus \,1=1\;,\;1\,\oplus \,1=0} |
| {\displaystyle \parallel } | الحاق | مثال: {\displaystyle 000\parallel 11\,=\,00011} |
| {\displaystyle \gg } | {\displaystyle x\gg n} | عدد x را n بیت به سمت راست شیفت می‌دهد. |
| {\displaystyle \ll } | {\displaystyle x\ll n} | عدد x را n بیت به سمت چپ شیفت می‌دهد. |
| {\displaystyle \ggg } | {\displaystyle x\ggg n:(x\gg n)\oplus (x\ll (32-n))} | {\displaystyle 0\leqslant n<32\;,\;0\leqslant x<2^{32}} |
| {\displaystyle \lll } | {\displaystyle x\lll n:(x\ll n)\oplus (x\gg (32-n))} | {\displaystyle 0\leqslant n<32\;,\;0\leqslant x<2^{32}} |

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

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

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

{\displaystyle f\_{1}(x)=(x\ggg 7)\oplus (x\ggg 18)\oplus (x\gg 3)}

{\displaystyle f\_{2}(x)=(x\ggg 17)\oplus (x\ggg 19)\oplus (x\gg 10)}

{\displaystyle g\_{1}(x,\,y,\,z)=((x\ggg 10)\oplus (z\ggg 23))+(y\ggg 8)}

{\displaystyle g\_{2}(x,\,y,\,z)=((x\lll 10)\oplus (z\lll 23))+(y\lll 8)}

{\displaystyle h\_{1}(x)=Q[x\_{0}]+Q[256+x\_{2}]}

{\displaystyle h\_{2}(x)=P[x\_{0}]+P[256+x\_{2}]}

که x یک کلمهٔ ۳۲-بیتی به صورت {\displaystyle x=x\_{3}||x\_{2}||x\_{1}||x\_{0}} است، {\displaystyle 0\leqslant i<4\;,x\_{i}:(8-bits)}، که در آن {\displaystyle x\_{0}} کم ارزش‌ترین بایت و {\displaystyle x\_{3}} پر ارزش‌ترین بایت است.

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

#### گسترش کلید

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

{\displaystyle K=K\_{0}\parallel K\_{1}\parallel K\_{2}\parallel K\_{3}}

{\displaystyle IV=IV\_{0}\parallel IV\_{1}\parallel IV\_{2}\parallel IV\_{3}}

همچنین فرض کنید به ازای هر {\displaystyle 0\leqslant i<4}،

{\displaystyle K\_{i+4}=K\_{i},IV\_{i+4}=IV\_{i}}

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

{\displaystyle W\_{i}={\begin{array}{ll}\{&{\begin{array}{ll}K\_{i}&0\leq i\leq 7\\{\text{IV}}\_{i-8}&8\leq i\leq 15\\f\_{2}\left(W\_{i-2}\right)+W\_{i-7}+f\_{1}\left(W\_{i-15}\right)+W\_{i-16}+i&16\leq i\leq 1279\\\end{array}}\\\end{array}}}
(W دارای ۱۲۸۰ خانهٔ ۳۲-بیتی است)

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

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

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

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

به ازای هر i، {\displaystyle 0\leqslant i\leqslant 511}:

{\displaystyle P[i]=W\_{i+256}}

{\displaystyle Q[i]=W\_{i+768}}

#### ۱۰۲۴ گام

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

{\displaystyle for\;i=0\;to\;511\;do:}

```
    {\displaystyle P[i]=(P[i]+g\_{1}(P[i\boxminus 3],P[i\boxminus 10],P[i\boxminus 511]))\oplus h\_{1}(P[i\boxminus 12])}
```

{\displaystyle for\;i=0\;to\;511\;do:}

```
    {\displaystyle Q[i]=(Q[i]+g\_{2}(Q[i\boxminus 3],Q[i\boxminus 10],Q[i\boxminus 511]))\oplus h\_{2}(P[i\boxminus 12])}
```

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

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

j=i mod 512

if(i mod 1024 <۵۱۲) {

```
   {\displaystyle P[i]=(P[i]+g\_{1}(P[i\boxminus 3],P[i\boxminus 10],P[i\boxminus 511]))}
```

```
   {\displaystyle s\_{i}=h\_{1}(P[j\boxminus 12])\oplus P[j]}
```

}

else{

```
   {\displaystyle Q[i]=(Q[i]+g\_{2}(Q[i\boxminus 3],Q[i\boxminus 10],Q[i\boxminus 511]))}
```

```
   {\displaystyle s\_{i}=h\_{2}(Q[j\boxminus 12])\oplus Q[j]}
```

}

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

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

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

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

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

منابع
-----



* hc 128.pdf
* HC-256. (2013, March 27). In Wikipedia, The Free Encyclopedia. Retrieved 13:49, April 4, 2013,

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

*