无法使用RSA

时间:2019-04-20 17:00:06

标签: java image encryption rsa

我正在尝试使用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加密数据。

1 个答案:

答案 0 :(得分:1)

  

然后我问,我必须将加密图像发送到其他PC,但是问题是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填充
  • 实际上,您应该使用默认的加密库,该库要快得多,并且可以抵抗侧通道攻击