IllegalBlockSize-Ausnahme beim Ausführen von RSA für Zeichenfolgenbytes

Ich versuche, RSA-Verschlüsselungs- und Entschlüsselungsklassen in Java für einen Server zu schreiben, auf dem der Client Zeichenfolgen hin und her übergibt. Ich habe den folgenden Code für die Klassen:

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;
}
}

Ich habe den folgenden Code für eine Testklasse:

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);


}
}

Wenn ich jedoch versuche, die Testklasse auszuführen, funktionieren die Schlüsselgenerierung und -verschlüsselung einwandfrei, aber beim Entschlüsseln wird ein Fehler ausgegeben. Der Fehler lautet javax.crypto.IllegalBlockSizeException: Die Daten dürfen nicht länger als 128 Byte sein, meine Daten sind jedoch definitiv kleiner als 128 Byte.

Ich kann bestätigen, dass beim Umwandeln des öffentlichen Schlüssels in einen String und zurück derselbe öffentliche Schlüssel zurückgegeben wird. Ich habe auch versucht, den Code nur mit Bytes zu testen, und das funktioniert gut. Der Fehler liegt anscheinend darin, dass versucht wird, die aus einer Zeichenfolge entnommenen Bytes zu entschlüsseln.

Gibt es eine Möglichkeit, aus einem String entnommene Bytes zu entschlüsseln, ohne diesen Fehler auszulösen? Vielen Dank im Voraus, es wird sehr geschätzt.

EDIT: Ich denke, ich hätte das Problem vielleicht isoliert. Ich versuche, ein verschlüsseltes Bytearray in einen String zu verwandeln und dann die Bytes daraus zu extrahieren, aber das verschlüsselte Bytearray wird ohnehin nicht richtig in einen String übersetzt . Ist das richtig und wenn ja, wie verwandle ich das Bytearray richtig in einen String, damit wir ihn austauschen können?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage