У вас есть несколько (много) проблем в вашем коде с шифрованием
Первое - правильно закодируйте ваши данные, строка в Java предназначена для представления печатных символов.Как только вы работаете с шифрованием (работая на уровне byte []), вам необходимо кодировать или декодировать значения.
Пример - ваш код выведет «keyHandle», это хеш объекта байтового массива, а нена самом деле сами зашифрованные данные
byte[] keyHandle = cipher.doFinal(or.getBytes());
System.out.println("Key Handle: "+keyHandle);
...
String rm = publicKey.toString() + pub + sc + keyHandle;
Используются в кодировке hex или base64 для распечатки вывода.То же относится и к подписи.
Я не могу решить ошибку расшифровки.
String kh = s.substring(64);
byte[] kh1 = kh.getBytes();
..
byte[] keyHandle = cipher.doFinal(kh1);
И вы просто предполагаете, что можете расшифровать некоторую случайную подстроку?Шифрование с использованием RSA приведет к выводу размера ключа (например, 2048 бит), и вы должны хранить и расшифровывать как целое, а не как любую подстроку.
В качестве учебного упражнения - попробуйте просто зашифровать и расшифровать, кодировать,расшифруйте, чтобы изучить примитивы, которые вы можете (повторно) использовать.