Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Из строчек A и B получить C, чтобы по C и B потом восстановить A. / 9 сообщений из 9, страница 1 из 1
21.03.2014, 22:55
    #38593383
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из строчек A и B получить C, чтобы по C и B потом восстановить A.
Например есть две строчки вида:

Код: vbnet
1.
2.
3.
4.
5.
Dim A as String
Dim B as String

A = F63B6DE5-CF12
B = 983817DC-7813


(понятно, что hex)
Надо придумать как из A и B получить C (например такого же вида),
чтоб я зная B и C мог легко и однозначно восстановить A.

Код: vbnet
1.
Dim C as String



Ну, т.е. какую-то суперзащиту я на этом строить не хочу, скорее чуть подстраховаться от совсем уж явного обмана.
A и B -это ID компьютера полученные разными способами.
A -как было, B-как будет.
Например клиент говорит: у меня был A, а стал B. Я ему говорю - а запусти ка вот это и скажи мне C. (т.е. программа по прежнему знает A, но не теперь показывает пользователю B). Проверяю равен ли A тому что у него был, и если да, то соглашаюсь с пользователем.

Подскажите идею.
...
Рейтинг: 0 / 0
21.03.2014, 23:03
    #38593390
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из строчек A и B получить C, чтобы по C и B потом восстановить A.
1) разбей на две части, переведи в Long и используй обычную операцию сложения-вычитания
2) побитовая операция "исключающее ИЛИ" (XOR)
...
Рейтинг: 0 / 0
21.03.2014, 23:15
    #38593392
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из строчек A и B получить C, чтобы по C и B потом восстановить A.
Shocker.Pro,

а не напишешь как это сделать (ток не посылай в FAQ). Чет я не силен ни в шестнадцатиричных, ни в переводах, ни в XOR-ах,
а студентом был очень давно...чтоб такие вещи с ходу делать.
...
Рейтинг: 0 / 0
21.03.2014, 23:26
    #38593395
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из строчек A и B получить C, чтобы по C и B потом восстановить A.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
?125 xor 45
 80 

?80 xor 45
 125 

?80 xor 125
 45 


соответственно можешь просто посимвольно поксорить две строки
...
Рейтинг: 0 / 0
21.03.2014, 23:27
    #38593397
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из строчек A и B получить C, чтобы по C и B потом восстановить A.
можно еще ксорить поверх этого неким своим "тайным" ключом, чтобы никто не догадался
...
Рейтинг: 0 / 0
21.03.2014, 23:38
    #38593400
Казанский
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из строчек A и B получить C, чтобы по C и B потом восстановить A.
Неоптимально, но вроде работает
Код: vbnet
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.
Sub ff()
Dim A As String
Dim B As String
Dim c As String, i&, j&, d$, g%, h%

A = "F63B6DE5-CF12"
B = "983817DC-7813"

For i = 1 To Len(A)
  g = AscW(Mid(A, i, 1))
  If g > 57 Then g = g - 9
  h = AscW(Mid(B, i, 1))
  If h > 57 Then h = h - 9
  c = c & ChrW((g Xor h) + 65)
Next
Debug.Print "закодировано", c
For i = 1 To Len(c)
  g = AscW(Mid(c, i, 1)) - 65
  h = AscW(Mid(B, i, 1))
  If h > 57 Then h = h - 9
  g = g Xor h
  If g > 57 Then g = g + 9
  d = d & ChrW(g)
Next
Debug.Print "раскодировано", d

End Sub
...
Рейтинг: 0 / 0
22.03.2014, 05:34
    #38593457
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из строчек A и B получить C, чтобы по C и B потом восстановить A.
Казанский,
спасибо, идею понял,

но идея Shocker.Pro понравилась больше.
Каждая пара символов кодирует число 0-255
Через Xor от a и b всегда можно однозначно получить c, и наоборот зная c и b -получить a
У меня одна и та же ф-ция работает в обе стороны.
А в промежутке накручиваем n-ное число "тайных" хексов и уже черта с два угадаешь.
А назад раскручиваем в обратном порядке.

Код: vbnet
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.
Const ddd = "1819B37F-8A90" '"тайные хексы"
Const eee = "C710DBDF-D540"

Function decode(ByVal str_a As String, ByVal str_b As String) As String
  Dim i As Long
  Dim aa As String, bb As String
  Dim tempS As String
  Dim tt As String
     
  If Mid(str_a, 9, 1) <> "-" Then Exit Function
  str_a = Replace(str_a, "-", "")
  If Len(str_a) <> 12 Then Exit Function
  
  If Mid(str_b, 9, 1) <> "-" Then Exit Function
  str_b = Replace(str_b, "-", "")
  If Len(str_b) <> 12 Then Exit Function
  
  For i = 1 To 11 Step 2
    aa = "&H" & Mid(str_a, i, 2)
    If IsNumeric(aa) = False Then Exit Function
    bb = "&H" & Mid(str_b, i, 2)
    If IsNumeric(bb) = False Then Exit Function
    tt = CStr(Hex((CLng(aa)) Xor (CLng(bb))))
    If Len(tt) = 1 Then tt = "0" & tt
    tempS = tempS & tt
  Next
  decode = Left(tempS, 8) & "-" & Right(tempS, 4)
End Function

Private Sub CommandDecode_Click()
  TextС.Text = decode(decode(decode(TextA.Text, TextB.Text), ddd), eee)
End Sub

Private Sub CommandEncode_Click()
  TextA.Text = decode(decode(decode(TextC.Text, eee), ddd), TextB.Text)
End Sub


Shoker, спасибо. Я правильно осознал твою идею?
...
Рейтинг: 0 / 0
22.03.2014, 08:57
    #38593479
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из строчек A и B получить C, чтобы по C и B потом восстановить A.
Дмитрий77Я правильно осознал твою идею?ну да, фактически ты объединил две идеи в одну, хотя я как раз предполагал что-то ближе к варианту Казанского.
Дмитрий77А назад раскручиваем в обратном порядке.по идее порядок значения не имеет. То есть поксорив тремя разными "тайными" ключами ты можешь получить исходный результат, поксорив этими же ключами в произвольном порядке. Таким образом иметь три тайных ключа нет смысла (если они берутся из одного места), потому что это будет эквивалентно одному ключу, который является результатом ксора их между собой )
...
Рейтинг: 0 / 0
22.03.2014, 09:48
    #38593494
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из строчек A и B получить C, чтобы по C и B потом восстановить A.
Shocker.Pro,

Ну, на самом деле дурью страдаю.
Если охота, можешь почитать "подробности".
Неоднозначность "ID компьютера" при нормальном запуске и "Run As Admin". Понять бы хоть..

Вероятность того что это вообще пригодится, ничтожно мала.
Т.е. во первых, лицензия выданная старому юзеру под ID (A), даже если после обновления покажет другой ID (B), будет продолжать работать если ID(A) не изменился.
Во вторых на большинстве современных систем ID(A)=ID(B).
А ID(A) может меняться только на компе типа моего ноута при смене режима user/admin, и это редкость.
Т.е. чтоб такую фигню высечь (чтоб лицензия перестала работать), надо на компе "типа" моего ноута активироваться старой версией под суперадмином, работать под суперадмином, а на новой версии вдруг решить что теперь надо работать под юзером.
Это при том что прога под юзером прекрасно работает.

Хотя вот с другой прогой, которую планирую "откреплять от требования админа" скорее всего эти проблемы у кого-то будут, т.к. там по определению все ключи активировались "под админом".

Перестраховался, перешел на новые версии защиты, теперь перестраховываю себя от "вдруг действующая лицензия у кого-то слетит".
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Из строчек A и B получить C, чтобы по C и B потом восстановить A. / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]