Как конвертировать между строкой и байтом [] без потери целостности - PullRequest
5 голосов
/ 15 мая 2011

Я знаю, как преобразовать строку в байт [] в C #. В данном конкретном случае я работаю со строковым представлением ключа HMAC-SHA256. Допустим, строковое представление этого ключа, которое я получаю из OP OpenID:

"81FNybKWfcM539vVGtJrXRmoVMxNmZHY3OgUro8+pZ8="

Я конвертирую его в байт [] так:

byte[] myByteArr = Encoding.UTF8.GetBytes("81FNybKWfcM539vVGtJrXRmoVMxNmZHY3OgUro8+pZ8=");

Проблема, с которой я столкнулся, заключается в том, что, похоже, исходные данные теряются. Если я возьму байтовый массив из предыдущего шага и преобразую его обратно в строку, он будет отличаться от исходной строки.

string check = Convert.ToBase64String(myByteArr);

проверка заканчивается:

"ODFGTnliS1dmY001Mzl2Vkd0SnJYUm1vVk14Tm1aSFkzT2dVcm84K3BaOD0="

что явно не совпадает с исходным строковым представлением, с которого я начал.

Ответы [ 4 ]

6 голосов
/ 15 мая 2011

При использовании криптографических ключей всегда используйте Convert.FromBase64String и Convert.ToBase64String.Таким образом, вы будете делать это стандартным способом и не потеряете байты из-за проблем с кодированием.Строка Base 64, возможно, не занимает мало места, но это предпочтительный метод для хранения и транспортировки ключей во многих схемах.

Вот быстрая проверка:

byte[] myByteArr = Convert.FromBase64String("81FNybKWfcM539vVGtJrXRmoVMxNmZHY3OgUro8+pZ8=");
string check = Convert.ToBase64String(myByteArr);
Console.WriteLine(check);
// Writes: 81FNybKWfcM539vVGtJrXRmoVMxNmZHY3OgUro8+pZ8=
2 голосов
/ 15 мая 2011

Первая функция (Encoding.UTF8.GetBytes) принимает строку (любого типа) и возвращает byte[], которая представляет эту строку в определенной кодировке - в вашем случае, UTF8.

.Вторая функция (Convert.ToBase64String) принимает байтовый массив (любого типа) и возвращает строку в формате base64, чтобы вы могли сохранить эти двоичные данные в любом ASCII-совместимом поле, используя только печатаемые символы.

Эти функциине являются аналогами.Похоже, что полученная вами строка является строкой в ​​кодировке base64.Если это так, используйте Convert.FromBase64String, чтобы получить byte[], который он представляет, а не Encoding.UTF8.GetBytes.

1 голос
/ 15 мая 2011

Классы кодирования имеют метод GetString для преобразования его из байтового массива обратно в строку.

Если вы использовали кодировку UTF8 для создания байтового массива, вам следует использоватьта же самая кодировка, чтобы вернуть ее снова.

        var original = "81FNybKWfcM539vVGtJrXRmoVMxNmZHY3OgUro8+pZ8=";
        var byteArray = Encoding.UTF8.GetBytes(original);
        var copy = Encoding.UTF8.GetString(byteArray);
        bool match = (copy == original); // This returns true
1 голос
/ 15 мая 2011

Байты, которые вы получаете при использовании byte[] Encoding.GetBytes(string) и декодировании строки base64 - это не одно и тоже.Первый дает вам байты, которые представляют строку.Однако вы хотите декодировать строку base64 обратно в байты, которые она представляет.В этом случае вы хотите использовать Convert.FromBase64String().

string encoded = "81FNybKWfcM539vVGtJrXRmoVMxNmZHY3OgUro8+pZ8=";
byte[] decoded = Convert.FromBase64String(encoded); // this gives the bytes that the encoded string represents
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...