2014-12-27 164 views
0

把亞洲和其他字符我已經加密了大量的文字,導致此:在Visual Studio中的源代碼

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

問題是,Visual Studio的2013年給它有關的各種錯誤。我已經將編碼更改爲沒有BOM的UTF-8,否則編譯器會立即崩潰,如果我嘗試編譯它。它給文本提供了各種錯誤,例如:'0x80':這個字符在標識符中是不允許的。我試圖在文本之前添加u8,使其爲UTF-8,例如:u8"ꖟ럵꼹ᐦෑ䵖"只能給出錯誤:未找到u8標識符

有沒有一種方法可以將加密文本成功加載到源代碼中?

+1

使用'wchar_t'或使每個字符成爲轉義序列。 – 2014-12-27 15:53:37

+0

好吧我會這樣做 – 2014-12-27 16:02:56

+0

加密的輸出不是一個有效的字符串,所以你不應該把它存儲爲一個char數組。如果你必須把它變成一個有效的字符串,你需要對它進行編碼。 Base64編碼是大多數應用程序的標準選擇。 – 2014-12-27 18:30:25

回答

1

問題是AES產生的輸出與隨機無法區分。基本上這意味着任何字節都可以包含任何值。不是所有的字節值都是有效的字符編碼。基本上你要求系統把二進制轉換回字符,而二進制不是從字符開始構建的。

會發生什麼情況是無法識別的字節編碼被無聲地刪除。 不可打印的字符(如Unicode代碼點0x20(32)以下的字符)可能會發生同樣的情況。因此,最終將其解碼爲字符串並將其編碼回字節將導致數據丟失。這種數據丟失當然也是隨機發生的;對於較短的密文,你可能是幸運的,根本沒有數據丟失。

現在如果你需要一個字符串,那麼答案就是使用編碼將二進制編碼爲字符串,然後再返回而不會丟失。對於一個相對有效的編碼(每3個字節4個字符),大多數開發人員會使用base64。如果你只是想顯示一些較小的值,那麼十六進制將具有易於被人眼讀取(每字節2個字符)的優點。對於密文的測試代碼,密碼和IV代碼我個人總是更喜歡十六進制,因爲它很容易看到/計算大小。

在諸如C/C++的語言中,您還可以使用\xXXunsigned char*中的所有內容進行編碼。我會警告這種做法,因爲它會哄你使用字符串函數,如strlen。如果使用空終止的字符串,這當然是一個問題。儘量保持字符和字節之間的明確區分,即使語言沒有。更好的選擇是使用char[](和sizeof而不是strlen)。