29 / 29 / 3
Регистрация: 08.08.2011
Сообщений: 170
1

Авторизация в WoW WoTLK создать Salt и Verification по SRP6

03.06.2022, 22:37. Показов 631. Ответов 1

Не уверен, что есть люди в теме, но мало ли. Суть такова: необходимо сгенерировать s - Salt и v - Verification для записи в таблицу account эмулятора сервера WoW при создании нового аккаунта.
В качестве вводных данных использовал информацию с AzerothCore
Важно там следующее:

salt
salt is a cryptographically random 32-byte value.

verifier
verifier is derived from salt, as well as the user's username (all uppercase) and their password (all uppercase).

To obtain the verifier you need to calculate:
Calculate h1 = SHA1("USERNAME:PASSWORD"), substituting the user's username and password converted to uppercase.
Calculate h2 = SHA1(salt || h1), where || is concatenation (the . operator in PHP).

NOTE: Both salt and h1 are binary, not hexadecimal strings!
Treat h2 as an integer in little-endian order (the first byte is the least significant).
Calculate (g ^ h2) % N.

NOTE: g and N are parameters, which are fixed in the WoW implementation.
g = 7
N = 0x894B645E89E1535BBDAD5B8B2906 50530801B18EBFBF5E8FAB3C82872A 3E9BB7
Convert the result back to a byte array in little-endian order.

На основе этого соорудил следующий класс:

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
Imports System.Text
Imports System.Numerics
Imports System.Security.Cryptography
 
''' <summary>
''' Класс создания s и v для WoW.
''' </summary>
Public Class SPR6
 
    ''' <summary>
    ''' Соль.
    ''' </summary>
    ''' <returns></returns>
    Public ReadOnly Property Salt As String
        Get
            Return ByteArrayToString(s.ToByteArray).ToUpper
        End Get
    End Property
 
    ''' <summary>
    ''' Верификатор.
    ''' </summary>
    ''' <returns></returns>
    Public ReadOnly Property Verifier As String
        Get
            Return ByteArrayToString(v.ToByteArray).ToUpper
        End Get
    End Property
 
    ReadOnly rnd As RandomNumberGenerator = RNGCryptoServiceProvider.Create()
 
    Dim n As New BigInteger(New Byte() {137, 75, 100, 94, 137, 225, 83, 91, 189, 173, 91, 139, 41, 6, 80, 83, 8, 1, 177, 142, 191, 191, 94, 143, 171, 60, 130, 135, 42, 62, 155, 183})
 
    Dim g As New BigInteger(7)
 
    Dim s As New BigInteger(New Byte() {173, 208, 58, 49, 210, 113, 20, 70, 117, 242, 112, 126, 80, 38, 182, 210, 241, 134, 89, 153, 118, 2, 80, 170, 185, 69, 224, 158, 221, 42, 163, 69})
 
    Dim v As BigInteger
 
    Dim h2 As BigInteger
 
    ''' <summary>
    ''' Конструктор инициализации.
    ''' </summary>
    ''' <param name="username">Имя пользователя.</param>
    ''' <param name="password">Пароль.</param>
    Public Sub New(username As String, password As String)
 
        ' Генерим Salt
        'Dim buff() As Byte = New Byte(31) {}
        'rnd.GetBytes(buff)
        's = New BigInteger(buff)
 
        ' Генерим H2 = H(s | H(P))
        Dim k = Encoding.UTF8.GetBytes(username.Trim.ToUpper & ":" & password.Trim.ToUpper)
        h2 = New BigInteger(SHA1.Create().ComputeHash(CombineData(s.ToByteArray, SHA1.Create().ComputeHash(k))))
 
        ' Генерим v = g ^ H2 % N
        v = BigInteger.ModPow(g, h2, n)
 
    End Sub
 
    ''' <summary>
    ''' Объединяет пару массивов байт.
    ''' </summary>
    ''' <param name="data1">M1</param>
    ''' <param name="data2">M2</param>
    ''' <returns></returns>
    Private Function CombineData(ByVal data1() As Byte, ByVal data2() As Byte) As Byte()
        Return New Byte() {}.Concat(data1).Concat(data2).ToArray()
    End Function
 
    ''' <summary>
    ''' Переводит массив байт в строку.
    ''' </summary>
    ''' <param name="data">Массив байт.</param>
    ''' <returns></returns>
    Private Shared Function ByteArrayToString(ByVal data() As Byte) As String
        Dim hex As New StringBuilder(data.Length * 2)
        For Each b As Byte In data
            hex.AppendFormat("{0:x2}", b)
        Next b
        Return hex.ToString()
    End Function
 
End Class
который вызывается так:

VB.NET
1
2
3
Dim sa As New SPR6(TextBox_UserName.Text.Trim.ToUpper, TextBox_Password.Text.Trim.ToUpper)
Dim salt = sa.Salt
Dim verifier = sa.Verifier
Собственно salt и verifier вставляю в БД и...
Получается что нифига не получается! Жалуется клиент WoW на несовпадение имени или пароля.
Что не так, никак не доеду... Может есть у кого подсказка, а то уже голова кругом?

Добавлено через 21 секунду
Заранее спасибо за любой отзыв!

Добавлено через 17 минут
Обратил внимание, что иногда h2 получает отрицательное значение! Может что то там не так?

Добавлено через 5 часов 51 минуту
Зеркало, где действительно идёт решение:
Создание аккаунта Реализация SRP6 World of Warcraft
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.06.2022, 22:37
Ответы с готовыми решениями:

Бесплатный сервер WoW WotLK
здрасте. кто-нибудь может подсказать бесплатный сервер WoW WotLK? хочется потестить. если понрав,...

Нужен комп для кодинга и игры wow ( и похожих на wow ) =)
Нужен комп в железе особо не секу =) Для игры в Wow и подобные игры ! Для работы в c++ openGl ,...

Не могу создать вертикальный слайдер в WOW Slider
Не могу создать вертикальный слайдер большого размера в WOW Slider. В наличии - 20 вертикальных...

Протокол SRP6
Здравствуйте. Хочу получить подтверждение моего предположения о том, что в протоколе SRP6 можно на...

1
29 / 29 / 3
Регистрация: 08.08.2011
Сообщений: 170
15.06.2022, 21:55  [ТС] 2
Наконец-то рабочий класс. Создан благодаря ребятам из ветки Реализация SRP World of WarCraft и в частности kolorotur и Someone007
Спасибо им за добрую помощь!

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
Imports System.Text
Imports System.Numerics
Imports System.Security.Cryptography
Imports System.Globalization
 
''' <summary>
''' Класс создания s и v для эмулятора WoW CMaNGOS.
''' </summary>
Public Class SRP6
 
    Dim n As BigInteger = BigInteger.Parse("00894B645E89E1535BBDAD5B8B290650530801B18EBFBF5E8FAB3C82872A3E9BB7", NumberStyles.AllowHexSpecifier)
 
    Dim g As BigInteger = New Byte() {7}.ToBigInteger()
 
    ReadOnly v(31) As Byte
 
    ReadOnly s(31) As Byte
 
    ''' <summary>
    ''' Только для чтения: Соль.
    ''' </summary>
    ''' <returns></returns>
    Public ReadOnly Property Salt As String
        Get
            Return s.Reverse.ToHexString
        End Get
    End Property
 
    ''' <summary>
    ''' Только для чтения: Верификатор.
    ''' </summary>
    ''' <returns></returns>
    Public ReadOnly Property Verifier As String
        Get
            Return v.Reverse.ToHexString
        End Get
    End Property
 
    ''' <summary>
    ''' Конструктор инициализации.
    ''' </summary>
    ''' <param name="username">Имя пользователя.</param>
    ''' <param name="password">Пароль.</param>
    ''' <param name="salt">Предустановленная соль.</param>
    Public Sub New(username As String, password As String, Optional ByVal salt As String = "")
 
        If salt = "" Then
            ' Генерим Salt
            Using rng = RandomNumberGenerator.Create()
                rng.GetBytes(s)
            End Using
        Else
            s = salt.ToByteArray.Reverse
        End If
 
        ' Генерим H2 = H(s | H(P))
        Dim p = SHA1.Create().ComputeHash(Encoding.UTF8.GetBytes(username.Trim.ToUpper & ":" & password.Trim.ToUpper))
        Dim h2 = SHA1.Create().ComputeHash(s.Combine(p)).ToBigInteger
 
        ' Генерим v = g ^ H2 % N
        v = BigInteger.ModPow(g, h2, n).ToByteArray
 
    End Sub
 
End Class
 
Module Extensions
 
    <System.Runtime.CompilerServices.Extension>
    Public Function Combine(ByVal data1() As Byte, ByVal data2() As Byte) As Byte()
        Return New Byte() {}.Concat(data1).Concat(data2).ToArray()
    End Function
 
    <System.Runtime.CompilerServices.Extension>
    Public Function ToHexString(ByVal data() As Byte) As String
        Dim hex As New StringBuilder(data.Length * 2)
        For Each b As Byte In data
            hex.AppendFormat("{0:x2}", b)
        Next b
        Return hex.ToString().ToUpper
    End Function
 
    <System.Runtime.CompilerServices.Extension>
    Public Function ToByteArray(ByVal s As String) As Byte()
        Dim data = New Byte((s.Length \ 2) - 1) {}
        For i As Integer = 0 To s.Length - 1 Step 2
            data(i \ 2) = Convert.ToByte(s.Substring(i, 2), 16)
        Next i
        Return data
    End Function
 
    <System.Runtime.CompilerServices.Extension>
    Public Function ToBigInteger(ByVal value() As Byte, Optional ByVal isBigEndian As Boolean = False) As BigInteger
        If isBigEndian Then
            Array.Reverse(value)
        End If
        Return New BigInteger(value.Combine(New Byte() {0}))
    End Function
 
    <System.Runtime.CompilerServices.Extension>
    Public Function Reverse(ByVal data() As Byte) As Byte()
        Array.Reverse(data)
        Return data
    End Function
 
End Module
Следует понимать, что данный класс заточен именно для CMaNGOS - на других эмуляторах не проверял!
Вопрос закрыт! По крайней мере на сегодня. Что будет там... Видно будет.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.06.2022, 21:55
Помогаю со студенческими работами здесь

Реализация SRP6
Здравствуйте. Я занимаюсь реализацией SRP6 алгоритма и никак не могу найти причину не состыковки...

Куплю ключ WotLK
аська 238-333-826 уже купил. хватит аську долбить:)

Стартап MMORPG WotLK (3.3.5а)
В долговременный проект MMORPG для участия в разработке модифицированного сервера на базе...

Реализация SRP6 World of Warcraft
Всем привет! Ребят помогите пожалуйста реализовать функцию SRP6 в C# Есть сервер WOrld of...

PasswordDeriveBytes Salt
Нашёл тут на форму код, для сериализации и зашифровки файла. Видоизменил его под свою проблему. ...

Ошибка Field 'salt' doesn't have a default value
При регистрации на сайте вылезает ошибка &quot;Field 'salt' doesn't have a default value&quot;. Прошу...

Надежность шифрования данных, с открытым Salt и IV
Здравствуйте. Особо не разбираюсь в криптографии, но решил поэкспериментировать, и написать для...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru