我正在尝试使用Java中的RSA加密BMP图像,应该创建加密和解密的图像。
好吧,在阅读评论并了解到单独使用RSA是不安全的;我编辑我的问题。并尝试使用Java密码学,但是cipher.doFinal()接受的数据长度不超过245个字节
File bmpFile = new File("C:\\Users\\acer\\Desktop\\py\\6.bmp");
BufferedImage image = ImageIO.read(bmpFile);
ByteArrayOutputStream baos=new ByteArrayOutputStream();
ImageIO.write(image, "bmp", baos );
byte[] b = baos.toByteArray();
byte[] b1=new byte[b.length];
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
keyPairGen.initialize(2048);
KeyPair pair = keyPairGen.generateKeyPair();
PublicKey publicKey = pair.getPublic();
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
cipher.update(b);
b1 = cipher.doFinal();
bmpFile=new File("C:\\Users\\acer\\Desktop\\py\\66.bmp");
FileOutputStream fos = new FileOutputStream(bmpFile);
fos.write(b1);
fos.flush();
fos.close();
它给出了:
Exception in thread "main" javax.crypto.IllegalBlockSizeException: Data must not be longer than 245 bytes
at com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:344)
at com.sun.crypto.provider.RSACipher.engineDoFinal(RSACipher.java:389)
at javax.crypto.Cipher.doFinal(Cipher.java:2048)
我的大部分图片都是198x135 我在堆栈onverflow中发现
The RSA algorithm can only encrypt data that has a maximum byte length of the RSA key length in bits divided with eight minus eleven padding bytes, i.e. number of maximum bytes = key length in bits / 8 - 11.
并说您必须使用对称密钥加密数据并使用rsa加密对称密钥。 但是我什么时候用RSA加密数据。
答案 0 :(得分:1)
然后我问,我必须将加密图像发送到其他PC,但是问题是p,q是随机的
非对称加密意味着针对特定目标(公共密钥)进行加密。
因此步骤将是:
因此,如果要使用RSA加密任何数据,则参数对于目标接收者是随机的,但对于发送者而言是随机的。
我是否必须使用RC4之类的对称算法加密主题并随图像发送主题
您可能已经发现,RSA操作非常缓慢。因此,使用RSA的常见方法是混合加密-使用随机对称加密密钥加密数据,然后使用RSA仅加密随机密钥。
image.setRGB(i,j,pixels [i] [j] .intValue());
这行不通。任何数据的加密将具有密钥长度。实际上,您需要为每个图像像素需要1024位。将bigint修饰为正在丢失信息的intValue。
这就是为什么使用(已经提到的)混合加密的原因
这是我学校项目的一部分
如果您将RSA用于现实生活中的项目,则: