我加密了很多导致此问题的文字:
const char* encrypted[] = {
"ꖟ럵꼹ᐦෑ䵖","ꗹモ拧ᔞ诞凲ḏ","瞗긚⧿숯塚","輶䖙挿斃ぁ忋","掂䉧딻䠕᭖嬽핹ճ","輶䖙挿斃ぁ忋","輶䖙挿斃ぁ忋","輶䖙挿斃ぁ忋","ㄿ爛泰먅轭➊㻎⌧","輶䖙挿斃ぁ忋","輶䖙挿斃ぁ忋","輶䖙挿斃ぁ忋",
"욊蚘坸ꭤ䱤㇔鸽","욊蚘坸ꭤ䱤㇔鸽","輶䖙挿斃ぁ忋","輶䖙挿斃ぁ忋","䀴♃�ハ狥䖢","輶䖙挿斃ぁ忋","輶䖙挿斃ぁ忋","輶䖙挿斃ぁ忋","輶䖙挿斃ぁ忋","輶䖙挿斃ぁ忋","輶䖙挿斃ぁ忋","輶䖙挿斃ぁ忋"
}
问题是,Visual Studio 2013提供了各种各样的错误。我已将编码更改为没有BOM的UTF-8,否则如果我尝试编译它,编译器会立即崩溃。它会在文本中出现各种错误,例如:' 0x80':标识符中不允许使用此字符。我尝试在文本之前添加u8,例如:UTF-8:u8"ꖟ럵꼹ᐦෑ䵖"
只给出错误:找不到u8标识符
有没有办法成功将加密文本加载到源代码中?
答案 0 :(得分:1)
问题是AES产生的输出与随机无法区分。基本上这意味着任何字节都可以包含任何值。然而,并非所有字节值都是有效的字符编码。基本上你要求系统将二进制文件转换回字符,而二进制文件从来就不是从字符构造的。
无法识别的字节编码会被静默删除。 不可打印的字符可能会发生同样的事情,例如Unicode代码点0x20(32)以下的字符。因此,最后将其解码为字符串并将其编码回字节将导致数据丢失。这种数据丢失当然也是随机发生的;对于较短的密文,您可能很幸运,并且根本没有数据丢失。
现在如果你根本需要一个字符串,那么答案就是使用一个编码,将二进制编码为字符串并再次返回而不会丢失。对于相对有效的编码(每3个字节4个字符),大多数开发人员都使用base64。如果您只想显示一些较小的值,那么十六进制将具有人眼更容易阅读的优点(每个字节为2个字符)。对于代码中的密文,密钥和IV的测试代码,我个人总是喜欢十六进制,因为很容易看到/计算大小。
在C / C ++等语言中,您还可以使用unsigned char*
对\xXX
中的所有内容进行编码。我会警告这种做法,因为它会诱使你使用字符串函数,例如strlen
。如果使用空终止字符串,这当然是一个问题。尝试并始终明确区分字符和字节,即使语言没有。更好的选择是使用char[]
(和sizeof
代替strlen
)。