Kotlin не удается декодировать строку Base64, закодированную с помощью функции MySQL TO_BASE64

#mysql #email #kotlin #base64 #aes

#mysql #Адрес электронной почты #kotlin #base64 #aes

Вопрос:

Мне было поручено отправить строку из базы данных на одном сервере по потенциально небезопасному каналу (основной текст электронного письма — это жесткое требование) другому в другой среде. Чтобы сделать это безопасно, я разработал метод, с помощью которого строка сжимается, шифруется с помощью AES, преобразуется в base64, чтобы система электронной почты не искажала ее, а затем этот процесс выполняется в обратном направлении на другом конце. Для создания зашифрованных и закодированных строк используются эти функции MySQL (я пока не беспокоюсь о шаге сжатия):

 set @foo = aes_encrypt('foobarbazfoobarbazfoobarbazfoobarbaz', 'AN_AES_KEY');
set @bar = to_base64(convert(@foo using ascii)); /* this is what's sent via email */
  

Программа-получатель написана на Kotlin и должна отменить каждый из этих шагов, а затем записать результат в базу данных. К сожалению, я, похоже, сталкиваюсь с первым препятствием. Я перепробовал множество вариантов декодирования base64, и, к сожалению, ни один из них не воспроизводит зашифрованный текст AES, который я затем расшифровал бы своим ключом. Я заметил следующее поведение при изменении функции декодирования:

  • Каждая функция выдает бессмысленный вывод, который не соответствует зашифрованному тексту AES.

  • Каждая функция выдает правильное количество байтов (т. Е. такое же, как в зашифрованном тексте)

Любая информация была бы высоко оценена!

Ответ №1:

Я использую статические переменные. Шифрование и кодировка base64 на стороне MySQL являются:

 ibGlUpmQMyIxSOomWRbejfCyE637P8ViPFDi5AlRNmaUyHenwtCYD79rdCSYg8ur
  

Используя это в качестве входных данных для Kotlin:

 import java.util.Base64
...
val fromSql: String = "ibGlUpmQMyIxSOomWRbejfCyE637P8ViPFDi5AlRNmaUyHenwtCYD79rdCSYg8ur"
val decodedBytes: ByteArray = Base64.getDecoder().decode(fromSql)
  

Вы можете использовать decodedBytes в качестве прямого ввода для вашего метода дешифрования ECB Kotlin AES.

При расшифровке этого ввода с помощью ключа AN_AES_KEY вы получите исходный ввод обратно на стороне Kotlin:

 output: foobarbazfoobarbazfoobarbazfoobarbaz