Преобразование хэша SHA-2 в буквенно-цифровой хеш (vb.net)

У меня есть хеш-значения SHA-2. Вот пример:

qlbQbEd8khe2vEYG9acKScUiVTC6y1UorkMvptATwwxkVApkOCUH7hwkncbi2TY78HrIeC19G8EHlaAmj6sBAwCxhF2TeOpmJ1+2OfbfXF+jMWUO74O7WHJuwoq+R5aKa0c2QYbyrcd/DWSprdkrF1gyz+RWVXYQug63aAhC0j0=

Мне нужно преобразовать их в буквенно-цифровой хэш, то есть использовать только заглавные буквы и цифры (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ). Для сравнения хэшей SHA-2 процесс должен быть обратимым.

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

Я читал, что могу попытаться перекодировать этот хеш в Base36, но мне это не удалось. Кто-нибудь может дать какие-то предложения?


person Justinas Rubinovas    schedule 07.07.2020    source источник
comment
Я думаю, что невозможно быть короче, потому что SHA-2 диапазон 0-9,a-z,A-Z,Symbols больше, чем Base36 диапазон 0-9,A-Z   -  person Mo Khalefa    schedule 08.07.2020
comment
Ну, поскольку я использую его только для сравнения, я могу несколько усечь этот хеш (за счет некоторой безопасности). Но сначала мне нужно преобразовать его в Base36 и обратно ... И я не могу понять, как это сделать.   -  person Justinas Rubinovas    schedule 08.07.2020
comment
Итак, вы хотите, чтобы было доступно меньше символов, но вы также хотите, чтобы оно было короче? Похоже, эти цели несовместимы друг с другом. Усечение только усугубит ситуацию.   -  person Joel Coehoorn    schedule 08.07.2020
comment
Итак, какие у меня варианты? Используете что-то другое вместо SHA-2? Что я могу использовать, что было бы достаточно безопасно, но при этом создавать буквенно-цифровые ключи длиной не более 12 символов?   -  person Justinas Rubinovas    schedule 08.07.2020
comment
Существует множество примеров кодирования байтовых массивов ‹--› base36. Кроме того, SHA-2 - это семейство хэшей. Результатом в вашем примере является кодировка base64 1024-битного числа, что означает, что ни один из хэшей в семействе SHA-2 не мог его создать. Наконец, необходимы дополнительные сведения, например, сколько лицензионных ключей вы выдадите в течение срока службы системы и как вы планируете проверять действительность лицензионного ключа.   -  person President James K. Polk    schedule 08.07.2020
comment
На самом деле, я до сих пор не могу найти в VB.NET работающего примера кодирования байтового массива в base36 и обратно ... Только некоторые используют класс BigInteger, который предназначен для байтовых массивов, созданных из числа. Что касается количества лицензий, то оно может приближаться к нескольким тысячам, а может и не больше. Лицензия подтверждается асимметричной проверкой подписи RSA. У меня есть рабочая модель, я просто хочу сделать эти лицензионные ключи короче и удобнее для ввода.   -  person Justinas Rubinovas    schedule 08.07.2020


Ответы (1)


Этот код является примером преобразования Base36 в / из Base26

Const Base36 As String = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Const Base26 As String = "abcdefghijklmnopqrstuvwxyz"

Function Num2Base(Vlu As Long, Base As String) As String
    Dim A() As Integer = Nothing
    Dim y As Integer = -1
    Dim X As Long = Vlu
    Dim Ln As Integer = Base.Length
    Do While X > -1
        y = y + 1
        ReDim Preserve A(y)
        A(y) = X Mod Ln
        X = ((X - A(y)) / Ln) - 1
    Loop
    Dim res As String = ""
    If y >= 0 Then
        For Each d As Integer In A
            res &= Mid(Base, d + 1, 1)
        Next
    End If
    Return res
End Function
Function Base2Num(s As String, Base As String) As Long
    If s.Length = 0 Then
        Throw New Exception("'S' can not be empty")
    End If

    Dim res As Long = -1
    Dim Ln As Integer = Base.Length
    Dim x As Integer = 0
    For Each c In s
        res += (Base.IndexOf(c) + 1) * (Ln ^ x)
        x += 1
    Next
    Return res
End Function

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Dim Num As Long = 1313
    Dim b36 As String = Num2Base(Num, Base36) 'convert Num to base36
    Dim b26 As String = Num2Base(Num, Base26) 'convert Num to base26
    MessageBox.Show("Num:" & Num & vbCrLf & "ToBase36:" & b36 & vbCrLf & "ToBase26:" & b26, "Message 1")

    Dim N36 As Long = Base2Num(b36, Base36) 'convert Base36 to Num
    Dim N26 As Long = Base2Num(b26, Base26) 'convert Base26 to Num
    MessageBox.Show("N36:" & N36 & vbCrLf & "N26:" & N26, "Message 2")

    b26 = Num2Base(Base2Num(b36, Base36), Base26) 'convert Base36 to Base 26

    MessageBox.Show("Base36 to Base 26 :" & b26, "Message 3")

    b36 = Num2Base(Base2Num(b26, Base26), Base36) 'convert Base26 to Base 36
    MessageBox.Show("Base26 to Base 36 :" & b36, "Message 4")

    MessageBox.Show(Num2Base(1486154465904653, Base36), "Message 5")
End Sub

К сожалению, этот код не может работать с длинными строками (более 12 символов) из-за ограничения типа Long, поэтому вам может потребоваться разделить SHA -2 строка на мелкие детали

person Mo Khalefa    schedule 07.07.2020