کامپیوترها اعداد تصادفی را برای کاربردهای مختلف، از رمزنگاری گرفته تا بازیهای کامپیوتری و شرط بندی، تولید میکنند. بهطورکلی، دو دسته اعداد تصادفی وجود دارند: اعداد تصادفی واقعی و اعداد شبه تصادفی. تفاوت بین این دو نوع برای امنیت سیستمهای رمزنگاری حائز اهمیت است.
این موضوع، اخیرا جنجالیتر شده است و بسیاری از افراد، قابلاطمینان بودن چیپ داخلی تولیدکننده اعداد تصادفی که توسط شرکت اینتل ساخته شده را زیر سوال بردهاند. برای این که بهتر درک کنید چرا این چیپ ممکن است قابلاطمینان نباشد باید اول درک کنید اعداد تصادفی چگونه تولید میشوند و برای چهکارهایی استفاده میشوند.
اعداد تصادفی برای چه کاری استفاده میشوند؟
هزاران سال است که از اعداد تصادفی استفاده میشود. چه این کار از طریق پرتاب سکه رخ دهد و چه از طریق پرتاب تاس انجام بگیرد، هدف این است که نتیجه نهایی را به شانسی تصادفی واگذار کرد. تولیدکنندههای اعداد تصادفی در کامپیوترها نیز به همین شکل هستند. درواقع آنها تلاشی برای به دست آوردن نتایج غیرقابلپیشبینی و تصادفی هستند.
تولیدکنندههای اعداد تصادفی برای کاربردهای مختلفی مفید هستند. به غیر از کاربردهای واضحی مثل تولید اعداد تصادفی برای شرط بندی یا ایجاد شرایط غیرقابلپیشبینی در بازیهای کامپیوتری، تصادفی بودن در رمزنگاری بسیار مهم است.
رمزنگاری به اعدادی نیاز دارد که مهاجمان نتوانند آن را حدس بزنند. مشخص است که نمیتوانیم بهطور مداوم از اعدادی مشخص استفاده کنیم. هدف ما این است که این اعداد را به طریقی کاملا غیرقابلپیشبینی تولید کنیم تا مهاجمان نتوانند آنها را حدس بزنند. این اعداد تصادفی برای یک رمزنگاری ایمن، چه برای رمزنگاری فایلهای شخصی خودتان باشد و چه برای استفاده از یک وبسایت HTTPS در اینترنت، کاملا ضروری هستند.
اعداد تصادفی واقعی
شاید برای شما سوال شده باشد که یک کامپیوتر چگونه میتواند یک عدد تصادفی تولید کند. این “تصادفی بودن” از کجا میآید؟ اگر این تولیدکننده تنها یک کد کامپیوتری است، آیا ممکن نیست که اعداد تصادفی که کامپیوتر تولید میکند قابل پیشبینی باشند؟
بهطورکلی ما اعداد تصادفی که توسط کامپیوترها تولید میشوند را بسته به چگونگی تولیدشان، به دو دسته تقسیمبندی میکنیم: اعداد تصادفی واقعی و اعداد شبه تصادفی.
برای تولید یک عدد تصادفی واقعی، کامپیوتر نوعی پدیده فیزیکی را که در بیرون از کامپیوتر رخ میدهد، اندازهگیری میکند. برای مثال، یک کامپیوتر میتواند واپاشی هستهای یک اتم را اندازهگیری کند. مطابق نظریه کوانتوم، هیچ راهی وجود ندارد که بتوان بهطور قطعی دانست واپاشی هستهای در چه زمانی اتفاق میافتد. پس این درواقع، “تصادفی بودن خالص” ناشی از جهان هستی است. یک مهاجم نمیتواند پیشبینی کند که واپاشی هستهای در چه زمانی اتفاق میافتد، پس نمیتواند آن مقدار تصادفی را نیز پیدا کند.
بهعنوان یک مثال آشناتر، کامپیوترها میتوانند از نویزهای جوی یا حتی سادهتر از آن، از زمان دقیق فشار دادن دکمههای کیبورد بهعنوان منبع دادههای غیرقابلپیشبینی، یا آنتروپی، استفاده کنند. برای مثال، ممکن است کامپیوتر شما فشرده شدن یک کلید در دقیقا 0.23423523 ثانیه پس از ساعت 2 بعد از ظهر را ثبت کند. با جمعآوری تعداد کافی از زمانهای مربوط به فشرده شدن کلیدها، یک منبع آنتروپی خواهید داشت که میتوانید از آن برای تولید یک عدد تصادفی واقعی استفاده کنید. شما یک ماشین قابل پیشبینی نیستید، پس فرد مهاجم نمیتواند زمان دقیق فشرده شدن کلیدهای کیبورد توسط شما را حدس بزند. دستگاه /dev/random، که در لینوکس اعداد تصادفی تولید میکند، تا زمانی که آنتروپی کافی برای تولید یک عدد تصادفی واقعی به دست نیاورد، درخواستهای کاربر را رد کرده و نتیجهای نمایش نمیدهد.
اعداد شبه تصادفی
اعداد شبه تصادفی گزینه دیگری در برابر اعداد تصادفی واقعی هستند. یک کامپیوتر میتواند از یک مقدار اولیه و یک الگوریتم برای تولید اعدادی که تصادفی به نظر میرسند، اما در حقیقت قابل پیشبینی هستند، استفاده کند. در این حالت، کامپیوتر هیچ داده تصادفی از محیط جمعآوری نمیکند.
این نکته الزاما در همهجا چیز بدی نیست. برای مثال، وقتی در حال انجام یک بازی کامپیوتری هستید، دیگر خیلی اهمیت ندارد که رویدادهایی که در بازی اتفاق میافتند ناشی از اعداد تصادفی واقعی هستند یا اعداد شبه تصادفی. از طرف دیگر، واضح است که اگر از رمزنگاری استفاده میکنید، نباید از اعداد شبه تصادفی که فرد مهاجم میتواند آنها را حدس بزند، استفاده کنید.
برای مثال، فرض کنید فرد مهاجم، الگوریتم و مقدار آغازینی را که یک تولیدکننده اعداد شبه تصادفی از آنها استفاده میکند، میداند. و همچنین فرض کنید که یک الگوریتم رمزنگاری، یک عدد شبه تصادفی را از این الگوریتم دریافت کرده و بدون اضافه کردن هیچگونه تصادفی بودن دیگری، از آن برای تولید یک کلید رمزنگاری استفاده میکند. اگر فرد مهاجم اطلاعات کافی در دست داشته باشد، میتوانند با برگشت به عقب و تعیین عدد شبه تصادفی که الگوریتم رمزنگاری انتخاب کرده، کلید را به دست آورده و رمزنگاری را بشکند.
تولیدکنندههای سختافزاری اعداد تصادفی ساخت اینتل و آژانس امنیت ملی آمریکا
برای راحتتر کردن کار توسعهدهندگان و کمک به تولید اعداد تصادفی امن، چیپ های شرکت اینتل دارای یک تولیدکننده سختافزاری اعداد تصادفی هستند که با نام RdRand شناخته میشود. این چیپ، از یک منبع آنتروپی بر روی پردازنده استفاده میکند و وقتی یک نرمافزار درخواست عدد تصادفی میکند، این چیپ عدد تصادفی تولیدشده را به نرمافزار ارائه میدهد.
مشکل اینجاست که این تولیدکننده اعداد تصادفی درواقع یک سیستم جعبه سیاه به شمار میرود و ما ازآنچه در داخل آن اتفاق میافتد خبر نداریم. اگر RdRand دارای یک در پشتی متعلق به آژانس امنیت ملی آمریکا یا سایر سازمانهای اطلاعاتی باشد، دولت میتواند رمزنگاریهایی را که تنها با استفاده از دادههای تامین شده توسط آن تولیدکننده اعداد تصادفی ایجادشدهاند، بشکند.
این یک نگرانی جدی به شمار میرود. در ماه دسامبر سال 2013، توسعهدهندگان سیستم عامل FreeBSD، با اعلام غیر قابلاطمینان بودن این سیستم، پشتیبانی از استفاده مستقیم از RdRand، بهعنوان منبع تصادفی بودن را متوقف کردند. در این حالت، خروجی RdRand بهعنوان ورودی یک الگوریتم دیگر در نظر گرفته میشود که آنتروپی اضافی را به مسئله وارد میکند. با این کار، اطمینان حاصل میشود که هرگونه در پشتی در تولیدکننده اعداد تصادفی، اهمیتی نخواهد داشت. لینوکس قبلا نیز به این شیوه عمل میکرد و دادههایی را که از RdRand به دست میآمد، تصادفیتر میکرد تا در صورت وجود هرگونه در پشتی، کلید تولیدشده قابل پیشبینی نباشد. در یکی از جلسات پرسش و پاسخ اخیر در وبسایت Reddit، مدیر اجرایی شرکت اینتل، آقای برایان کرانیچ، به سوالات مربوط به این نگرانیها پاسخ نداد.
البته، این نگرانی تنها مربوط به چیپ های اینتل نیست. توسعهدهندگان سیستم عامل FreeBSD، از چیپ های تولیدشده توسط شرکت Via نیز نام بردند. این جنجالها نشان میدهد که چرا تولید اعداد تصادفی که واقعا تصادفی بوده و قابل پیشبینی نباشند، بسیار مهم است.