English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

شرح مفصل لفكرة تشفير ملفات باستخدام عملية التبادل bitwise لـ Java

مقدمة بسيطة للتماثل: التماثل هو نوع من العمليات الثنائية، تمثلها بالرموز XOR أو ^، وقوانينها هي أن كل موقع ثنائي من الأرقام في كل من العمليات، إذا كانت نفسية القيم 0، وإذا كانت مختلفة 1.

ببساطة يمكن فهمها كجمع بدون تحويل، مثل 1+1=0، 0+0=0، 1+0=1.

وصف الحاجة

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

المنطق الرياضي

يستخدم هذا الخوارزمية التشفير الخاص بهما ميزة التماثل بين الأرقام، دعني أشرح ببساطة مبادئ التماثل، التماثل في الواقع هو عملية على الترميز الثنائي للملف، ببساطة يمكن القول إنه عندما تكون نفسية البينات الثنائية 0، وإذا كانت مختلفة 1، انظر إلى الأمثلة التالية:

//تمثيل 7 بالثنائي:
00000111
//تمثيل 2 بالثنائي:
00000010
//نتيجة التماثل بينهما:
00000101 // أي الرقم 5
//---------------------------
//نتيجة التماثل مرة أخرى مع 2
//تمثيل 5 بالثنائي:
00000101
//تمثيل 2 بالثنائي:
00000010
//نتيجة التماثل بينهما:
00000111 // أي 7، أليس هذا رائعًا مرة أخرى 7؟

تحقيق الكود

import java.io.*;
class FileSecret
{
	public static void main(String[] args) throws Exception
	 {
		//إيجاد الملف الذي سيتم تشفيره، يُحدد القرص بنفسك، لا يجب أن تكون المدخلات والإخراجات على نفس القرص
		File inFile = new File("القرص:\\ملف التشفير");
		//إخراج الملف الذي سيتم تشفيره إلى القرص المحدد
		File outFile = new File("القرص:\\ملف التشفير");
		//إقامة قناة بيانات، لجعل بيانات الصورة الثنائية تدفق
		FileInputStream input = new FileInputStream(inFile);
		FileOutputStream output = new FileOutputStream(outFile);
		//في أثناء القراءة، يتم إجراء إكسور مع عدد معين، هذا العدد يجب أن يكون مولدًا من بعض خوارزميات التشفير، هنا سأقوم بإنشاء عدد بسيط 928 (يوم ميلادي)، ثم إجراء الإكسور، ثم يتم إخراج البيانات
		int content = 0 ;
		//يستخدم هذا المتغير لتحفظ البيانات التي يتم قراءتها، بالطبع يمكن استخدام نوع بيانات أطول مثل long، وكذلك يمكن استخدام أنواع بيانات أخرى، فقط يجب أن تكون قابلة للتحويل بينها، على الأقل يمكن القيام بتحويل قسري
		while((content=input.read())!=-1) // إذا لم يصل إلى نهاية الملف، فاستمر في قراءة البيانات، والبيانات التي تم قراءتها يتم تخزينها في المتغير content، -1 هو معلم النهاية للملف}}
		{
			output.write(content^928);
			//كتابة إلى مسار ملف الناتج
		{}
		//إغلاق الموارد
		input.close();
		output.close();
	{}
{}

تقييم وظيفة الكود

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

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

في هذه العملية، نحن في الواقع نستخدم القيمة المقدمة لنا لتنفيذ عملية التماثل مع الملف الثنائي الذي نقرأه، هل يمكننا استبدال هذا الاتفاق برقم عشوائي؟ الجواب هو نعم، أولاً نستخدم متغير نوع int لتخزين، فإن نطاقه يمكن أن يكون: من 21 مليار إيجابي وسلبي من الأرقام القابلة للت��현، والكود المحدد هو:

//طريقة إنتاج العدد العشوائي
import java.util.*;
public class RandomTest{
 public static void main(String[] args){
  Random random = new Random();
  int num = random.nextInt(11); //يُعرف هذا بأنه إنتاج عدد عشوائي بين 0 و10، يجب أن يتم حفظ هذا العدد العشوائي، يمكن استخدامه من قبل المُشفر والمُفصل
  System.out.println("رقم العشوائية: " + num);
 {}
{}

خوارزمية التشفير المُحسنة

كود الجهاز المُشفر

import java.io.*;
import java.util.*;
class FileSecret
{
	public static void main(String[] args) throws Exception
	 {
		//إيجاد الملف الذي سيتم تشفيره، يُحدد القرص بنفسك، لا يجب أن تكون المدخلات والإخراجات على نفس القرص
		File inFile = new File("القرص:\\ملف التشفير");
		//إخراج الملف الذي سيتم تشفيره إلى القرص المحدد
		File outFile = new File("القرص:\\ملف التشفير");
		//إقامة قناة بيانات، لجعل بيانات الصورة الثنائية تدفق
		FileInputStream input = new FileInputStream(inFile);
		FileOutputStream output = new FileOutputStream(outFile);
		//إنتاج رقم إكسور التشفير الآخر
		Random random = new Random();
		int num = random.nextInt(11);
		//يُعرف هذا بأنه إنتاج عدد عشوائي بين 0 و10، يجب أن يتم حفظ هذا العدد العشوائي، يمكن استخدامه من قبل المُشفر والمُفصل
		System.out.println("رقم العشوائية: " + num);
		//في أثناء القراءة، يتم إجراء إكسور مع عدد معين، هذا العدد يجب أن يكون مولدًا من بعض خوارزميات التشفير، هنا سأقوم بإنشاء عدد بسيط 928 (يوم ميلادي)، ثم إجراء الإكسور، ثم يتم إخراج البيانات
		int content = 0 ;
		//يستخدم هذا المتغير لتحفظ البيانات التي يتم قراءتها، بالطبع يمكن استخدام نوع بيانات أطول مثل long، وكذلك يمكن استخدام أنواع بيانات أخرى، فقط يجب أن تكون قابلة للتحويل بينها، على الأقل يمكن القيام بتحويل قسري
		while((content=input.read())!=-1) // إذا لم يصل إلى نهاية الملف، فاستمر في قراءة البيانات، والبيانات التي تم قراءتها يتم تخزينها في المتغير content، -1 هو معلم النهاية للملف}}
		{
			output.write(content^num);
			//كتابة إلى مسار ملف الناتج
		{}
		//إغلاق الموارد
		input.close();
		output.close();
	{}
{}

يجب أن يتم إبلاغ الجهاز المُفصل بالرقم المولد الذي تم إنشاؤه في الكود أعلاه، وإلا لا يمكن تحقيق تشفير الملف

كود الجهاز المُفصل

import java.io.*;
class FileSecret
{
	public static void main(String[] args) throws Exception
	 {
		//إيجاد الملف الذي سيتم تشفيره، يُحدد القرص بنفسك، لا يجب أن تكون المدخلات والإخراجات على نفس القرص
		File inFile = new File("القرص:\\ملف التشفير");
		//إخراج الملف الذي سيتم تشفيره إلى القرص المحدد
		File outFile = new File("القرص:\\ملف التشفير");
		//إقامة قناة بيانات، لجعل بيانات الصورة الثنائية تدفق
		FileInputStream input = new FileInputStream(inFile);
		FileOutputStream output = new FileOutputStream(outFile);
		//في أثناء القراءة، يتم إجراء إكسور مع عدد معين، هذا العدد يجب أن يكون مولدًا من بعض خوارزميات التشفير، هنا سأقوم بإنشاء عدد بسيط 928 (يوم ميلادي)، ثم إجراء الإكسور، ثم يتم إخراج البيانات
		int content = 0 ;
		//يستخدم هذا المتغير لتحفظ البيانات التي يتم قراءتها، بالطبع يمكن استخدام نوع بيانات أطول مثل long، وكذلك يمكن استخدام أنواع بيانات أخرى، فقط يجب أن تكون قابلة للتحويل بينها، على الأقل يمكن القيام بتحويل قسري
		while((content=input.read())!=-1) // إذا لم يصل إلى نهاية الملف، فاستمر في قراءة البيانات، والبيانات التي تم قراءتها يتم تخزينها في المتغير content، -1 هو معلم النهاية للملف}}
		{
			output.write(content^رقم التشفير المرسل من الجانب المشفر);
			//كتابة إلى مسار ملف الناتج
		{}
		//إغلاق الموارد
		input.close();
		output.close();
	{}
{}

تحسين مرة أخرى

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

الخلاصة

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

مثال على استخدام عملية إكسور لإنشاء خوارزمية تشفير وتشفير بسيطة باستخدام جافا

مثال على شيفرة تنفيذ عملية إكسور لرقميات شطرنجية في جافا

تحليل شيفرة مشكلة الإكسور في جافا

يرجى ترك تعليق إذا كانت هناك نقاط قصيرة. شكرًا للدعم من أصدقاء هذا الموقع!

البيان: محتوى هذا المقال تم جمعه من الإنترنت، ملكية المحتوى تخص المالك الأصلي، تم جمع المحتوى من قبل المستخدمين على الإنترنت بطرق متعددة، هذا الموقع لا يمتلك حقوق الملكية، لم يتم تعديل المحتوى بشكل إنساني، ولا يتحمل هذا الموقع أي مسؤولية قانونية. إذا كنت قد وجدت محتوى يشتبه في انتهاك حقوق النسخ، فالرجاء إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (الرجاء استبدال # ب @ عند إرسال البريد الإلكتروني) للإبلاغ، وقدم الدليل المتعلق بالدليل، إذا تم التحقق من ذلك، سيتم حذف المحتوى المشبوه فورًا.

سيحبك