تخطي إلى المحتوى الرئيسي

الإنتروبيا والعشوائية في العملات المشفرة: لماذا تهم

كل مفتاح خاص للعملات المشفرة، وكل عبارة البذرة، وكل عنوان تستخدمه يبدأ برقم عشوائي. يعتمد أمان محفظتك بالكامل على افتراض واحد: أن هذا الرقم كان حقاً غير متوقع. إذا كان مولد الأرقام العشوائية الذي أنتج مفتاحك ضعيفاً أو منحازاً أو يمكن التنبؤ به، يمكن سرقة أموالك — لا من خلال كسر التشفير، بل بتخمين المفتاح.

يشرح هذا الدليل معنى الإنتروبيا في سياق التشفير، وكيف تعمل مولدات الأرقام العشوائية، وما حدث تاريخياً عندما فشلت العشوائية، وكيفية التأكد من أن إنشاء مفتاحك صحيح.

ما هي الإنتروبيا؟

في نظرية المعلومات، تقيس الإنتروبيا كمية عدم اليقين أو عدم القابلية للتنبؤ في البيانات. في التشفير، تحدد الإنتروبيا عدد بتات العشوائية الحقيقية الموجودة في القيمة.

يجب أن يحتوي مفتاح خاص بـ 256 بت على 256 بت من الإنتروبيا — مما يعني أن المهاجم يجب أن يحاول، في المتوسط، 2^255 تخمين للعثور عليه (نصف مساحة البحث، في المتوسط). إذا تم إنشاء المفتاح بـ 32 بت فقط من الإنتروبيا الفعلية (لأن مولد الأرقام العشوائية كان معيباً)، يحتاج المهاجم فقط إلى حوالي 2^31 تخمين — حوالي ملياري — والتي يمكن لجهاز كمبيوتر حديث استنزافها في دقائق.

قياس الإنتروبيا

يتم قياس الإنتروبيا بالبتات. الإنتروبيا للمتغير العشوائي X هي:

H(X) = -sum(p(x) * log2(p(x))) لجميع القيم الممكنة x

لرقم موحد عشوائي بـ 256 بت:

  • كل بت له احتمالية 0.5 أن يكون 0 أو 1.
  • الإنتروبيا = 256 بت (الحد الأقصى لهذا الحجم).

لمولد منحاز حيث كل بت له احتمالية 0.7 أن يكون 1:

  • الإنتروبيا لكل بت = -(0.7 * log2(0.7) + 0.3 * log2(0.3)) = 0.881 بت.
  • إجمالي الإنتروبيا لـ 256 بت = 225.5 بت (11.9٪ أقل من المثالي).

حتى التحيزات الصغيرة تتراكم على عدة بتات ويمكن أن تقلل بشكل كبير من مستوى الأمان الفعلي.

الإنتروبيا في سياق BIP-39

طول العبارة الاختزاليةالإنتروبيامستوى الأمانالقوة الغاشمة بـ 10^12/ثانية
12 كلمة128 بت128 بت~10^19 سنة
15 كلمة160 بت160 بت~10^28 سنة
18 كلمة192 بت192 بت~10^38 سنة
24 كلمة256 بت256 بت~10^57 سنة

تفترض هذه الأرقام أن الإنتروبيا موحدة حقاً. إذا كان مولد الأرقام العشوائية معيباً، فقد يكون مستوى الأمان الفعلي أقل بكثير.

أنواع مولدات الأرقام العشوائية

مولدات الأرقام العشوائية الحقيقية (TRNG)

تأخذ TRNG عينات من الظواهر الفيزيائية التي تكون غير قابلة للتنبؤ بها بشكل متأصل على المستوى الكمي:

  • الضوضاء الحرارية — تقلبات الجهد العشوائية في المقاومات الناجمة عن الاهتزاز الحراري للإلكترونات.
  • ضوضاء الطلقة — تقلبات عشوائية في التيار بسبب الطبيعة المنفصلة لتدفق الإلكترون.
  • الاضمحلال الإشعاعي — توقيت أحداث الاضمحلال الفردية غير قابل للتنبؤ به بشكل أساسي.
  • الضوضاء الجوية — ضوضاء تردد الراديو من البرق والعمليات الجوية الأخرى.

تستخدم محافظ الأجهزة مثل Ledger و Trezor TRNGs على الشريحة. تأخذ هذه عينات من مصادر الضوضاء الفيزيائية ومعالجة الإخراج من خلال التبييض واختبارات الصحة.

المميزات: عشوائية حقيقية من الفيزياء؛ لا توجد حالة حتمية للتنبؤ بها. العيوب: معتمدة على الأجهزة؛ قد تفشل بصمت إذا تدهورت مصدر الضوضاء؛ قد يكون الإنتاجية محدودة.

مولدات الأرقام الزائفة الآمنة تشفيرياً (CSPRNG)

CSPRNG هي خوارزمية حتمية تنتج إخراجاً لا يمكن تمييزه عن العشوائية الحقيقية، بالنظر إلى بذرة عشوائية كافية:

  • Linux: /dev/urandom (يستخدم ChaCha20 أو شفرة مشابهة، مزروعة بإنتروبيا الأجهزة).
  • macOS: /dev/urandom (arc4random، مزروعة بإنتروبيا الأجهزة).
  • Windows: BCryptGenRandom (مزود CNG).
  • متصفحات الويب: crypto.getRandomValues() (تؤجل إلى CSPRNG نظام التشغيل).
  • Python: os.urandom() أو وحدة secrets.
  • Node.js: crypto.randomBytes().

المميزات: سريع؛ خوارزميات مدروسة جيداً؛ متوفر على جميع المنصات. العيوب: قوي فقط مثل إنتروبيا البذرة الأولية؛ حتمي — إذا كانت الحالة الداخلية معروفة، فإن جميع الإخراج المستقبلي يمكن التنبؤ به.

PRNGs غير التشفيرية (لا تستخدمها أبداً للمفاتيح)

تم تصميم وظائف الأرقام العشوائية في مكتبات البرامج القياسية في معظم لغات البرمجة للمحاكاة الإحصائية وليس التشفير:

  • Python: random.random() (Mersenne Twister — حتمي، حالة قابلة للاسترجاع من 624 مخرجات).
  • JavaScript: Math.random() (xorshift128+ في V8 — يمكن التنبؤ به).
  • C: rand() (مولد التطابق الخطي — يمكن التنبؤ به بشكل بسيط).
  • Java: java.util.Random (التطابق الخطي — يمكن التنبؤ به).

هذه المولدات لها إنتروبيا منخفضة وفترات قصيرة وحالة يمكن التنبؤ بها. استخدامها لإنشاء المفاتيح يعادل عدم استخدام أي عشوائية على الإطلاق. لا تولد مفاتيح خاصة أو عبارات بذرية باستخدام هذه الوظائف.

الأعطال التاريخية للعشوائية

خطأ Android SecureRandom (2013)

في أغسطس 2013، تم اكتشاف خلل حرج في تطبيق SecureRandom في Android. لم تكن PRNG Java مزروعة بشكل صحيح على بعض أجهزة Android، مما تسبب في أن تولد تطبيقات محفظة Bitcoin متعددة المفاتيح الخاصة من حالة يمكن التنبؤ بها. استغل المهاجم هذا لسرقة حوالي 55 BTC تقريباً. تأثر الخطأ بإنشاء التوقيع ECDSA nonce — استخدام نفس nonce مرتين يسمح بحساب المفتاح الخاص من توقيعين.

"Blockchain Bandit" (2019)

اكتشف باحث الأمان Adrian Bednarek أن المحافظ كانت قد تم إنشاؤها بمفاتيح خاصة ضعيفة جداً — مفاتيح مثل 1، 2، 3، أو كلمات قاموس بسيطة مدعومة مرة واحدة. كان المهاجم ينظف الأموال من هذه العناوين بشكل منهجي لسنوات، جاميع أكثر من 45000 ETH. ببساطة عدد المهاجم المفاتيح منخفضة الإنتروبيا والتحقق مما إذا كانت تحتفظ بالأموال.

