【发布时间】:2019-05-11 10:36:07
【问题描述】:
我必须用ECC加密bmp图像,但我发现它非常困难,尤其是当像素将映射到椭圆曲线上时,我完全不明白。所以我研究了其他选择并找到了 ECIES。
我尝试使用 bouncycastle 在 java 中实现它,它可以工作,但问题是我的代码将图像加密为文件,但我去加密图像的像素并获得一个新的加密图像,这样我就可以计算加密和未加密图像之间的 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());
}
【问题讨论】:
-
当然不能读取——这就是加密的目的。在正确加密的文件中,如果没有事先解密,没有一个字节是可用的。因此,加密的 BMP 文件没有 BMP 头,也没有 BMP 数据。
-
这是我让它可读的问题。我试图加密每个像素但它没有工作
-
这没有任何意义。文件是加密的或可读的,但绝不会同时加密。编辑您的问题,准确描述您想要实现的目标以及为什么要这样做。
-
Tnx 给你的笔记。我编辑我的问题
-
似乎您做了很多假设,这些假设可能是错误的,从而导致您采用错误的方法。你想达到什么目的?计算噪声比?
标签: java image encryption elliptic-curve