ошибка при шифровании изображения с помощью RSA - PullRequest
0 голосов
/ 26 марта 2012

Мне нужно зашифровать изображение размером 151 * 15 с помощью RSA.

Это код Java для шифрования файла изображения.

import javax.crypto.Cipher;
plaintext = time;
cipher = Cipher.getInstance('RSA');
keygen = java.security.KeyPairGenerator.getInstance('RSA');
keyPair = keygen.genKeyPair();
cipher.init(Cipher.ENCRYPT_MODE, keyPair.getPrivate())

plaintextUnicodeVals = uint16(plaintext)
plaintextBytes = typecast(plaintextUnicodeVals, 'int8')
ciphertext = cipher.doFinal(plaintextBytes);

это файл изображения для шифрования

enter image description here

Я получил следующую ошибку

Возникла исключительная ситуация Java:

javax.crypto.IllegalBlockSizeException: Data must not be longer than 117 bytes
    at com.sun.crypto.provider.RSACipher.a(DashoA13*..)
    at com.sun.crypto.provider.RSACipher.engineDoFinal(DashoA13*..)
    at javax.crypto.Cipher.doFinal(DashoA13*..)

Пожалуйста, дайте мне подсказку или процедуру, чтобы я мог подойти в правильном направлении.

Спасибо

1 Ответ

4 голосов
/ 26 марта 2012

Вам необходимо использовать AES для шифрования больших данных.RSA не может зашифровать данные, превышающие размер ключа.Таким образом, вы можете зашифровать ключ AES с помощью RSA, а весь образ - с помощью AES (256 бит) (т. Е. Сгенерировать разные ключи AES для каждого изображения).

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


Например:

  public static byte[] encrypt(byte[] data) {
    try {
        KeyPair keyPair = initalizeKeyPair();

        final javax.crypto.Cipher rsa = javax.crypto.Cipher.getInstance("RSA");
        rsa.init(javax.crypto.Cipher.ENCRYPT_MODE, keyPair.getPublic());

        SecureRandom random = new SecureRandom();

        final byte[] secretKey = new byte[16];
        random.nextBytes(secretKey);

        final javax.crypto.Cipher aes = javax.crypto.Cipher.getInstance("AES");
        SecretKeySpec k = new SecretKeySpec(secretKey, "AES");
        aes.init(javax.crypto.Cipher.ENCRYPT_MODE, k);

        final byte[] ciphedKey = rsa.doFinal(secretKey);
        final byte[] ciphedData = aes.doFinal(data);

        byte[] result = new byte[256 + ciphedData.length];

        System.arraycopy(ciphedKey, 0, result, 0, 256);
        System.arraycopy(ciphedData, 0, result, 256, ciphedData.length);

        return result;
    } catch (... e) {
        throw new SomeException(e);
    }
}
...