我必须使用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输出比输入数据更长,因此不容易直接将输入值映射到相同维度的输出(尺寸(