RSA (CryptoAPI?)

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

RSA (CryptoAPI?)

Сообщение 0xy » 15.01.2010 (Пт) 16:13

Прога на VB должена проверять RSA-512-1024-подписи некоторых данных. Самих подписей (и инструмента для их создания) пока нет (что есть гуд :) ).
Хотелось бы увидеть пример на VB/CryptoAPI, позволяющий:
1) получить RSA-пару (512+);
2) закриптовать RSA небольшой блок данных (не превышиющий длину ключа--кажется, в CryptoAPI это называется "шифрованием сессионого ключа");
3) обеспечить работоспособность п.2 во всех версиях Windows, начиная с 98 .

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: RSA (CryptoAPI?)

Сообщение jangle » 16.01.2010 (Сб) 12:40

0xy писал(а): обеспечить работоспособность п.2 во всех версиях Windows, начиная с 98 .


Категорически не советую юзать CryptoAPI на системах ниже WinXP - разная криптостойкость там. Сам наступил на такую мину от Microsoft, на конкурсе защиты программ, моя защита динамически расшифровывала свой бинарный код используя CryptoAPI, в Windows 2000 все работало отлично. А в WinXP - нет! Функции теже, пароли тоже но в WinXP получается мусор после расшифровки. Оказывается M$ сменила алгоритм( конгресс США изменил закон в области экспорта криптоалгоритмов) и в XP была увеличина длинна ключа. В результате реализации CryptoAPI несовместимы в разных поколениях операционок... Один из тысяч приветов от Билли Гейтса программистам...

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: RSA (CryptoAPI?)

Сообщение 0xy » 16.01.2010 (Сб) 17:25

Спасибо, что предупредили.
Тогда CryptoAPI оставляем в покое.

А есть ли доступные сорцы RSA-1024 на ASM?

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: RSA (CryptoAPI?)

Сообщение jangle » 16.01.2010 (Сб) 20:14

посмотри тут http://pbcrypto.com/pbcrypto.php

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: RSA (CryptoAPI?)

Сообщение 0xy » 17.01.2010 (Вс) 12:33

Там я нашел только RSA-64 на каком-то "бейсике с акцентом" :).
Кстати, обратил внимание, что функции enc и dec почему-то существенно различаются :?: Я же полагал, что функция должна быть универсальной. Или у меня неверное представление о предмете?

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: RSA (CryptoAPI?)

Сообщение MIT » 17.01.2010 (Вс) 13:02

RSA - алгоритм, использующий два ключа: открытый и закрытый. Открытым данный шифруются, закртытым - расшифровываются. Раз ключи разные, значит и алгоритмы обработки данных тоже должны различатся. В этом, собственно, и фишка.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: RSA (CryptoAPI?)

Сообщение Денис » 17.01.2010 (Вс) 14:37

0xy писал(а):на каком-то "бейсике с акцентом"


повер бейсик это бейсик с акценнтом? набашорг!

вот ориентировочный перевод на .Net (даже работает! но с багами. отключай on error resume next и вперед!)
(проект - консольное приложение)

