IllegalBlockSize Исключение при выполнении RSA на байтах строк

Я пытаюсь написать классы шифрования и дешифрования RSA на Java для сервера, где клиент будет передавать строки назад и вперед. У меня есть следующий код для классов:

public class RSAEncryption {
public static final String KEYGENALGORITHM = "RSA";
public static final String ALGORITHM = "RSA/ECB/PKCS1Padding";

public static KeyPairContainer generateKey() {
      KeyPairGenerator keyGen;
      KeyPair key;
    try {
        keyGen = KeyPairGenerator.getInstance(KEYGENALGORITHM);
        keyGen.initialize(1024);
        key = keyGen.generateKeyPair();
        return new KeyPairContainer(key.getPublic(), key.getPrivate());
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
        System.out.println("Error: No such algorithm");
    }
    return null;
 }

public static String pubkeyToString(PublicKey key){
    byte[] array = key.getEncoded();
    BASE64Encoder encoder = new BASE64Encoder();
    String tempstring = encoder.encode(array);
    return tempstring;
}

public static PublicKey stringToPubKey(String string){
    BASE64Decoder decoder = new BASE64Decoder();
    try {
        byte[] array = decoder.decodeBuffer(string);
        X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(array);
        KeyFactory keyFact = KeyFactory.getInstance(KEYGENALGORITHM);
        PublicKey pubKey = keyFact.generatePublic(x509KeySpec);
        return pubKey;
    } catch (IOException | NoSuchAlgorithmException | InvalidKeySpecException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } return null;
}

public static byte[] rSAencrypt(byte[] plaintext, String keystring) {
    Cipher cipher;
    try {
        PublicKey key = stringToPubKey(keystring);
        cipher = Cipher.getInstance(ALGORITHM);
        cipher.init(Cipher.ENCRYPT_MODE, key);
        byte[] cipherText = cipher.doFinal(plaintext);
        //String cipherText = new String(cipherTextbytes);
        return cipherText;
    } catch (NoSuchAlgorithmException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (NoSuchPaddingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InvalidKeyException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalBlockSizeException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (BadPaddingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return null;

}

public static byte[] rSAdecrypt(byte[] ciphertext, PrivateKey key){
    Cipher cipher;
    try {
        //byte[] ciphertext = ciphertextstring.getBytes();
        cipher = Cipher.getInstance(ALGORITHM);
        cipher.init(Cipher.DECRYPT_MODE, key);
        byte[] decryptedText = cipher.doFinal(ciphertext);
        return decryptedText;
    } catch (NoSuchAlgorithmException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (NoSuchPaddingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InvalidKeyException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalBlockSizeException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (BadPaddingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return null;
}
}

У меня есть следующий код для тестового класса:

public class RSAEncryptionKeyDemo {
public static void main(String[] args){
    KeyPairContainer keyPair = RSAEncryption.generateKey();
    PublicKey pubKey = keyPair.getPublicKey();
    String pubKeytext = RSAEncryption.pubkeyToString(pubKey);
    System.out.println(pubKeytext);

    String plaintext = "Hello world!";
    byte[] ciphertext = RSAEncryption.rSAencrypt(plaintext.getBytes(), pubKeytext);
    String ciphertextString = new String(ciphertext);
    System.out.println(ciphertextString);

    PrivateKey privkey = keyPair.getPrivateKey();
    byte[] decryptedText = RSAEncryption.rSAdecrypt(ciphertextString.getBytes(), privkey);

    String decryptedTextstring = new String(decryptedText);

    System.out.println(decryptedTextstring);


}
}

Тем не менее, когда я пытаюсь запустить тестовый класс, генерация ключей и шифрование работают нормально, но я получаю сообщение об ошибке при попытке расшифровать. Ошибка javax.crypto.IllegalBlockSizeException: данные не должны быть длиннее 128 байт, однако мои данные определенно меньше 128 байт.

Я могу подтвердить, что преобразование открытого ключа в строку и обратно возвращает один и тот же открытый ключ. Я также пытался протестировать код, используя только байты, и это прекрасно работает. Ошибка, по-видимому, заключается в попытке расшифровать байты, взятые из строки.

Есть ли способ расшифровать байты, взятые из строки, не выбрасывая эту ошибку? Заранее спасибо, это очень ценится.

РЕДАКТИРОВАТЬ: я думаю, я мог бы изолировать проблему. Я пытаюсь превратить зашифрованный байтовый массив в строку, а затем извлечь из нее байты, но зашифрованный байтовый массив все равно не переводится должным образом в строку, поэтому, когда я получаю байты, он не извлекает исходный зашифрованный байтовый массив. , Это правильно, и если да, то как мне правильно превратить байтовый массив в строку, чтобы мы могли ее заменить?

Ответы на вопрос(1)

Ваш ответ на вопрос