لماذا لا يعمل تنفيذ Elgamal لسلاسل النص الطويلة؟
-
27-09-2019 - |
سؤال
ألعب مع نظام التشفير El Gamal ، وهدفي هو أن أكون قادرًا على تشفير وفك تسلسلات النص الطويلة.
يتطلب El Gamal أن يكون النص العادي عددًا صحيحًا. لقد قمت بتحويل سلسلتي إلى بايت [] باستخدام طريقة .getbytes () للسلاسل ، ثم أنشأت biginteger من البايت []. بعد التشفير/فك التشفير ، أقوم بتحويل biginteger إلى بايت [] باستخدام طريقة .tobytearray () لـ BigIntegers ، ثم قم بإنشاء كائن سلسلة جديد من البايت [].
أنا أستخدم مفتاح 1035 بت ، وهذا يعمل بشكل مثالي عندما أشفر/فك تشفير مع سلاسل تصل إلى 129 حرفًا. مع 130 حرفًا أو أكثر ، يتم تشويه الإخراج المنتجة من طريقة فك التشفير.
هل يمكن لأحد أن يقترح كيفية حل هذه المشكلة؟
المحلول
كما هو الحال في RSA ، لا يمكنك تشفير قيمة أكبر من المعامل في Elgamal.
نصائح أخرى
يمكنك المحاولة
BigInteger pText = new BigInteger(plaintext.getBytes("UTF-8"));
لجعل الترميز/فك التشفير والتشفير/فك التشفير أكثر تماثلًا ، لكنني لست متأكدًا مما إذا كان هذا هو السبب الجذري.
بالمناسبة ، يجب ألا تستهلك بصمت Exception
. أقل ما يمكنك فعله هو فقط catch (UnsupportedEncodingException e)
.
تحتاج إلى استخدام أرقام إيجابية لعملياتك. لذلك يجب عليك بناء biginteger مثل هذا ،
BigInteger pText = new BigInteger(1, plaintext.getBytes());
// 1: select a random integer k such that 1 <= k <= p-2
BigInteger k = abs(new BigInteger(p.bitLength() - 2, sr));
إذا كنت ترغب في تشفير بيانات معينة باستخدام خوارزمية التشفير غير المتماثلة ، فيمكنك القيام بذلك فقط من أجل كتلة البيانات القصيرة حقًا. الأسباب كلاهما "تقني" (الخوارزمية تعمل بهذه الطريقة) و "عملي" (التشفير غير المتماثل هو بطيء).
الطريقة الصحيحة لتشفير الكتلة الكبيرة من البيانات باستخدام خوارزمية التشفير غير المتماثلة
- قم بإنشاء مفتاح عشوائي ("جلسة") لبعض الخوارزمية المتماثلة (AES ، RC4 ، 3Des ، سمها ما شئت).
- استخدم هذه الخوارزمية لتشفير البيانات
- استخدم الخوارزمية غير المتماثلة لتشفير مفتاح الجلسة
- تخزين المفتاح المشفر بالقرب من البيانات.
- توقف عن إعادة اختراع العجلة