اچ‌سی-۱۲۸

این الگوریتم توسط Hongjun Wu، ارائه شد.
رمز دنبالیه‌ای اچ‌سی-۱۲۸ یک نسخه ساده از اچ‌سی-۲۵۶ می‌باشد.
الگوریتم HC-۱۲۸ ساده، امن و در پیاده‌سازی نرم‌افزاری کارا است که جزئیات آن به صورت رایگان در دسترس می‌باشد.
HC-۱۲۸ حاوی دو جدول مخفی است که هرکدام ۵۱۲ عضو ۳۲ بیتی دارند. در هر مرحله یک عضو از جدول را به وسیله یک تابع غیر خطی به روزرسانی می‌کنیم (پس بعد از ۵۱۲×۲=۱۰۲۴ مرحله تمام اعضای این جداول به روزرسانی می‌شود) همچنین در هر مرحله یک خروجی ۳۲ بیتی به وسیله یک تابع غیر خطی ایجاد می‌شود. و در نهایت جهت رمز کردن پیام، پیام را با خروجی حاصل از الگوریتم HC-۱۲۸، جمع (به پیمانه ۲) می‌کنیم. (یا به عبارت دیگر پیام را با خروجی این الگوریتم Xor می‌کنیم.)
در HC-۱۲۸ وابستگی بین عملیت‌ها خیلی کم است بنابراین سه مرحله متوالی در HC-۱۲۸ را می‌توان به صورت موازی انجام داد. همچنین در هر مرحله تابع به روز رسانی‌کننده و تابعی که خروجی را تولید می‌کند قابلیت این را دارند که به صورت موازی پیاده‌سازی شوند.
مشخصه رمز
در این قسمت ما به توصیف HC-۱۲۸ می‌پردازیم، که با استفاده از یک کلید ۱۲۸-بیتی ورودی و بردار ۱۲۸-بیتی اولیه، کلیدی به طول ۲ ۶۴ تولید می‌کند.
عملگرها، متغیرها و توابع
عملگرهای زیر در HC-۱۲۸ استفاده شده‌اند:
عملگر
تعریف
توضیح
الحاق
مثال:
عدد x را n بیت به سمت راست شیفت می‌دهد.
عدد x را n بیت به سمت چپ شیفت می‌دهد.
دو جدول P و Q در HC-۱۲۸ استفاده شده‌است. کلید و بردار اولیه در HC-۱۲۸ به ترتیب با K و IV نام‌گذاری شده‌اند. ما کلیدی که قرار است تولید بشود را با s نمایش می‌دهیم.
متغیر
توضیح
P
یک جدول با ۵۱۲ عضو ۳۲-بیتی که هر عضو را با Pi نمایش می‌دهیم. که
Q
یک جدول با ۵۱۲ عضو ۳۲-بیتی که هر عضو را با Qi نمایش می‌دهیم. که
K
کلید ۱۲۸-بیتی HC-128.
IV
بردار اولیه ۱۲۸-بیتی HC-128.
s
کلیدی (keystream) که HC-۱۲۸ تولید می‌کند. عدد ۳۲-بیتی تولید شده به عنوان خروجی در مرحله iام را با نمایش می‌دهیم. بنابراین
شش تابع در HC-۱۲۸ استفاده می‌شود:
که x یک کلمه ۳۲-بیتی به صورت است، ، که در آن کم ارزش‌ترین بایت و پر ارزش‌ترین بایت است.
فرایند اولیه
گسترش کلید
روند بازگشتی جهت گسترش کلید الگوریتم اچ-سی-۱۲۸
کلید K و برداراولیه IV را به چهار قسمت مساوی (هر قسمت ۳۲-بیت) به صورت زیر تقسیم می‌کنیم:
همچنین فرض کنید به ازای هر ،
حال کلید گسترش یافته 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، :
۱۰۲۴ گام
با ۱۰۲۴ گام عناصر جداول P و Q را جایگزین می‌کنیم:
for\;i = 0\;to\;511\;do:
for\;i = 0\;to\;511\;do:
الگوریتم تولید کلید (KeyStream) (خروجی)
روند زیر را تا جایی که خروجی به اندازه کافی تولید شود، تکرار کنید:
j=i mod 512
if(i mod 1024 <۵۱۲) {
else{
بررسی امنیت HC-۱۲۸
تصادفی بودن کلید تولید شده توسط HC-۱۲۸
پیاده‌سازی HC-۱۲۸
پیچیدگی الگوریتم HC-۱۲۸
پیاده‌سازی به زبان ++C