не может зашифровать изображение с RSA - PullRequest
0 голосов
/ 20 апреля 2019

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

Хорошо, прочитав комментарии и узнав, что использовать 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.

1 Ответ

1 голос
/ 20 апреля 2019

И я пошел спросить, мне нужно отправить изображение шифрования на другой компьютер, но проблема в том, что 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 к intValue, вы теряете информацию.

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

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

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

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