بسم الله الرحمن الرحيم
إني أعاني من مشكلة معقدة لم أجد لها حلاً منطقياً. من المعروف أن عملية الXOR تُستخدم في الsymmetric encryption وأن في هذه الطريقة تتم عملية decryption من خلال عمل الXOR للencrypted image و من المفترض أن تحصل على صورة مطابقة للصورة الأصلية تماما لأنها تُرجع قيمة الRGB ذاتها الموجودة في الصورة الأصلية قبل عملية التشفير. مشكلتي تتخلص في أنني عندما آحاول أن أقوم بعملية ال decryption للصورة أحصل على صورة مشوهة من الصورة الأصلية، و مدى التشوّه يختلف باختلاف قيمة الkey الذي أستعمله في عملية ال XOR مع قيمة الRGB في الصورة.لقد استنفدت كل الطرق في محاولة تحليل المشكلةا منطقيا، و لكن كل التجارب التي أجريتها قادتني إلى نتيجة واحدة و هي أن عملية الXOR بذاتها ليس بها مشكلة، و بدأت أشك بأنها مشكلة جودة في الصور من الجافا نفسه أو شيئا آخرلم انتبه له.
هذا هو كود البرنامج و أرجو أن تفيدوني بما تستطيعون، خصوصا أنني لست متعمقا في مسألة التعامل مع الصور في الجافا.
import java.util.*;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.*;
import javax.imageio.stream.*;
import javax.swing.ImageIcon;
import javax.imageio.plugins.jpeg.JPEGImageWriteParam;
class EncryptionTest
{
public static void main(String [] args) throws Exception
{
System.out.println("Please enter the name of file that you wish to process.");
System.out.println("The program will not function properly if the specified file does not exist or uses an unknown extension:");
Scanner keyb = new Scanner(System.in);
String inputFileName = keyb.nextLine();
String inputFileType = inputFileName.substring(inputFileName.indexOf('.')+1);
String inputfileNameWithoutExtension = inputFileName.substring(0, inputFileName.indexOf('.'));
File myImageFile = new File(inputFileName);
Image img = ImageIO.read(myImageFile);
BufferedImage bufferedImage = new BufferedImage(img.getWidth(null), img.getHeight(null),
BufferedImage.TYPE_INT_RGB);
Iterator writers = ImageIO.getImageWritersByFormatName( "jpg" );
ImageWriter imageWriter=(ImageWriter) writers.next();
ImageWriteParam jpgparams=imageWriter.getDefaultWriteParam();
jpgparams.setCompressionMode( javax.imageio.ImageWriteParam.MODE_EXPLICIT );
jpgparams.setCompressionQuality(1);
Graphics g = bufferedImage.createGraphics();
g.drawImage(img, 0, 0, null);
int w = bufferedImage.getWidth();
int h = bufferedImage.getHeight();
int [] key= {10, 20, 30, 40, 50, 60, 70, 80, 90, 100};
int counter=0;
for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
//int pixel = bufferedImage.getRGB(j,i);
//pixel = pixel^10000;
//pixel=pixel+50000;
bufferedImage.setRGB(j, i, bufferedImage.getRGB(j,i) ^ key[counter++%10]);
}
}
g.dispose();
File file = new File(inputfileNameWithoutExtension+"-encrypted."+inputFileType);
FileImageOutputStream output = new FileImageOutputStream(file);
imageWriter.setOutput(output);
IIOImage image = new IIOImage(bufferedImage, null, null);
imageWriter.write(null, image, jpgparams);
imageWriter.dispose();
//ImageIO.write(bufferedImage, inputFileType, new File(inputfileNameWithoutExtension+"-encrypted."+inputFileType));
}
}آسف إذا كنت وضعت الموضوع في قسمه غير المناسب أو أنه لا يستحق أن يُفرد في موضوع منفصل، و لكني أحسست بأنها مشكلة غير اعتيادية و لا أحسب حلها بديهيا أو مبسّطا.
و شكرا،
