HEX-представление массива байтов

Я чувствую себя довольно глупо, спрашивая об этом, но поскольку я не знаю ответа, я все равно продолжаю.

Я пробую некоторый код аутентификации и хочу знать, почему массив байтов, который я получаю от Rfc2898DeriveBytes, должен быть преобразован в HEX и снова в массив байтов, чтобы он правильно инициализировал мой объект HMACSHA1. Я чувствую, что я делает что-то глупое или просто упускает что-то очевидное.

Мой клиентский код представляет собой функцию javascript, основанную на crypto-js;

var key256bit = Crypto.PBKDF2(passwordEntered, saltBytes, 32, { iterations: 1000 }); 
var hmacBytes = Crypto.HMAC(Crypto.SHA1, url, key256bit, { asBytes: true });
var base64Hash = Crypto.util.bytesToBase64(hmacBytes);

Код на стороне моего сервера выглядит следующим образом;

    Rfc2898DeriveBytes rfc2898 = new Rfc2898DeriveBytes(password,
                                              encoding.GetBytes(salt), 1000);
    byte[] key = rfc2898.GetBytes(32);

    // Don't think I should need to do this. 
    // However, it wont work if I initialise HMACSHA1 
    // with the rfc2898.GetBytes(32)
    string test = ByteArrayToString(key); 

    HMACSHA1 hmacSha1 = new HMACSHA1(encoding.GetBytes(test));

    byte[] computedHash = hmacSha1.ComputeHash(encoding.GetBytes(requestUri));
    string computedHashString = Convert.ToBase64String(computedHash);

Мой метод ByteArrayToString, который Я взял из Интернета:

private static string ByteArrayToString(byte[] ba)
{
    StringBuilder hex = new StringBuilder(ba.Length * 2);
    foreach (byte b in ba)
        hex.AppendFormat("{0:x2}", b);
    return hex.ToString();
}

Итак, я вижу, что я получаю 32 байта от моего вызова rfc2898.GetBytes(32), Я преобразовал это в HEX, используя метод ByteArrayToString, чтобы подтвердить, что он соответствует тому, что Я вижу в своей переменной Javascript key256bit.Теперь моя тестовая переменная представляет собой строку длиной 64, и когда я передаю ее в конструктор HMACSHA1 с помощью encoding.GetBytes(test), это массив байтов длиной 64.

Документ о криптографии -js немного не хватает, но я думал вызов Crypto.PBKDF2 с параметром 32 и он создавал ак ey длиной 32 байта (или 256 бит).

Любое разъяснение приветствуется.

6
задан Mr Moose 3 April 2012 в 08:57
поделиться