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

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

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

?80 xor 45
 125 

?80 xor 125
 45 


соответственно можешь просто посимвольно поксорить две строки
...
Рейтинг: 0 / 0
Из строчек A и B получить C, чтобы по C и B потом восстановить A.
    #38593397
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно еще ксорить поверх этого неким своим "тайным" ключом, чтобы никто не догадался
...
Рейтинг: 0 / 0
Из строчек A и B получить C, чтобы по C и B потом восстановить A.
    #38593400
Казанский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Неоптимально, но вроде работает
Код: 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
Из строчек A и B получить C, чтобы по C и B потом восстановить A.
    #38593457
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Казанский,
спасибо, идею понял,

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

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

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

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

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


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