Я пытаюсь войти в систему https://www.interactivebrokers.com/sso/Login с помощью клиента ac #.Есть шаг, который включает создание хэша sha1 из имени пользователя и пароля (https://www.interactivebrokers.com/sso/Templates/javascript/myxyz.js, строка 203):
innerHash = CalcSHA1(username + ":" + password);
это вызывает (https://www.interactivebrokers.com/sso/Templates/javascript/sha1.js, строка 113)
calcSHA1Blks(str2blks_SHA1(str);
и str2blks_SHA1 () определяется (https://www.interactivebrokers.com/sso/Templates/javascript/sha1.js, строка 28) как
/*
* Convert a string to a sequence of 16-word blocks, stored as an array.
* Append padding bits and the length, as described in the SHA1 standard.
*/
function str2blks_SHA1(str)
{
var nblk = ((str.length + 8) >> 6) + 1;
var blks = new Array(nblk * 16);
for(var i = 0; i < nblk * 16; i++) blks[i] = 0;
for(i = 0; i < str.length; i++)
blks[i >> 2] |= str.charCodeAt(i) << (24 - (i % 4) * 8);
blks[i >> 2] |= 0x80 << (24 - (i % 4) * 8);
blks[nblk * 16 - 1] = str.length * 8;
return blks;
}
Я не настолько знаком с вещами SHA1, поэтому я не могускажите, является ли то, что в str2blks_SHA1 (), стандартным материалом, который выполняется автоматически внутри .net SHA1CryptoServiceProvider.ComputeHash (), или это то, что мне нужно сделать явно.Я попытался:
SHA1CryptoServiceProvider.ComputeHash(Encoding.UTF8.GetBytes(userName + ":" + password))
, используя одно и то же имя пользователя и пароль в javascript и в .net, и, похоже, он дает другой результат.
Затем я попытался перенести эту функцию str2blks_SHA1 ()в C #, но я не понимаю, как создать массив байтов (blks) (что требуется SHA1CryptoServiceProvider.ComputeHash ()), так как кажется, что каждый элемент массива в blks может быть больше байта (просто глядя на str.длина * 8)) ...
Итак, уже есть какая-то реализация SHA1, которая делает то же самое, что и эта реализация javascript?Или, если мне действительно нужно реализовать это самостоятельно, как мне портировать str2blks_SHA1 ()?
Спасибо