Задать вопрос
EminH
@EminH

помогите перевести с PHP на C#

Добрый день, помогите пожалуйста с кодом на C#

есть такая функция на PHP
 public function getCode($secret,$time = null) {
        
        if (!$time) {
            $time = floor(time() / 30);
        }
        $base32 = new FixedBitNotation(5, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567', TRUE, TRUE);
        $secret = $base32->decode($secret);
        
        $time = pack("N", $time);
        $time = str_pad($time,8, chr(0), STR_PAD_LEFT);
        
        $hash = hash_hmac('sha1',$time,$secret,true);
        $offset = ord(substr($hash,-1));
        $offset = $offset & 0xF;
        
        $truncatedHash = self::hashToInt($hash, $offset) & 0x7FFFFFFF;
        $pinValue = str_pad($truncatedHash % self::$PIN_MODULO,6,"0",STR_PAD_LEFT);;
        return $pinValue;
    }
    
    protected  function hashToInt($bytes, $start) {
        $input = substr($bytes, $start, strlen($bytes) - $start);
        $val2 = unpack("N",substr($input,0,4));
        return $val2[1];
    }


Откопал в сети её аналог на C# (.Net), но результаты выдаются другие

public static readonly DateTime UNIX_EPOCH = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);

public static string GetPassword(string secret )
{
    long counter = (long)((DateTime.UtcNow - UNIX_EPOCH).TotalSeconds ) / 30;

    return GeneratePassword(secret, counter);
}
		 public static string GeneratePassword(string secret, long iterationNumber)
{
int digits = 6;
    byte[] counter = BitConverter.GetBytes(iterationNumber);

    if (BitConverter.IsLittleEndian)
        Array.Reverse(counter);

    byte[] key = Encoding.ASCII.GetBytes(secret);

    HMACSHA1 hmac = new HMACSHA1(key, true);

    byte[] hash = hmac.ComputeHash(counter);

    int offset = hash[hash.Length - 1] & 0xf;

    int binary =
        ((hash[offset] & 0x7f) << 24)
        | ((hash[offset + 1] & 0xff) << 16)
        | ((hash[offset + 2] & 0xff) << 8)
        | (hash[offset + 3] & 0xff);

    int password = binary % (int)Math.Pow(10, digits); // 6 digits

    return password.ToString(new string('0', digits));
}


помогите найти ошибку,

Спасибо
  • Вопрос задан
  • 4542 просмотра
Подписаться 2 Оценить Комментировать
Решения вопроса 1
opium
@opium
Просто люблю качественно работать
А что вам мешает включить отладчик и пройтись по коду, его тут 20 строчек же.
Удивляют меня всегда такие вопросы очень сильно.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Fr3nzy
@Fr3nzy
Кодировка у вас одинаковая используется в C# и PHP? Иными словами, вы должны, например, использовать UTF-8 и там и там.
Ответ написан
Комментировать
EminH
@EminH Автор вопроса
Fr3nzy,
Кодировка у вас одинаковая используется в C# и PHP

Все аргументы и результаты только латинница и цифры… а именно только этот набор символов: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы