如何使用Java中的ECC加密图像



我必须使用ECC加密BMP映像,但是我发现这非常困难,尤其是当像素将在椭圆曲线上映射时,我根本不了解它。因此,我研究了其他选择并找到了Ecies。

我尝试使用Bouncycastle在Java中实现它,它有效,但问题是我的代码将图像加密为文件,但是我去加密图像的像素并获取了一个新的加密图像,以便我可以计算计算加密图像和未加密图像之间的PSNR。我试图单独加密每个像素,而不是创建加密图像,但不起作用。在卑诗省是否有一些功能可以帮助我或其他任何功能?或者我必须在没有它的情况下实施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());
   }

似乎您正在做出一些错误的假设,您可能想重新考虑/重新考虑您的方法。

获取新的加密图像。然后计算主题之间的(PSNR(峰值信噪比

BMP图像格式不仅包括像素。如前所述,有标题元数据(大小,深度,...(,如果您对整个文件进行加密,则将不再有意义(它不会是任何BMP(。我会说您可以在图像级别上创建一个新图像并通过像素来处理像素,而不仅仅是加密输入文件。例子:https://www.dyclassroom.com/image-processing-project/how-to-to-get-and-set-pixel-value-in-java

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

所以我研究了其他选择并找到了Ecies。

ecies是一种混合方案,您可能会查看ECIES加密的以下答案https://gist.github.com/amrishodiq/9821413 。输出将需要包含更多/其他信息,而不仅仅是像素,而且绝对不是您可以打开和比较的任何BMP。

混合加密方案假设数据是由对称密码加密的(我不确定在这种情况下,在这种情况下,如果有人知道,请评论(,其中加密密钥是使用ECC派生的。

因此,在末尾您将比较由基础对称算法(例如AES256-CBC(加密的像素,在该算法中,它旨在提供与随机输出无法区分的输出。

必须使用ECC

加密BMP图像

如果您要加密每个像素(假设您将每个像素表示为16位RGB(,则ECC输出比输入数据更长,因此不容易直接将输入值映射到相同维度的输出(尺寸(

最新更新