أمثلة المفاتيح التي تم تصريفها:

  • المفتاح الخاص 0x0000000000000000000000000000000000000000000000000000000000000001 (الرقم 1)
  • المفاتيح الخاصة المشتقة من كلمات المرور والعبارات الشائعة

ثغرة Milk Sad (2023)

أمر seed في أداة libbitcoin-explorer (bx) استخدم Mersenne Twister مزروعة بـ 32 بت فقط من وقت النظام. هذا يعني أن جميع المفاتيح التي تم إنشاؤها باستخدام هذه الأداة كانت تحتوي على 32 بت على الأكثر من الإنتروبيا — تقريباً 4.3 مليار احتمالية. تم القوة الغاشمة على هذه المفاتيح من قبل المهاجمين وسرقة الأموال.

خطأ مفتاح Debian OpenSSL الضعيف (2008)

أزال محتفظ Debian بطريق الخطأ سطراً من الكود الذي وفر الإنتروبيا إلى مولد الأرقام العشوائية في OpenSSL. لمدة سنتين (2006-2008)، كان لكل مفتاح تشفيري تم إنشاؤه على أنظمة Debian و Ubuntu 15 بت فقط من الإنتروبيا من معرف العملية، مما ينتج عنه 32767 مفتاح فريد على الأكثر. تم انتهاك جميع مفاتيح SSH وشهادات SSL وأي مفاتيح عملة مشفرة تم إنشاؤها خلال هذه الفترة على الأنظمة المتأثرة.

الدروس المستفادة

  1. لا تثق أبداً بمصدر إنتروبيا واحد بدون التحقق.
  2. الأخطاء الصغيرة في التنفيذ يمكن أن تقلل بشكل كارثي من الإنتروبيا.
  3. يستغل المهاجمون بنشاط الضعف في العشوائية — فهي ليست نظرية.
  4. الكود مفتوح المصدر والمدقق ضروري للعمليات الحرجة الإنتروبيا.

مصادر الإنتروبيا بالتفصيل

تجمع الإنتروبيا لنظام التشغيل

تحتفظ أنظمة التشغيل الحديثة بتجمع إنتروبيا يتغذى بعدة مصادر:

  • توقيت المقاطعة — يوفر توقيت المقاطعات الأجهزة (لوحة المفاتيح والماوس والقرص والشبكة) مدخلاً غير متوقع.
  • توقيت I/O للقرص — يختلف توقيت عمليات القراءة / الكتابة على القرص بدقة بسبب العوامل الميكانيكية والإلكترونية.
  • RNG الأجهزة — تتضمن المعالجات الحديثة (Intel RDRAND و AMD) مولدات أرقام عشوائية على الشريحة.
  • إنتروبيا وقت التمهيد — بعض الأنظمة تحفظ الإنتروبيا عبر إعادة التمهيد (/var/lib/systemd/random-seed على Linux).

يخلط نظام التشغيل هذه المصادر في تجمع الإنتروبيا باستخدام البدائيات التشفيرية، ثم يستخدم التجمع لبذر CSPRNG الخاصة به. على نواة Linux الحديثة (5.18+)، سيتم حظر /dev/urandom حتى تم جمع إنتروبيا كافية عند التمهيد، ثم لن يتم حظره مرة أخرى.

إنتروبيا المتصفح (crypto.getRandomValues)

عند استخدام أداة قائمة على الويب مثل مولد SafeSeed، يتم استخدام واجهة برمجة تطبيقات المتصفح crypto.getRandomValues(). هذا يؤجل إلى CSPRNG نظام التشغيل:

  • Chrome: يؤجل إلى CSPRNG نظام التشغيل (BoringSSL).
  • Firefox: يؤجل إلى CSPRNG نظام التشغيل (NSS).
  • Safari: يؤجل إلى CSPRNG نظام التشغيل (CommonCrypto).

يعتبر هذا آمناً لإنشاء المفاتيح، بشرط أن يكون نظام التشغيل الأساسي آمناً. المصدر الرئيسي للقلق هو التشغيل في بيئة حيث يمكن تعريض CSPRNG نظام التشغيل للخطر (مثل جهاز افتراضي بدون مصادر إنتروبيا كافية، أو نظام تشغيل معرض للخطر).

إنتروبيا محفظة الأجهزة

تستخدم محافظ الأجهزة مولدات أرقام عشوائية حقيقية على الشريحة:

  • Ledger (Secure Element ST33): تستخدم TRNG الخاص بشريحة ST33، الذي يأخذ عينات من الضوضاء التناظرية. يمر الإخراج اختبارات صحة NIST SP 800-90B قبل الاستخدام.
  • Trezor: يستخدم RNG الأجهزة الخاص بشريحة STM32. يدعم Trezor أيضاً مزج الإنتروبيا المدخلة من قبل المستخدم (لفات النرد).
  • Coldcard: يستخدم TRNG الخاص بـ ATECC608A secure element بالإضافة إلى RNG MCU، مزج كلا المصدرين.

إنتروبيا لفة النرد

التدوير اليدوي للنرد هو أسلوب توليد الإنتروبيا الأكثر شفافية:

  • يُنتج النرد السداسي العادل log2(6) = 2.585 بت من الإنتروبيا لكل لفة.
  • تنتج 100 لفة تقريباً 258.5 بت من الإنتروبيا — كافية لعبارة بذرة بـ 24 كلمة.
  • يمكن للمستخدم التحقق فيزيائياً من العشوائية (نرد عادل، ينحني عادل، بدون معالجة).

التحقق من عدالة النرد:

  • استخدم نرد الدقة من الدرجة الكازينو (حواف حادة، لا مدورة).
  • تدحرج على سطح صلب وسلس مع ريفت الخلفية.
  • لا "تضع" النرد — دعها تتدحرج بحرية.
  • سجل كل نتيجة على الفور وبشكل متسلسل.
أداة SafeSeed

يسمح مولد عبارة SafeSeed البذرية بإدخال الإنتروبيا الخاصة بك (مثل نتائج لفة النرد) لإنشاء عبارة بذرية BIP-39. هذا يسمح لك بالتحقق من مصدر العشوائية مع الاستفادة من تطبيق BIP-39 الصحيح للأداة. استخدم الأداة بدون اتصال بالإنترنت للحصول على أقصى أمان — راجع دليلنا Offline Key Generation.

اختبار والتحقق من العشوائية

مجموعة اختبارات NIST الإحصائية

تحدد NIST SP 800-22 بطارية من الاختبارات الإحصائية لتقييم مولدات الأرقام العشوائية:

  • اختبار التكرار — هل توجد أرقام متساوية تقريباً من 0s و 1s؟
  • اختبار تكرار الكتلة — هل يتم توزيع الكتل الفرعية من البتات بشكل متساوٍ تقريباً؟
  • اختبار الأشواط — هل تسلسلات البتات المتتالية المتطابقة (الأشواط) من الطول المتوقع؟
  • اختبار أطول مدى — هل الأطول مدى ضمن الحدود المتوقعة؟
  • اختبار رتبة المصفوفة — هل تتبع رتب المصفوفة الثنائية التوزيعات المتوقعة؟
  • اختبار الطيفي — هل يظهر DFT لتسلسل البت الخصائص المتوقعة؟

يمكن لهذه الاختبارات اكتشاف الانحيازات والأنماط ولكن لا يمكنها إثبات أن المولد آمن. يمكنهم فقط اكتشاف الأعطال.

مجموعة اختبارات Dieharder

بطارية اختبار إحصائية أكثر شمولاً تتضمن الاختبارات الأصلية Diehard بالإضافة إلى اختبارات إضافية. متاح كبرنامج مفتوح المصدر على Linux.

التحقق العملي للمستخدمين

