IllegalBlockSize Исключение при использовании асимметричного шифрования (Public Private Key Enc) - PullRequest
0 голосов
/ 21 октября 2018

Я установил шифрование с открытым и закрытым ключом на Java и распространил открытые ключи двух пользователей (связь между двумя пользователями).Теперь я хочу, чтобы пользователи обменивались симметричным ключом.Что я должен делать:

  1. Пользователь A генерирует ключ.
  2. Пользователь A шифрует ключ своим закрытым ключом, а затем шифрует его открытым ключом B.
  3. Пользователь A отправляет зашифрованный ключ.
  4. Пользователь B получает зашифрованный ключ.
  5. Пользователь B дешифрует ключ своим закрытым ключом, а затем открытым ключом A.

Мой код для пользователя A для генерации ключа:

1. KeyGenerator keyGenerator = KeyGenerator.getInstance(ENCMETHOD);
2. SecureRandom secureRandom = new SecureRandom();
3. int keyBitSize = 128;
4. keyGenerator.init(keyBitSize, secureRandom);
5. secretKey = keyGenerator.generateKey();
6. encodedKey = Base64.getEncoder().encodeToString(secretKey.getEncoded());

// encrypt with public key of B and then my private key
7. String encryptedMessage = encodedKey;
8. encryptedMessage = ac.encryptText
               (
                        ac.encryptText(encryptedMessage, otherUserPublickey),
                        privateKey
                );

В строке 8 выдается следующая ошибка:

javax.crypto.IllegalBlockSizeException: Data must not be longer than 117 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:2165)
    at driver.AsymmetricCryptography.encryptText(AsymmetricCryptography.java:73) // please refer to the code section below for this method
    at driver.ClientOne.main(ClientOne.java:158) // this is line 8 in the above code

Метод AsymmetricCryptography.encryptText (String message, PrivateKey key):

public String encryptText(String msg, PrivateKey key)
        throws
        UnsupportedEncodingException, IllegalBlockSizeException,
        BadPaddingException, InvalidKeyException {
        this.cipher.init(Cipher.ENCRYPT_MODE, key);
        return Base64.encodeBase64String(cipher.doFinal(msg.getBytes("UTF-8")));
}

// this.cipher = Cipher.getInstance("RSA");

Любая помощь очень ценится.Спасибо.

1 Ответ

0 голосов
/ 22 октября 2018

Похоже, вы превышаете объем данных, которые вы можете зашифровать с помощью RSA (см. Здесь https://security.stackexchange.com/questions/44702/whats-the-limit-on-the-size-of-the-data-that-public-key-cryptos-can-handle), что по сути является размером модуля, возможно, из-за кодировки Base 64.

...