Код: Выделить всё
Module Module1

    Public key(3) As Double
    Public p As Double, q As Double
    Public PHI As Double

    Sub keyGen()
        'Generates the keys for E, D and N
        Dim E#, D#, N#
        Dim PQ_UP = 9999 'set upper limit of random number
        Dim PQ_LW = 3170 'set lower limit of random number
        Dim KEY_LOWER_LIMIT = 10000000 'set for 64bit minimum
        p = 0 : q = 0
        RANDOMIZE(TIMER)
        Do Until D > KEY_LOWER_LIMIT 'makes sure keys are 64bit minimum
            Do Until IsPrime(p) And IsPrime(q) ' make sure q and q are primes
                p = Int((PQ_UP - PQ_LW + 1) * Rnd() + PQ_LW)
                q = Int((PQ_UP - PQ_LW + 1) * Rnd() + PQ_LW)
            Loop
            N = p * q
            PHI = (p - 1) * (q - 1)
            E = GCD(PHI)
            D = Euler(E, PHI)
        Loop
        key(1) = E
        key(2) = D
        key(3) = N
    End Sub

    Function Euler(ByVal E3 As Double, ByVal PHI3 As Double) As Double
        'genetates D from (E and PHI) using the Euler algorithm
        On Error Resume Next
        Dim u1#, u2#, u3#, v1#, v2#, v3#, q#
        Dim t1#, t2#, t3#, z#, uu#, vv#, inverse#
        u1 = 1
        u2 = 0
        u3 = PHI3
        v1 = 0
        v2 = 1
        v3 = E3
        Do Until (v3 = 0)
            q = INT(u3 / v3)
            t1 = u1 - q * v1
            t2 = u2 - q * v2
            t3 = u3 - q * v3
            u1 = v1
            u2 = v2
            u3 = v3
            v1 = t1
            v2 = t2
            v3 = t3
            z = 1
        Loop
        uu = u1
        vv = u2
        If (vv < 0) Then
            inverse = vv + PHI3
        Else
            inverse = vv
        End If
        Euler = inverse
    End Function

    Function GCD(ByVal nPHI As Double) As Double
        'generates a random number relatively prime to PHI
        On Error Resume Next
        Dim nE#, y#
        Dim x As Double
        Dim N_UP = 99999999 'set upper limit of random number for E
        Dim N_LW = 10000000 'set lower limit of random number for E
        RANDOMIZE()
        nE = Int((N_UP - N_LW + 1) * Rnd() + N_LW)
top:
        x = nPHI Mod nE
        y = x Mod nE
        If y <> 0 And IsPrime(nE) Then
            GCD = nE
            Exit Function
        Else
            nE = nE + 1
        End If
        GoTo top
    End Function

    Function IsPrime(ByVal lngNumber As Double) As Byte
        'Returns '%TRUE' if lngNumber is a prime
        On Error Resume Next
        Dim lngCount#
        Dim lngSqr#
        Dim x#
        lngSqr = Int(System.Math.Sqrt(lngNumber)) ' Get the int square root
        If lngNumber < 2 Then
            IsPrime = False
            Exit Function
        End If
        lngCount = 2
        IsPrime = True
        If lngNumber Mod lngCount = 0 Then
            IsPrime = False
            Exit Function
        End If
        lngCount = 3
        For x = lngCount To lngSqr Step 2
            If lngNumber Mod x = 0 Then
                IsPrime = False
                Exit Function
            End If
        Next
    End Function

    Function Mult(ByVal x As Double, ByVal p As Double, ByVal m As Double) As Double
        Dim y As Double
        'encrypts, decrypts values passed to the function.. e.g.
        'Mult = M^E mod N (encrypt)  where M = x , E = p, N = m
        'Mult = M^D mod N (decrypt)
        On Error GoTo error1
        y = 1
        Do While p > 0
            Do While (p / 2) = INT((p / 2))
                x = nMod((x * x), m)
                p = p / 2
            Loop
            y = nMod((x * y), m)
            p = p - 1
        Loop
        Mult = y
        Exit Function
