أداة خصوصية مجانية

اختم ملفًا

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

يعمل كليًا في علامة التبويب هذه. ولا تستطيع هذه الصفحة التخاطب مع أي خادم إطلاقًا.

كل معامل، معلنًا

خوارزمية التشفير
AES-256-GCM (WebCrypto)، وسم بطول 128 بت لكل قطعة
المفتاح
256 بت من مولّد CSPRNG في المتصفح، يُولَّد جديدًا لكل ختم، يُستخدم مرة واحدة، ولا يُشتق من شيء
التقطيع
بيان مشفر (اسم الملف والحجم والنوع)، ثم الملف في قطع بحجم 1 ميبي بايت — كل منها موثّقة على حدة
النونس
ملح ختم عشوائي بطول 32 بت ‖ عدّاد قطع بطول 64 بت — لا يتكرر أبدًا داخل الملف، والمفتاح أحادي الاستخدام على أي حال
البيانات الموثّقة
الترويسة كاملة بطول 16 بايت إضافةً إلى فهرس كل قطعة وإجمالي عدد القطع — فإعادة الترتيب أو الاقتطاع أو الوصل يُفسد فك التشفير
سلسلة المفتاح
base64url، 47 محرفًا: المفتاح بطول 32 بايت زائد مجموع تحقق SHA-256 بطول 3 بايتات، فيفشل الخطأ المطبعي فشلًا نظيفًا بدل أن ينتج خردة

إجابات صريحة عمّا تفعله هذه الأداة

كل شيء يحدث في متصفحك.

الختم والفتح كلاهما يقرأ الملف إلى ذاكرة هذه الصفحة، وينفّذ AES-256-GCM هناك بمحرك WebCrypto المدمج في متصفحك، ثم يعيد النتيجة كتنزيل. لا شيء يُرفع. لا حساب ولا معالجة على الخادم. وخلافًا لبقية هذا الموقع، لا تحمّل هذه الصفحة حتى عدّاد الزيارات الخالي من الكوكيز. لا تحليلات من أي نوع.

وهذا ليس مجرد وعد. فالصفحة تُقدَّم مع سياسة أمان محتوى (Content-Security-Policy) لا تسمح للمتصفح إلا بجلب الملفات الساكنة الخاصة بهذا الموقع. فلا سبيل لها إلى إرسال ملفك أو مفتاحك أو أي شيء آخر إلى أي خادم، ولا إلى خوادمنا. افتح أدوات المطوّر في متصفحك أثناء الختم، وسترى صفر طلبات. وللحصول على أوضح دليل، ثبّت صندوق الأدوات واختم في وضع الطيران. فمع إطفاء الشبكة، لا شيء يستطيع المغادرة.

المفتاح هو كل شيء — ونحن لا نملكه أبدًا.

كل ختم يولّد مفتاحًا عشوائيًا جديدًا بطول 256 بت في متصفحك. يُعرض لك مرة واحدة ولا يُحفظ في أي مكان: لا في أنظمتنا (فلا نظام مشارك أصلًا)، ولا في تخزين متصفحك، ولا في الملف المختوم. لا عبارة مرور تُخمَّن ولا شيء قابل للكسر بالقوة الغاشمة. من يملك المفتاح والملف يفتحه. ومن لا يملكهما لا يستطيع.

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

رابط المفتاح لا يصل إلى أي خادم.

رابط المشاركة يضع المفتاح بعد علامة # في العنوان. وذلك الجزء، الجزء المرجعي، يبقى في المتصفح. ولا يُضمَّن أبدًا فيما يرسله المتصفح إلى أي خادم، خادمنا أو غيره. وحين تُحمَّل هذه الصفحة ومعها مفتاح في الرابط، تقرأ المفتاح، وتنتقل إلى علامة تبويب «فتح»، وتزيل المفتاح فورًا من شريط العنوان. فلا يبقى في العنوان الظاهر أو في سجل المتصفح.

ومع ذلك، فكل من يملك الرابط والملف المختوم معًا يستطيع فتحه. ولهذا تنصحك هذه الصفحة بإرسال الملف والمفتاح عبر قناتين مختلفتين.

ترى ما في الداخل قبل أن يُحفظ أي شيء.

الفتح يجري في خطوتين. أولًا تفك الصفحة تشفير بيان صغير فقط: اسم الملف الأصلي وحجمه ونوعه. وتعرضه عليك، مع تحذير صارخ لأنواع الملفات التي قد تشغّل شيفرة (البرامج والسكربتات والمثبّتات ومستندات الماكرو وHTML) وللأسماء المموّهة بامتداد مزدوج مثل invoice.pdf.exe. ولا يُكتب شيء حتى تنقر لفك التشفير. والصفحة لا تفتح المحتوى المفكوك ولا تعرضه بنفسها أبدًا. بل تتيح الملف للتنزيل فقط.

