Пишу приложение-криптер на java для школьного проекта(можно сказать еще новичок), хочу реализовать алгоритм RSA, чтобы можно было через него передать "собеседнику" секретный ключ от AES. Вот соответсвенно код метода шифрования. pubKey и priKey уже реализованы и автоматически генерируются. На вход подаётся строка strOpenTextE и я хочу, чтобы можно было передать зашифрованное сообщение через любую соц.сеть мессенджер, для этого байтовый массив asString делаю из строки на кодировке Base64, но тут сразу появляется проблема. Base64.Decoder иногда не читает повторяющиеся буквы, или вообще добавляет свои байты из-за чего после расшифровки исходный текст искажается. Я не знаю, что делать. Другие кодировки дают непонятный набор символов, который даже не расшифровывается, а эта кодировка даёт строку латинских букв и символов, которые можно как раз передать собеседнику, как строку. Буду рад, если кто подскажет, как сделать, чтобы то исходный текст шифровался в строку, а затем расшифровывался без ошибок.
private static void Shifrated() throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, InvalidKeySpecException, IOException {
cipher = Cipher.getInstance("RSA");
if (mode == 1) {
cipher.init(Cipher.ENCRYPT_MODE, pubKey);
byte[] asString = new sun.misc.BASE64Decoder().decodeBuffer(strOpenTextE);
byte[] bytes = cipher.doFinal(asString);
strCipherE = new sun.misc.BASE64Encoder().encode(bytes);
} else if (mode == 2) {
cipher.init(Cipher.DECRYPT_MODE, priKey);
byte[] asString = new sun.misc.BASE64Decoder().decodeBuffer(strCipherD);
byte[] bytes1 = cipher.doFinal(asString);
strOpenTextD = new sun.misc.BASE64Encoder().encode(bytes1);;
}
@FXML//код контроллера, который шифрует сообщение void useMethod(ActionEvent event){
RsaCreate.setPublicKey(friendKey.getText()); //friendkey - TextField с публичным ключом
RsaCreate.madePubKey();
RsaCreate.setStrOpenTextE(yourKey.getText()); //yourKey - TextField с сообщением, которое надо зашифровать
RsaCreate.setMode(1);
RsaCreate.Start();
getKey.setText(RsaCreate.getStrCipherE());
}
@FXML//код, который расшифровывает сообщение void mouse(Event event){
if(!newFriendKey.getText().equals("")) {
RsaCreate.setStrCipherD(newFriendKey.getText()); //newFriendKey - TexField с зашифрованной строкой
RsaCreate.setMode(2);
RsaCreate.Start();
profileKey.setText(RsaCreate.getStrOpenTextD());
}
Подскажите, что неправильно делаю (
byte[] bytes = cipher.doFinal(asString);
//javax.xml.bind.DatatypeConverter#printHexBinary
String encrypted = DatatypeConverter.printHexBinary(bytes);
И обратно:
byte[] dataBytes = DatatypeConverter.parseHexBinary(data);
UPD1
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(128);
SecretKey priKey = keyGenerator.generateKey();
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, priKey);
byte[] bytes = cipher.doFinal("ddsss".getBytes(StandardCharsets.UTF_8));
String encrypted = DatatypeConverter.printHexBinary(bytes);
System.out.println(encrypted);
cipher.init(Cipher.DECRYPT_MODE, priKey);
byte[] bytes1 = cipher.doFinal(DatatypeConverter.parseHexBinary(encrypted));
System.out.println(new String(bytes1));
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости