
دردشة طرفية آمنة. مشفرة من طرف إلى طرف، خادم إعادة توجيه أعمى بدون بيانات وصفية. PyNaCl XSalsa20-Poly1305 + Ed25519 + forward secrecy. متعدد المنصات بلغة Python.
دردشة جماعية مشفرة من النهاية إلى النهاية، ورسائل خاصة، ونقل ملفات في طرفيتك. الخادم هو مُمرِّر أعمى: لا يمكنه قراءة رسائلك، ولا يعرف اسم المستخدم الخاص بك، ولا يعرف الغرفة التي أنت فيها، ولا يمكنه ربط أي رسالتين بنفس الشخص، حتى لو تم اختراقه بالكامل.
https://github.com/user-attachments/assets/d9faabfb-73bd-46dd-92b2-23f63daf5b06
https://github.com/user-attachments/assets/e8e0220d-cd7d-45a2-9443-9a5f20b57f12
https://github.com/user-attachments/assets/15fb383d-a02a-433e-bbd9-8ebadecf9481
https://github.com/user-attachments/assets/bca10cb1-6959-425d-96d6-fc1fbf845538
NoEyes هي أداة محادثة طرفية بلغة Python للمجموعات الصغيرة الموثوقة. الخادم لا يفك تشفير أي شيء أبدًا ولا يرى هويتك أبدًا - فهو يتعامل فقط مع الرموز المعتمة ويُمرِّر البايتات المشفرة.
أنت تُنشئ المفتاح، وتشاركه خارج النطاق، ولا يعلم الخادم شيئًا عن محادثاتك.
مفيد للمجموعات الصغيرة الموثوقة التي تريد اتصالات مشفرة دون الثقة بأي خادم طرف ثالث، أو لاستضافة محادثة خاصة ذات تشفير حقيقي من النهاية إلى النهاية، أو لأي شخص يريد أن يفهم بالضبط ما يمكن للخادم رؤيته وما لا يمكنه رؤيته.
| الميزة | التفاصيل |
|---|---|
| خادم بدون بيانات وصفية | الخادم لا يرى أسماء المستخدمين، أو أسماء الغرف، أو المفاتيح العامة، فقط رموزًا معتمة |
| مرسل مختوم | هوية المرسل موجودة داخل الحمولة المشفرة، وليس في رأس التوجيه |
| خادم مُمرِّر أعمى | بدون فك تشفير، الخادم يُمرِّر الكتل المشفرة التي لا يستطيع قراءتها |
| سرية توجيهية | /ratchet start — بروتوكول مفاتيح المرسل، كل رسالة تُشفَّر بمفتاح مشتق فريد، الرسائل السابقة آمنة حتى لو تسرب المفتاح الحالي |
| دردشة جماعية | مفاتيح لكل غرفة باستخدام XSalsa20-Poly1305 مستمدة عبر BLAKE2b، الغرف معزولة تشفيريًا |
| رسائل خاصة | مصافحة X25519 DH عند أول اتصال، مفتاح زوجي لا يملكه إلا الطرفان |
| نقل ملفات | بث ChaCha20-Poly1305، أي حجم، استخدام منخفض للذاكرة، إيقاف مؤقت/استئناف عبر إعادة الاتصال |
| هوية Ed25519 | مفتاح توقيع مولّد تلقائيًا، جميع الرسائل والملفات موقعة |
| TOFU | المفاتيح التي تُرى أولاً تُوثق؛ عدم تطابق المفاتيح يظهر تحذيرًا أمنيًا مرئيًا |
| ملح PBKDF2 عشوائي | كل نشر يحصل على ملح عشوائي فريد، جداول قوس قزح عديمة الفائدة |
| TLS + تثبيت الشهادة | النقل مشفر، شهادة الخادم تُثبت عند أول اتصال عبر TOFU |
| حماية من إعادة التشغيل | قائمة معرفات الرسائل لكل غرفة، الرسائل المُعاد لعبها تُسقط بصمت |
| لوحة جانبية مقسمة | الغرف (أعلى) والمستخدمون (أسفل) مرئيان دائمًا، كل نصف يتحرك بشكل مستقل |
| رسوم متحركة CRT عند بدء التشغيل | تأثير فوسفوري ملء الشاشة مع صوت عند بدء التشغيل |
| رسوم متحركة لتفعيل الراتشيت | تأثير CRT ملء الشاشة مع فن ميكانيكي من البرايل، وميض خلل، ومسح كشاف ضوئي، ومؤثرات صوتية متزامنة، وانتقال واجهة النص إلى اللون الأحمر |
| مُشغِّل موجه | قائمة لوحة المفاتيح باستخدام مفاتيح الأسهم، لا حاجة لخبرة سطر الأوامر |
| مثبت تبعيات تلقائي | يكتشف نظامك، يُثبِّت المفقود، يطلب الإذن قبل تغيير أي شيء |
python ui/setup.py
python ui/launch.py
`ui/launch.py` يرشدك خلال بدء خادم أو الاتصال بأحدها.
---
### الخيار ب - إذا لم يتم تثبيت بايثون بعد
| المنصة | شغل هذا أولاً |
|---|---|
| Linux / macOS / Termux / iSH | `sh install/install.sh` |
| Windows | `install\install.bat` |
كلا البرنامجين النصيين يقومان بتثبيت بايثون إذا كان مفقودًا، ثم يحولان المهمة إلى `setup.py` تلقائيًا.
---
### الخيار ج - يدوي```bash
# 1. Install dependencies
pip install cryptography PyNaCl
# 2. On the server machine — generate the access key
python noeyes.py --generate-access-key
# Prints an access code hex string — share with clients via USB
# 3. On a client machine — generate chat.key from the access code
python noeyes.py --generate-chat-key <ACCESS_CODE_HEX> --key-file ./chat.key
# Distribute chat.key to all other clients via USB. Never put it on the server.
# 4. Start the server (does NOT need the key file)
python noeyes.py --server --port 5000
# Start without bore tunnel (LAN / static IP / custom tunnel)
python noeyes.py --server --port 5000 --no-bore
# Start without adding a firewall rule (not needed when using bore tunnel)
python noeyes.py --server --port 5000 --no-firewall
# 5. Connect clients - each person needs their own identity file
python noeyes.py --connect SERVER_IP --port 5000 --username alice --key-file ./chat.key --identity-path ~/.noeyes/identity_alice.key
python noeyes.py --connect SERVER_IP --port 5000 --username bob --key-file ./chat.key --identity-path ~/.noeyes/identity_bob.key
مهم: يجب أن يكون لكل مستخدم ملف هوية خاص به. عند مشاركة عميلين لنفس ملف الهوية، يحصلان على نفس رمز صندوق الوارد وسيرفض الخادم الثاني كجلسة مكررة. يتم إنشاء ملف الهوية تلقائيًا عند التشغيل الأول، فقط مرر
--identity-pathفريدًا لكل مستخدم.
قم بتنزيل Termux من F-Droid (موصى به): https://f-droid.org/packages/com.termux/
حافظ على استمرارية الجلسة - قم بتثبيت tmux حتى يستمر NoEyes في العمل عند تبديل التطبيقات:```bash pkg install tmux -y tmux python ui/launch.py
**أذونات التخزين** - سيفشل نقل الملفات بدون هذا:```bash
termux-setup-storage
| الأمر | الوصف |
|---|---|
/help | عرض جميع الأوامر |
/quit | قطع الاتصال والخروج |
/clear | مسح الرسائل من الشاشة |
/users | عرض قائمة المستخدمين في الغرفة الحالية |
/join <room> | التبديل إلى غرفة (تحذير إذا كان في راتشيت نشط) |
/leave | العودة إلى الغرفة العامة (تحذير إذا كان في راتشيت نشط) |
/msg <user> <text> | إرسال رسالة خاصة مشفرة من طرف إلى طرف |
/send <user> <file> | إرسال ملف مشفر |
/whoami | عرض بصمة هويتك |
/trust <user> | الوثوق بمفتاح جديد لمستخدم بعد إعادة تثبيته |
/notify on|off | تبديل أصوات الإشعارات |
/ratchet start | اقتراح مفاتيح دوارة ذات سرية أمامية لجميع أعضاء الغرفة (يجب أن يؤكد الجميع) |
/ratchet invite <u> | إعادة دعوة مستخدم إلى الراتشيت بعد عودته (يؤدي إلى إعادة تشغيل كاملة - لا يتم تمرير مفاتيح السلسلة) |
/proceed | أثناء انتظار الترحيل، التصويت على إسقاط نظير غير متصل واستئناف العمل |
| المفتاح | الإجراء |
|---|---|
↑ / ↓ | التمرير لأعلى/لأسفل في الدردشة |
PgUp / PgDn | تمرير الدردشة صفحة كاملة |
^P (Ctrl+P) | إظهار/إخفاء اللوحة الجانبية |
^C | الخروج |
▶.كل نصف يُمرّر بشكل مستقل. اضغط ^P لإخفاء اللوحة للحصول على عرض دردشة بعرض كامل.
أضف بادئة لأي رسالة باستخدام !tag لتلوينها للجميع وتشغيل صوت إشعار. الوسوم تنتقل داخل الحمولة المشفرة، ولا يراها الخادم أبداً.
| الوسم | اللون | الاستخدام |
|---|---|---|
!ok <msg> | 🟢 أخضر | نجاح، تأكيد، تم |
!warn <msg> | 🟡 أصفر | تحذير، تنبيه |
!danger <msg> | 🔴 أحمر | حرج، عاجل، طارئ |
!info <msg> | 🔵 أزرق | تحديث حالة، للإعلام |
!req <msg> | 🟣 أرجواني | طلب، يحتاج إجراء |
!? <msg> | 🩵 سماوي | سؤال، طلب إدخال |
أمثلة:``` !danger server is going down in 5 minutes !ok deployment successful !req can someone review my PR?
تصدر الأصوات من مجلد `sfx/`. ضع ملفات `.wav` أو `.mp3` أو `.ogg` أو `.aiff` أو `.flac` أو `.m4a` مسماة حسب الوسم (مثال: `sfx/danger.wav`). يرجع إلى جرس الطرفية إذا لم يُعثر عليها. استخدم `/notify off` لتعطيل جميع الأصوات.
---