首页 > 解决方案 > 无法使用 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 加密数据。

标签: javaimageencryptionrsa

解决方案


我去问,我必须将加密图像发送到其他电脑,但问题是 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 填充
  • 实际上,您应该使用默认的加密库,该库更快且对侧信道攻击具有弹性

推荐阅读