Помещение азиатских и других символов в исходный код Visual Studio

0

Я зашифровал много текста, в результате чего:

const char* encrypted[] = {
"ꖟ럵꼹ᐦෑ䵖","ꗹモ拧ᔞ诞凲ḏ","᜷瞗긚⧿숯塚","輶䖙挿斃ぁ忋","掂䉧딻䠕᭖嬽핹ճ","輶䖙挿斃ぁ忋","輶䖙挿斃ぁ忋","輶䖙挿斃ぁ忋","ㄿ爛泰먅轭➊㻎⌧","輶䖙挿斃ぁ忋","輶䖙挿斃ぁ忋","輶䖙挿斃ぁ忋",
"욊蚘坸ꭤ䱤㇔鸽","욊蚘坸ꭤ䱤㇔鸽","輶䖙挿斃ぁ忋","輶䖙挿斃ぁ忋","䀴♃�ハ狥䖢","輶䖙挿斃ぁ忋","輶䖙挿斃ぁ忋","輶䖙挿斃ぁ忋","輶䖙挿斃ぁ忋","輶䖙挿斃ぁ忋","輶䖙挿斃ぁ忋","輶䖙挿斃ぁ忋"
}

Проблема в том, что Visual Studio 2013 дает всевозможные ошибки. Я изменил кодировку на UTF-8 без спецификации, иначе компилятор сразу же сработает, если я попытаюсь его скомпилировать. Он дает всевозможные ошибки с текстом, например: "0x80": этот символ не разрешен в идентификаторе. Я попытался добавить в u8 перед текстом, чтобы сделать его UTF-8, например: u8"ꖟ럵꼹ᐦෑ䵖" только для получения ошибки: идентификатор u8 не найден

Есть ли способ успешно загрузить зашифрованный текст в исходный код?

  • 1
    Используйте wchar_t или сделайте каждый символ escape-последовательностью.
  • 0
    Хорошо, я сделаю это
Показать ещё 3 комментария
Теги:
visual-studio
encryption
aes
utf-8

1 ответ

1
Лучший ответ

Проблема в том, что AES производит вывод, который не отличается от случайного. В основном это означает, что любой байт может содержать любое значение. Однако не все байтовые значения являются действительными кодировками символов. В основном вы просите систему преобразовать двоичный код обратно в символы, в то время как двоичный код никогда не был создан из символов в первую очередь.

Случается, что непризнанные байтовые кодировки молча удаляются. То же самое может произойти с непечатаемыми символами, такими как символы ниже кода кода Unicode 0x20 (32). Таким образом, в конечном итоге его декодирование на строку и кодирование обратно в байты приведет к потере данных. Разумеется, эта потеря данных происходит случайным образом; для более короткого зашифрованного текста вам может быть повезло и вообще не потерять данные.

Теперь, если вам нужна строка вообще, ответ заключается в использовании кодировки, которая кодирует двоичный код в строку и обратно без потерь. Для относительно эффективного кодирования (4 символа для каждого 3 байта) большинство разработчиков переходят на base64. Если вы просто хотите отображать некоторые более мелкие значения, то гексадецималы будут иметь преимущество в том, что их легче читать глазами человека (по 2 символа для каждого байта). Для тестового кода для зашифрованного текста, ключей и IV в коде я лично всегда предпочитаю hexadecimals, так как легко видеть/вычислять размер.

В таких языках, как C/C++, вы также можете кодировать все в unsigned char* используя \xXX. Я предупреждал бы о таких практиках, как он призывает вас использовать строковые функции, такие как strlen. Это, конечно, проблема, если используются строки с нулевым завершением. Постарайтесь постоянно различать символы и байты, даже если язык не работает. Лучшей альтернативой является использование char[]sizeof вместо strlen).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню