Как зашифровать изображение с ECC в Java - PullRequest
0 голосов
/ 11 мая 2019

Мне нужно зашифровать изображение в формате bmp с помощью ECC, но мне было очень трудно, особенно когда пиксели будут отображаться на эллиптической кривой, я вообще не понимал этого. Поэтому я исследовал другие варианты и нашел ECIES.

Я пытался реализовать его в Java, используя bouncycastle, он работает, но проблема в том, что мой код шифрует изображение как файл, но я пошел, чтобы зашифровать пиксели изображения и получить новое зашифрованное изображение, чтобы я мог вычислить PSNR между зашифрованными и незашифрованными изображениями. Я пытался зашифровать каждый пиксель в одиночку, чем создать зашифрованное изображение, но не получилось. Есть ли какая-то функция, которая может мне помочь или что-то еще в BC? Или мне нужно внедрить ECIES без нее?

Вот что я попробовал:

   Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
   KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("EC", "BC"); 
   ECNamedCurveParameterSpec curveParameterSpec = ECNamedCurveTable.getParameterSpec("secp384r1"); 
   keyPairGenerator.initialize(curveParameterSpec, new SecureRandom()); 

   KeyPair KeyPair = keyPairGenerator.generateKeyPair(); 
   ECPublicKey publicKey = (ECPublicKey) KeyPair.getPublic(); 
   ECPrivateKey privateKey = (ECPrivateKey) KeyPair.getPrivate(); 

   javax.crypto.Cipher c1 = javax.crypto.Cipher.getInstance("ECIES", "BC"); 
   javax.crypto.Cipher c2 = javax.crypto.Cipher.getInstance("ECIES", "BC"); 
   c1.init(ENCRYPT_MODE, publicKey,  new SecureRandom()); 
   c2.init(DECRYPT_MODE, privateKey, new SecureRandom());

   try{
        File bmpFile = new File("C:\\Users\\acer\\Desktop\\py\\6.bmp");
        BufferedImage image = ImageIO.read(bmpFile);
        // to byte
        ByteArrayOutputStream baos=new ByteArrayOutputStream();//length=32 bytes, though its size increases if necessary.
        ImageIO.write(image, "bmp", baos );

        byte[] b = baos.toByteArray(); 
        byte[] cipherimage = c1.doFinal(b, 0, b.length); 
        byte[] plainimage = c2.doFinal(cipherimage, 0, cipherimage.length);
        bmpFile=new File("C:\\Users\\acer\\Desktop\\py\\encryptedimage.bmp");
        FileOutputStream fos = new FileOutputStream(bmpFile);
        fos.write(cipherimage);
        fos.flush();
        fos.close();
        bmpFile=new File("C:\\Users\\acer\\Desktop\\py\\decryptedimage.bmp");
        FileOutputStream fos1 = new FileOutputStream(bmpFile);
        fos1.write(plainimage);
        fos1.flush();
        fos1.close();
   } catch (IOException e){
     System.out.println(e.getMessage());
   }

1 Ответ

0 голосов
/ 13 мая 2019

Кажется, вы делаете неправильные предположения и, возможно, захотите пересмотреть / пересмотреть свой подход.

чтобы получить новое зашифрованное изображение. Затем рассчитайте пиковое отношение сигнал / шум (PSNR) между темой

Формат изображения BMP состоит не только из пикселей. Как уже отмечалось, существуют метаданные заголовка (размер, глубина, ...), которые, если вы зашифруете весь файл, больше не будут иметь смысла (это не будет bmp). Я бы сказал, что вы можете создавать новое изображение и обрабатывать пиксель за пикселем на уровне изображения, а не просто шифровать входной файл . Пример: https://www.dyclassroom.com/image-processing-project/how-to-get-and-set-pixel-value-in-java

int p = img.getRGB(x,y);

Итак, я исследовал другие варианты и нашел ECIES.

ECIES - это гибридная схема, вы можете взглянуть на следующий ответ для шифрования ECIES https://gist.github.com/amrishodiq/9821413 , Вывод должен содержать больше / другую информацию, чем просто пиксели, и это определенно не тот BMP, который вы можете просто открыть и сравнить.

Гибридная схема шифрования предполагает, что данные зашифрованы симметричным шифром (я не уверен, что BC используется в этом случае, если кто-то знает, пожалуйста, прокомментируйте), где ключ шифрования получен с использованием ECC.

Таким образом, в конце вы будете сравнивать пиксели, зашифрованные базовым симметричным алгоритмом (например, aes256-cbc), где он предназначен для обеспечения вывода, неотличимого от случайного вывода.

необходимо зашифровать изображение bmp с помощью ECC

Если вы зашифруете каждый пиксель (допустим, вы представите каждый пиксель как 16-битный rgb), вывод ECC будет намного длиннее, чем входные данные, поэтому непросто напрямую отобразить входные значения в выходные данные того же измерения ( размер)

...