لا يمكن لمعظم المستخدمين تشغيل مجموعات اختبارات NIST. خطوات التحقق العملية:

  1. التحقق من المصدر — هل تستخدم الأداة crypto.getRandomValues() أو os.urandom() أو RNG الأجهزة؟ تحقق من الكود المصدري.
  2. اختبار الإنشاء المتقاطع — قم بإنشاء عبارات بذرية متعددة والتحقق من اختلافها في كل مرة.
  3. عرض الإنتروبيا — تعرض بعض الأدوات الإنتروبيا الخام؛ تحقق من أنها تبدو عشوائية (بدون أنماط واضحة).
  4. تدقيق مفتوح المصدر — هل الأداة مفتوحة المصدر وهل تم تدقيقها؟

مزج مصادر الإنتروبيا

أفضل ممارسة لإنشاء مفتاح عالي الأمان هي مزج مصادر إنتروبيا متعددة:

الإنتروبيا النهائية = Hash(RNG الأجهزة || CSPRNG نظام التشغيل || رمية النرد للمستخدم || بيانات التوقيت)

يضمن مزج المصادر أنه حتى إذا تم التعريض لمصدر واحد أو كان منحازاً، يبقى الإخراج النهائي آمناً طالما توفر مصدر واحد على الأقل إنتروبيا كافية. هذا هو النهج المستخدم من قبل محافظ الأجهزة الجيدة التصميم وأدوات توليد المفاتيح.

مزج XOR

طريقة المزج البسيطة هي XOR: إذا كان لديك 256 بت من المصدر A و 256 بت من المصدر B:

Mixed = A XOR B

إذا كان إما A أو B حقاً عشوائياً، فالنتيجة حقاً عشوائية. إذا كان كلاهما منحازاً لكن مستقلاً، فإن النتيجة أقل انحيازاً من أي منهما.

مزج التجزئة

لمزج مصادر بأطوال أو جودة مختلفة، يتم تجزئتها معاً:

Mixed = SHA-256(Source_A || Source_B || Source_C)

تعمل دالة التجزئة كمستخرج الإنتروبيا، وتنتج إخراجاً موحداً بغض النظر عن تنسيق الإدخال.

الإنتروبيا في إعدادات التوقيع المتعدد

توفر محافظ التوقيع المتعدد شكلاً من أشكال زيادة الإنتروبيا: حتى إذا تم إنشاء مفتاح واحد بإنتروبيا ضعيفة، يجب على المهاجم أيضاً تعريض المفاتيح الأخرى للخطر. يوفر 2-of-3 multisig حيث يتم إنشاء كل مفتاح بشكل مستقل أماناً يساوي المفتاح الأقوى، وليس الأضعف.

هذه حجة قوية لإعدادات التوقيع المتعدد في التخزين عالي القيمة.

الأسئلة الشائعة

ما هي الإنتروبيا في العملات المشفرة؟

الإنتروبيا هي مقياس العشوائية أو عدم القابلية للتنبؤ في البيانات المستخدمة لإنشاء مفاتيح التشفير. في العملات المشفرة، يعتمد أمان مفاتيحك الخاصة وعبارات البذرية بالكامل على وجود إنتروبيا كافية. يجب أن يحتوي المفتاح بـ 256 بت على 256 بت من العشوائية الحقيقية — إذا كانت الإنتروبيا أقل، يصبح المفتاح قابلاً للتخمين.

كم من الإنتروبيا أحتاج لمحفظة آمنة؟

توفر عبارة البذرية BIP-39 بـ 12 كلمة 128 بت من الإنتروبيا، وعبارة من 24 كلمة توفر 256 بت. يعتبر كلاهما آمناً ضد هجمات القوة الغاشمة بالتكنولوجيا الحالية. للتخزين طويل الأجل للقيمة العالية، يوصى بـ 256 بت (24 كلمة) لتوفير هامش أمان أقصى.

هل Math.random() آمن لإنشاء مفاتيح التشفير؟

بالتأكيد لا. Math.random() وغيره من PRNGs غير التشفيرية (Python's random، C's rand()) حتمية وقابلة للتنبؤ بها وعالية الإنتروبيا. يجب أن تُستخدم أبداً لإنشاء مفاتيح التشفير. استخدم دائماً `crypto