java - 无法使用 RSA 加密图像
问题描述
我正在尝试在 java 中使用 RSA 加密 BMP 图像,它应该创建加密和解密的图像。
好的,所以在阅读了评论并了解到单独使用 RSA 是不安全的;我编辑了我的问题。和 tryd Java Cryptography 但 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 加密数据。
解决方案
我去问,我必须将加密图像发送到其他电脑,但问题是 p,q 是随机的
非对称加密意味着对特定目标(公钥)进行加密。
所以步骤是:
- 接收器创建它的
私钥 (p, q, e) 和公钥 (N, d)私钥 (p, q, d) 和公钥 (N, e) - 接收方将其公钥发送给发送方
- 发件人使用公钥加密消息
- 接收者可以使用它的私钥来解密数据
所以如果你想使用 RSA 加密任何数据,参数对于目标接收者是随机的,但对于发送者是给定的。
我是否必须使用 RC4 等对称算法加密主题并使用图像发送主题
您可能已经发现,RSA 操作非常缓慢。使用 RSA 的常见方法是混合加密- 使用随机对称加密密钥加密数据并使用 RSA 仅加密随机密钥。
image.setRGB(i, j,pixels[i][j].intValue());
这行不通。任何数据的加密都将具有密钥长度的长度。实际上,在您的情况下,每个图像像素都需要 1024 位。将 bigint 修剪为 intValue 会丢失信息。
这就是为什么使用(已经提到的)混合加密的原因
这是我学校项目的一部分
如果您将 RSA 用于实际项目:
- 教科书 RSA有几个弱点,为了使解决方案安全,您需要使用填充,常用标准是 pkcs#1 v1.5 或 OAEP 填充
- 实际上,您应该使用默认的加密库,该库更快且对侧信道攻击具有弹性
推荐阅读
- dns - 我在我的新网站上安装了 Facebook Pixel,我注意到我的网站还有其他域。这些是什么?
- python - 在 Python 中更改嵌套字典中键的值
- reactjs - 在 JSX 中使用带有 react.js 的循环
- json - 将数据从 wordpress 发送到 3rd 方 API 的最佳做法是什么
- java - Android URLConnection 发布本地
- python - 如何让python学会用另一个变量代替一个变量?
- android - Gradle 构建失败 - Android Studio 4.0
- c# - 创建 Visual Studio 扩展添加菜单和表单
- excel - 宏无法从 Sharepoint 看到打开的工作簿
- makefile - /usr/bin/ld: 找不到 -lnetcdf?