وكن واضحًا بشأن ما يثبته التشفير وما لا يثبته. الملف المختوم سرّي أثناء النقل. والختم لا يقول شيئًا عمّن أرسله ولا عن سلامة محتوياته. تعامل مع ملف مختوم غير متوقَّع بالتشكك نفسه الذي تتعامل به مع مرفق غير متوقَّع.

أين تقع حدود الثقة فعلًا.

أنت تشغّل شيفرة قدّمها لك هذا الموقع. فلو اختُرق sealby.app أو اتصالك به، لأمكن لصفحة خبيثة أن تقرأ ما تضعه فيها. وهذا صحيح في كل أداة تشفير قائمة على الويب، ونفضّل قوله على التظاهر بغيره. وما نفعله حيال ذلك: الصفحة ملف ساكن، ونبقيها خالية من شيفرة الأطراف الثالثة. وصندوق الأدوات المثبَّت يتيح لك مواصلة استخدام نسخة سبق أن حمّلتها. والصيغة موثّقة أدناه، حتى يمكن بناء أدوات مستقلة عليها.

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

الحدود بلغة واضحة

  • ضياع المفتاح = ضياع الملف. بلا استثناءات، بحكم التصميم.
  • لا نستطيع رؤية ملفاتك أو مفاتيحك، فلا نستطيع كذلك فحصها بحثًا عن برمجيات خبيثة. وتحذير نوع الملف مبني على اسم الملف وحده. وهو ليس ضمانة سلامة.
  • كل من يملك الملف المختوم والمفتاح معًا يستطيع فتحه. والأداة لا تعرف من هو ولا تتحقق منه.
  • حجم الملف المختوم يكشف تقريبًا حجم الملف الأصلي.
  • ملف واحد لكل ختم، حتى 100 ميغابايت. اضغط عدة ملفات في أرشيف أولًا.

الصيغة، بايتًا ببايت

كل ما يحتاجه القارئ التقني للتحقق من مخرَج هذه الصفحة باستقلالية، أو لفتح ملف .sealed في ثلاثين سطرًا من Python:

bytesfieldcontents
0–7العلامة السحريةASCII "SEALBY-W"
8الإصدار0x01 — وأي قيمة سواها تُرفض بوصفها «أُنشئت بإصدار أحدث»
9الخوارزمية0x01 = AES-256-GCM
10–13ملح الختم4 بايتات، من CSPRNG، جديد لكل ختم
14–15محجوزيجب أن يكون أصفارًا
16–النهايةإطارات القطعكل إطار: طول النص المشفر uint32 BE، ثم نص AES-GCM المشفر + وسم بطول 16 بايت

القطعة 0 هي البيان: JSON بترميز UTF-8 {"name":…,"size":…,"type":…}. والقطع 1…N−1 هي الملف في أجزاء بحجم 1 ميبي بايت. ولكل قطعة i من N: النونس = الملح ‖ uint64 BE i؛ والبيانات الموثّقة = الترويسة ‖ uint64 BE i ‖ uint64 BE N. فالعبث والاقتطاع وإعادة الترتيب والنقل والوصل بين الملفات كلها تفشل في التوثيق. ولكل حالة اختبار سلبي مُودَع يثبتها.

سلسلة المفتاح: base64url (بلا حشو) للمفتاح بطول 32 بايت متبوعًا بأول 3 بايتات من تجزئة SHA-256 له، أي 47 محرفًا في المجموع. فيفشل الخطأ المطبعي في مجموع التحقق بدل أن ينتج خردة.

فاتح مرجعي (Python، مكتبة cryptography)
import base64, hashlib, json, struct, sys
from cryptography.hazmat.primitives.ciphers.aead import AESGCM

raw = open(sys.argv[1], "rb").read()
assert raw[:8] == b"SEALBY-W" and raw[8] == 1 and raw[9] == 1
assert raw[14:16] == b"\x00\x00"
header, salt = raw[:16], raw[10:14]
frames, off = [], 16
while off < len(raw):
    (n,) = struct.unpack(">I", raw[off:off + 4]); off += 4
    frames.append(raw[off:off + n]); off += n
assert off == len(raw)

kb = base64.urlsafe_b64decode(sys.argv[2] + "=")   # 47-char key string
key, check = kb[:32], kb[32:35]
assert hashlib.sha256(key).digest()[:3] == check    # typo check

N = len(frames)
def chunk(i):
    nonce = salt + struct.pack(">Q", i)
    aad = header + struct.pack(">QQ", i, N)
    return AESGCM(key).decrypt(nonce, frames[i], aad)

manifest = json.loads(chunk(0))
data = b"".join(chunk(i) for i in range(1, N))
assert len(data) == manifest["size"]
open(manifest["name"], "wb").write(data)
print("decrypted ->", manifest["name"])

هذه للملفات في الطريق. أما الخزنة فللملفات المستقرة.

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

تنزيل من App Store

iPhone وiPad · iOS 17+ · مجانًا