اچ‌سی-۱۲۸

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

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

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

## مشخصهٔ رمز

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

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

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

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

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

f_1(x)=(x \ggg 7) \oplus (x \ggg 18) \oplus (x \gg 3)

f_2(x)=(x \ggg 17) \oplus (x \ggg 19) \oplus (x \gg 10)

g_1 (x,\, y,\, z) = ((x \ggg 10) \oplus (z \ggg 23)) + (y \ggg 8)

g_2 (x,\, y,\, z) = ((x \lll 10) \oplus (z \lll 23)) + (y \lll 8)

h_1(x)=Q[x_0]+Q[256+x_2]

h_2(x)=P[x_0]+P[256+x_2]

که x یک کلمهٔ ۳۲-بیتی به صورت x=x_3||x_2||x_1||x_0 است،  0\leqslant i ، که در آن  x_0  کم ارزش‌ترین بایت و  x_3  پر ارزش‌ترین بایت است.

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

K=K_0\parallel K_1 \parallel K_2\parallel K_3

IV=IV_0\parallel IV_1 \parallel IV_2\parallel IV_3

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

K_{i+4}=K_i, IV_{i+4}=IV_{i}

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


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،  0\leqslant i \leqslant 511 :

P[i]=W_{i+256}

Q[i]=W_{i+768}

#### ۱۰۲۴ گام

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


for\;i = 0\;to\;511\;do:


     	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])


for\;i = 0\;to\;511\;do:


     	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 	P[i]=(P[i]+g_1(P[i \boxminus 3],P[i\boxminus 10],P[i\boxminus 511]))

     s_i = h_1(P[j \boxminus 12]) \oplus P[j] 
}

else{
    	Q[i]=(Q[i]+g_2(Q[i \boxminus 3],Q[i\boxminus 10],Q[i\boxminus 511]))

     s_i = h_2(Q[j \boxminus 12]) \oplus Q[j] 
}

## بررسی امنیت HC-۱۲۸
## تصادفی بودن کلید تولید شده توسط HC-۱۲۸
## پیاده‌سازی HC-۱۲۸
### پیچیدگی الگوریتم HC-۱۲۸
### پیاده‌سازی به زبان ++C

## منابع

* hc 128.pdf
* [//en.wikipedia.org/w/index.php?title=HC-256&oldid=547281111 HC-256. (2013, March 27). In Wikipedia, The Free Encyclopedia. Retrieved 13:49, April 4, 2013, ]

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

* http://www.ecrypt.eu.org/stream/e2-hc128.html

رده:رمز دنباله‌ای
رده:رمزنگاری
رده:مقاله‌های ایجادشده توسط ایجادگر