не удается зашифровать изображение с помощью RSA

#java #image #encryption #rsa

#java #изображение #шифрование #rsa

Вопрос:

Я пытаюсь зашифровать изображение BMP с помощью RSA на Java, предполагается, что оно создает зашифрованные и расшифрованные изображения.

Итак, прочитав комментарии и узнав, что небезопасно использовать только RSA; Я редактирую свой вопрос. и попробуйте Java-криптографию, но зашифруйте.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)
  

большая часть моего изображения имеет размер
198×135, который я нашел здесь, в stack 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. Если вы хотите зашифровать с помощью RSA, почему бы вам не использовать встроенный javax.crypto.Cipher для этого? Вероятно, это будет намного быстрее, чем то, что вы делаете.

2. это часть моего школьного проекта

3. (1) Криптограммы RSA — это размер модуля, в вашем случае 2048 или 2047 бит; пиксели в Java BufferedImage равны 24 битам. 2048 или 2047 не помещается в 24. (2) «Учебник» (без добавления) RSA небезопасен, особенно для небольших открытых текстов, таких как ваш; это объясняется в Википедии, которую, я думаю, вы не читали, и много раз в crypto. SX и security.SX. Прямое использование d также неэффективно; см. Те же источники. (3) Если у вас есть общий симметричный ключ, нет смысла использовать его для переноса RSA, просто используйте его для данных (4), но не RC4, он частично сломан

Ответ №1:

И я пошел спросить, я должен отправить зашифрованное изображение на другой компьютер, но проблема в том, что p, q являются случайными

Асимметричное шифрование означает шифрование для определенной цели (открытый ключ).

Таким образом, шаги будут:

  • получатель создает свой закрытый ключ (p, q, e) и открытый ключ (N, d), закрытый ключ (p, q, d) и открытый ключ (N, e)
  • получатель отправляет свой открытый ключ отправителю
  • отправитель использует открытый ключ для шифрования сообщения
  • получатель может использовать свой закрытый ключ для расшифровки данных

Поэтому, если вы хотите использовать RSA для шифрования любых данных, параметры являются случайными для целевого получателя, но задаются для отправителя.

должен ли я шифровать тему с помощью симметричного алгоритма, такого как RC4, и отправлять тему с изображением

Как вы уже можете узнать, операции RSA выполняются довольно медленно. Таким распространенным способом использования RSA является гибридное шифрование — шифрование данных случайным симметричным ключом шифрования и использование RSA для шифрования только случайного ключа.

image.setRGB(i, j, пиксели [i] [j].intValue());

Это не сработает. Шифрование любых данных будет иметь длину длины ключа. Фактически вам нужно 1024 бита для каждого пикселя изображения в вашем случае. Обрезая bigint до intзначения, вы теряете информацию.

Вот почему используется (уже упомянутое) гибридное шифрование

это часть моего школьного проекта

Если вы будете использовать RSA для реальных проектов:

  • Учебник RSA имеет несколько недостатков, чтобы сделать решение безопасным, вам необходимо использовать дополнение, распространенными стандартами являются pkcs # 1 v1.5 или дополнение OAEP
  • На самом деле вы должны использовать библиотеку шифрования по умолчанию, которая намного быстрее и устойчива к атакам по побочным каналам

Комментарии:

1. @kelaka действительно опечатка, спасибо, исправлено

2. заполнение pkcs # v1.5 больше не должно использоваться для новой разработки и должно быть изменено на OAEP везде, где это возможно (по криптографической причине см. crypto.stackexchange.com/questions/47436 /… )