来自字节的字符串中的字节不等于原始字节
Bytes from string from bytes not equals origin bytes
我有一个加密算法 (RSA) 并试图让它能够加密和解密任何长度的文本,我遇到的问题是在字节块加密之后,如果我转换为字符串(使用 Encoding.ASCII.GetString
) 然后返回(使用 GetBytes
) - 我没有得到相同的字节数组,与 UTF8 相同,我不是很喜欢编码,有人可以帮助我如何解决这个问题,所以我可以将加密的字节转换成字符串并将其传递给解密算法,它会得到正确的字节?
byte[] bytes = new byte[] { 0xe1, 0xde, 0x4a, 0x10, 0xea, 0x74, 0x8f, 0x18, 0xd7, 0x93, 0x04, 0x7a, 0x10, 0xb2, 0xa8, 0xfa, 0x11, 0x00, 0x7a, 0xfb, 0xcb,
0x19, 0xb7, 0xf5, 0x25, 0x26, 0x6d, 0xa0, 0x0d, 0xdc, 0xe5, 0x0a };
Console.WriteLine(string.Join(" ", bytes));
// 255 222 74 16 234 116 143 24 215 147 4 122 16 178 168 250 17 0 122 251 203 25 183 245 37 38 109 160 13 220 229 10
byte[] bytes2 = Encoding.ASCII.GetBytes(Encoding.ASCII.GetString(bytes));
Console.WriteLine(string.Join(" ", bytes2));
// 63 63 74 16 63 116 63 24 63 4 122 16 63 63 63 17 0 122 63 63 25 63 63 37 38 109 63 13 63 63 10
byte[] bytes3 = Encoding.UTF8.GetBytes(Encoding.ASCII.GetString(bytes));
Console.WriteLine(string.Join(" ", bytes3));
// 63 63 74 16 63 116 63 24 63 4 122 16 63 63 63 17 0 122 63 63 25 63 63 37 38 109 63 13 63 63 10
我从加密“hello world!”中得到的字节数组使用我的加密算法中的 32 字节密钥,如您所见,ascii 或 utf8 转换为字符串然后返回字节不会返回我的原始字节数组,为什么
您不应该使用 Encoding.XYZ 对象将字节序列转换为字符串,除非这些字节实际上构成了该编码中的字符串。它们的目的是在您从提供字节的任何形式的媒体(如 FileStream 或类似媒体)中读取文本时进行 bytes-to-string 转换。但是,这些字节实际上必须针对您选择的编码进行正确编码。您不能使用这些编码将任意字节序列转换为字符串。正如您已经观察到的,他们会破坏结果。您可能会幸运地获得相当多的字节序列,但如果您使用任何加密安全加密算法,那么运气会立即 运行。
而是使用 Base64 或 85 之类的东西。Base64 内置于 .NET 中,如果您有此代码:
byte[] original = ...
string encoded = Encoding.ASCII.GetString(original);
byte[] decoded = Encoding.ASCII.GetBytes(encoded);
您只需更改为:
byte[] original = ...
string encoded = Convert.ToBase64String(original);
byte[] decoded = Convert.FromBase64String(encoded);
我有一个加密算法 (RSA) 并试图让它能够加密和解密任何长度的文本,我遇到的问题是在字节块加密之后,如果我转换为字符串(使用 Encoding.ASCII.GetString
) 然后返回(使用 GetBytes
) - 我没有得到相同的字节数组,与 UTF8 相同,我不是很喜欢编码,有人可以帮助我如何解决这个问题,所以我可以将加密的字节转换成字符串并将其传递给解密算法,它会得到正确的字节?
byte[] bytes = new byte[] { 0xe1, 0xde, 0x4a, 0x10, 0xea, 0x74, 0x8f, 0x18, 0xd7, 0x93, 0x04, 0x7a, 0x10, 0xb2, 0xa8, 0xfa, 0x11, 0x00, 0x7a, 0xfb, 0xcb,
0x19, 0xb7, 0xf5, 0x25, 0x26, 0x6d, 0xa0, 0x0d, 0xdc, 0xe5, 0x0a };
Console.WriteLine(string.Join(" ", bytes));
// 255 222 74 16 234 116 143 24 215 147 4 122 16 178 168 250 17 0 122 251 203 25 183 245 37 38 109 160 13 220 229 10
byte[] bytes2 = Encoding.ASCII.GetBytes(Encoding.ASCII.GetString(bytes));
Console.WriteLine(string.Join(" ", bytes2));
// 63 63 74 16 63 116 63 24 63 4 122 16 63 63 63 17 0 122 63 63 25 63 63 37 38 109 63 13 63 63 10
byte[] bytes3 = Encoding.UTF8.GetBytes(Encoding.ASCII.GetString(bytes));
Console.WriteLine(string.Join(" ", bytes3));
// 63 63 74 16 63 116 63 24 63 4 122 16 63 63 63 17 0 122 63 63 25 63 63 37 38 109 63 13 63 63 10
我从加密“hello world!”中得到的字节数组使用我的加密算法中的 32 字节密钥,如您所见,ascii 或 utf8 转换为字符串然后返回字节不会返回我的原始字节数组,为什么
您不应该使用 Encoding.XYZ 对象将字节序列转换为字符串,除非这些字节实际上构成了该编码中的字符串。它们的目的是在您从提供字节的任何形式的媒体(如 FileStream 或类似媒体)中读取文本时进行 bytes-to-string 转换。但是,这些字节实际上必须针对您选择的编码进行正确编码。您不能使用这些编码将任意字节序列转换为字符串。正如您已经观察到的,他们会破坏结果。您可能会幸运地获得相当多的字节序列,但如果您使用任何加密安全加密算法,那么运气会立即 运行。
而是使用 Base64 或 85 之类的东西。Base64 内置于 .NET 中,如果您有此代码:
byte[] original = ...
string encoded = Encoding.ASCII.GetString(original);
byte[] decoded = Encoding.ASCII.GetBytes(encoded);
您只需更改为:
byte[] original = ...
string encoded = Convert.ToBase64String(original);
byte[] decoded = Convert.FromBase64String(encoded);