error1:
        y = 0
    End Function

    Function nMod(ByVal x As Double, ByVal y As Double) As Double
        'this function replaces the Mod command. instead of z = x Mod y
        'it is now  z = nMod(x,y)
        On Error Resume Next
        Dim z#
        z = x - (INT(x / y) * y)
        nMod = z
    End Function

    Function GoHex(ByVal xLng As Long) As String

        On Error Resume Next
        Dim I As Long
        Dim xStr As String
        Dim OutStr$ = ""
        xStr = Right$("00000000" & Trim$(Str$(xLng)), 8)
        For I = 1 To Len(xStr)
            OutStr$ = OutStr$ & Chr(Val("&h" & Mid$(xStr, I, 2)))
            I = I + 1
        Next I
        GoHex = OutStr$

    End Function

    Function enc(ByVal tIp As String, ByVal eE As Double, ByVal eN As Double) As String
        On Error Resume Next
        Dim encSt As String
        Dim e2st As String
        Dim I As Long
        enc = ""
        encSt = ""
        e2st = ""
        If tIp = "" Then Exit Function
        For i = 1 To LEN(tIp)
            encSt = encSt & GoHex(Mult(CLng(ASC(MID$(tIp, i, 1))), eE, eN))
        Next i
        enc = encSt
    End Function

    Function dec(ByVal tIp As String, ByVal dD As Double, ByVal dN As Double) As String
        On Error Resume Next
        Dim decSt As String
        Dim z As Long
        Dim zptr As Long
        Dim sTmp As String = ""
        Dim tok As Long
        decSt = ""
        For z = 1 To LEN(tIp)
            sTmp = sTmp & Hex$(Asc(Mid$(tIp, z, 1)))
            sTmp = sTmp & Hex$(Asc(Mid$(tIp, z + 1, 1)))
            sTmp = sTmp & Hex$(Asc(Mid$(tIp, z + 2, 1)))
            sTmp = sTmp & Hex$(Asc(Mid$(tIp, z + 3, 1)))
            tok = VAL(sTmp)
            decSt = decSt + Chr(Mult(tok, dD, dN))
            z = z + 3
            sTmp = ""
        Next z
        dec = decSt
    End Function


    '/////////////////////////////////////////////////////
    '// Demo program - creates private and public keys, //
    '// then encrypts and decrypts a test string.       //
    '/////////////////////////////////////////////////////
    Sub MAIN()
        'Dim key(3) As Double
        Dim EncStr As String
        Dim DecStr As String
        Dim PlainText As String
        PlainText = "ABCDEFGHIJKLMNOPQRSTUVWXYZ 1234567890"   'The message to encrypt
        keyGen()
        Console.WriteLine("Result:")
        Console.WriteLine(" p=" & Str$(p))
        Console.WriteLine(" q=" & Str$(q))
        Console.WriteLine(" PHI=" & Str$(PHI))
        Console.WriteLine(" E=" & Left$(Str$(key(1)) & Space$(12), 12) & "PRIVATE KEY")
        Console.WriteLine(" D=" & Left$(Str$(key(2)) & Space$(12), 12) & "PUBLIC KEY")
        Console.WriteLine(" N=" & Left$(Str$(key(3)) & Space$(12), 12) & "PUBLIC KEY")
        Console.WriteLine()
        Console.WriteLine("Plaintext: " & PlainText)
        EncStr = enc(PlainText, key(1), key(3))
        Console.WriteLine("Encrypted: " & EncStr)
        DecStr = dec(EncStr, key(2), key(3))
        Console.WriteLine("Decrypted: " & DecStr)
        Console.ReadLine()
    End Sub

End Module
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: RSA (CryptoAPI?)

Сообщение 0xy » 18.01.2010 (Пн) 15:33

MIT писал(а):RSA - алгоритм, использующий два ключа: открытый и закрытый. Открытым данный шифруются, закртытым - расшифровываются. Раз ключи разные, значит и алгоритмы обработки данных тоже должны различатся. В этом, собственно, и фишка.
RSA - алгоритм, использующий два ключа: открытый и закрытый. Открытым данный шифруются, закртытым - расшифровываются. Раз ключи разные, значит и алгоритмы обработки данных тоже должны различатся. В этом, собственно, и фишка.

Думаю, алгоритм все таки один, а различия в процедурах вызваны пост-кодированием закриптованых данных в HEX:
Function Mult писал(а): 'encrypts, decrypts values passed to the function.. e.g.
'Mult = M^E mod N (encrypt) where M = x , E = p, N = m
'Mult = M^D mod N (decrypt)


Но переделать этот код под ключ 1024 вряд ли реально :(

Может посоветуете готовую DLL RSA 1024?

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: RSA (CryptoAPI?)

Сообщение jangle » 18.01.2010 (Пн) 20:40

0xy писал(а):Может посоветуете готовую DLL RSA 1024?



Cмотри исходники PGP Open Source проектов


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Mail.ru [бот], Yandex-бот и гости: 23

    TopList