Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: RSA-работа с большими числами Добавлено: 28.09.07 11:14  

Автор вопроса:  Vladimir | ICQ: 464840172 
Здравствуйте!
Есть проблемма на VB6 при реализации алгоритма шифрования RSA (http://ru.wikipedia.org/wiki/RSA)
А именно при вычеслении следующего кода:
m=111111: e=3: n=9173503
c=m^e mod n 'здесь вылетает ошибка Overflow

все переменные as Variant/Double

Насколько я понимаю - обьявленным переменным не хвотает размера, но как в VB обьявить переменным тип с достаточным размером?
Можно связаться по icq:464840172

Ответить

  Ответы Всего ответов: 6  

Номер ответа: 1
Автор ответа:
 Winand



Вопросов: 87
Ответов: 2795
 Web-сайт: winandfx.narod.ru
 Профиль | | #1
Добавлено: 28.09.07 22:30
не знаю...
может вот так попробовать
c = (m ^ e) - Int(m ^ e / n) * n 'здесь НЕ вылетает ошибка Overflow


небольшие числа правильно считает=)

Ответить

Номер ответа: 2
Автор ответа:
 BUMM ®



Вопросов: 8
Ответов: 482
 Профиль | | #2 Добавлено: 29.09.07 00:12
поиск рулит. Искать "длинная арифметика"

Ответить

Номер ответа: 3
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #3 Добавлено: 29.09.07 00:20
Надо реализовывать свой тип данных, который будет уметь работать с большими числами. Как правило, суть сводится к набору обычных чисел которые влязять в лонг, работая с таким массивом чисел в цикле, на каждом шаге берётся первая запись, а для все остальных элементов данного массива делается с двиг, на то количество бит, которое содержит например тот же Long, т.е. 32

Ответить

Номер ответа: 4
Автор ответа:
 Ra$cal



ICQ: 8068014 

Вопросов: 18
Ответов: 817
 Web-сайт: www.rascalspb.narod.ru
 Профиль | | #4
Добавлено: 29.09.07 01:02
есть библиотеки на асме. работают оч быстро. на васике такое творение будет ппц каким медленным. точнее использование этого в рса.

Ответить

Номер ответа: 5
Автор ответа:
 BUMM ®



Вопросов: 8
Ответов: 482
 Профиль | | #5 Добавлено: 29.09.07 01:46
да нафиг тот RSA
на вот класс весь на API. Правда у меня он заточен под .NET и с итальянскими комментами. но думаю на вб6 перевести труда не составит
''''''''''''''''''''''''''''''''''''''''''''''
' Esempio: Crittografare i dati usando DPAPI '
''''''''''''''''''''''''''''''''''''''''''''''

Imports System
Imports System.Text
Imports System.Runtime.InteropServices
Imports System.ComponentModel
Imports Microsoft.VisualBasic


    Public Class DPAPI

        <;DllImport("crypt32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
        Private Shared Function CryptProtectData _
        ;( _
            ByRef pPlainText As DATA_BLOB, _
            ByVal szDescription As String, _
            ByRef pEntropy As DATA_BLOB, _
            ByVal pReserved As IntPtr, _
            ByRef pPrompt As CRYPTPROTECT_PROMPTSTRUCT, _
            ByVal dwFlags As Integer, _
            ByRef pCipherText As DATA_BLOB _
        ;) As Boolean
        End Function

        <;DllImport("crypt32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
        Private Shared Function CryptUnprotectData _
        ;( _
            ByRef pCipherText As DATA_BLOB, _
            ByRef pszDescription As String, _
            ByRef pEntropy As DATA_BLOB, _
            ByVal pReserved As IntPtr, _
            ByRef pPrompt As CRYPTPROTECT_PROMPTSTRUCT, _
            ByVal dwFlags As Integer, _
            ByRef pPlainText As DATA_BLOB _
        ;) As Boolean
        End Function

        <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)> _
        Friend Structure DATA_BLOB
            Public cbData As Integer
            Public pbData As IntPtr
        End Structure

        <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)> _
        Friend Structure CRYPTPROTECT_PROMPTSTRUCT
            Public cbSize As Integer
            Public dwPromptFlags As Integer
            Public hwndApp As IntPtr
            Public szPrompt As String
        End Structure

        Private Const CRYPTPROTECT_UI_FORBIDDEN As Integer = 1
        Private Const CRYPTPROTECT_LOCAL_MACHINE As Integer = 4

        Private Shared Sub InitPrompt _
        ;( _
            ByRef ps As CRYPTPROTECT_PROMPTSTRUCT _
        ;)
            ps.cbSize = Marshal.SizeOf(GetType(CRYPTPROTECT_PROMPTSTRUCT))
            ps.dwPromptFlags = 0
            ps.hwndApp = IntPtr.Zero
            ps.szPrompt = Nothing
        End Sub

        Private Shared Sub InitBLOB _
        ;( _
            ByVal data As Byte(), _
            ByRef blob As DATA_BLOB _
        ;)


            If data Is Nothing Then
                data = New Byte(0) {}
            End If

            blob.pbData = Marshal.AllocHGlobal(data.Length)

            If blob.pbData.Equals(IntPtr.Zero) Then
            Throw New Exception( _
                    "Impossibile allocare memoria per struttura BLOB";)
            End If

            blob.cbData = data.Length
            Marshal.Copy(data, 0, blob.pbData, data.Length)
        End Sub

        Public Enum KeyType
            UserKey = 1
            MachineKey
        End Enum

        Private Shared defaultKeyType As KeyType = KeyType.UserKey

        Public Shared Function Encrypt _
        ;( _
            ByVal plainText As String _
        ;) As String
            Return Encrypt(defaultKeyType, plainText, String.Empty, String.Empty)
        End Function

        Public Shared Function Encrypt _
        ;( _
            ByVal keyType As KeyType, _
            ByVal plainText As String _
        ;) As String
            Return Encrypt(keyType, plainText, String.Empty, String.Empty)
        End Function

        Public Shared Function Encrypt _
        ;( _
            ByVal keyType As KeyType, _
            ByVal plainText As String, _
            ByVal entropy As String _
        ;) As String
            Return Encrypt(keyType, plainText, entropy, String.Empty)
        End Function

        Public Shared Function Encrypt _
        ;( _
            ByVal keyType As KeyType, _
            ByVal plainText As String, _
            ByVal entropy As String, _
            ByVal description As String _
        ;) As String
            If plainText Is Nothing Then
                plainText = String.Empty
            End If
            If entropy Is Nothing Then
                entropy = String.Empty
            End If
            Return Convert.ToBase64String( _
                Encrypt(keyType, _
                        Encoding.UTF8.GetBytes(plainText), _
                        Encoding.UTF8.GetBytes(entropy), _
                        description))
        End Function

        Public Shared Function Encrypt _
        ;( _
            ByVal keyType As KeyType, _
            ByVal plainTextBytes As Byte(), _
            ByVal entropyBytes As Byte(), _
            ByVal description As String _
        ;) As Byte()

            If plainTextBytes Is Nothing Then
                plainTextBytes = New Byte(0) {}
            End If

            If entropyBytes Is Nothing Then
                entropyBytes = New Byte(0) {}
            End If

            If description Is Nothing Then
                description = String.Empty
            End If

            Dim plainTextBlob As DATA_BLOB = New DATA_BLOB
            Dim cipherTextBlob As DATA_BLOB = New DATA_BLOB
            Dim entropyBlob As DATA_BLOB = New DATA_BLOB

            Dim prompt As _
                    CRYPTPROTECT_PROMPTSTRUCT = New CRYPTPROTECT_PROMPTSTRUCT
            InitPrompt(prompt)

            Try

                Try
                    InitBLOB(plainTextBytes, plainTextBlob)
                Catch ex As Exception
                Throw New Exception("Impossibile inizializzare BLOB del testo.", ex)
                End Try
                Try
                    InitBLOB(entropyBytes, entropyBlob)
                Catch ex As Exception
                Throw New Exception("Impossibile inizializzare  BLOB della entropia.", ex)
                End Try
                Dim flags As Integer = CRYPTPROTECT_UI_FORBIDDEN
                If keyType = KeyType.MachineKey Then
                    flags = flags Or (CRYPTPROTECT_LOCAL_MACHINE)
                End If
                Dim success As Boolean = CryptProtectData( _
                                                plainTextBlob, _
                                                description, _
                                                entropyBlob, _
                                                IntPtr.Zero, _
                                                prompt, _
                                                flags, _
                                                cipherTextBlob)

                If Not success Then
                Dim errCode As Integer = Marshal.GetLastWin32Error()
                Throw New Exception("Errore CryptProtectData", _
                                New Win32Exception(errCode))
            End If

                Dim cipherTextBytes(cipherTextBlob.cbData) As Byte
                Marshal.Copy(cipherTextBlob.pbData, cipherTextBytes, 0, _
                                cipherTextBlob.cbData)
                Return cipherTextBytes
            Catch ex As Exception
            Throw New Exception("Impossibile cryptare dati", ex)
            Finally
                If Not (plainTextBlob.pbData.Equals(IntPtr.Zero)) Then
                    Marshal.FreeHGlobal(plainTextBlob.pbData)
                End If

                If Not (cipherTextBlob.pbData.Equals(IntPtr.Zero)) Then
                    Marshal.FreeHGlobal(cipherTextBlob.pbData)
                End If

                If Not (entropyBlob.pbData.Equals(IntPtr.Zero)) Then
                    Marshal.FreeHGlobal(entropyBlob.pbData)
                End If
            End Try
        End Function
    
        Public Shared Function Decrypt _
        ;( _
            ByVal cipherText As String _
        ;) As String
            Dim description As String
            Return Decrypt(cipherText, String.Empty, description)
        End Function

        Public Shared Function Decrypt _
        ;( _
            ByVal cipherText As String, _
            ByRef description As String _
        ;) As String
            Return Decrypt(cipherText, String.Empty, description)
        End Function

        Public Shared Function Decrypt _
        ;( _
            ByVal cipherText As String, _
            ByVal entropy As String, _
            ByRef description As String _
        ;) As String

            If entropy Is Nothing Then
                entropy = String.Empty
            End If

            Return Encoding.UTF8.GetString( _
                ;Decrypt(Convert.FromBase64String(cipherText), _
                        Encoding.UTF8.GetBytes(entropy), description))
        End Function

        Public Shared Function Decrypt _
        ;( _
            ByVal cipherTextBytes As Byte(), _
            ByVal entropyBytes As Byte(), _
            ByRef description As String _
        ;) As Byte()

            Dim plainTextBlob As DATA_BLOB = New DATA_BLOB
            Dim cipherTextBlob As DATA_BLOB = New DATA_BLOB
            Dim entropyBlob As DATA_BLOB = New DATA_BLOB

            Dim prompt As _
                    CRYPTPROTECT_PROMPTSTRUCT = New CRYPTPROTECT_PROMPTSTRUCT
            InitPrompt(prompt)

            description = String.Empty

            Try

                Try
                    InitBLOB(cipherTextBytes, cipherTextBlob)
                Catch ex As Exception
                Throw New Exception("Impossibile inizializzare  cipherTextBlob", ex)
                End Try


                Try
                    InitBLOB(entropyBytes, entropyBlob)
                Catch ex As Exception
                Throw New Exception("Impossibile inizializzare  entropyBlob", ex)
                End Try


                Dim flags As Integer = CRYPTPROTECT_UI_FORBIDDEN

                Dim success As Boolean = CryptUnprotectData( _
                                                cipherTextBlob, _
                                                description, _
                                                entropyBlob, _
                                                IntPtr.Zero, _
                                                prompt, _
                                                flags, _
                                                plainTextBlob)

                If Not success Then

                    Dim errCode As Integer = Marshal.GetLastWin32Error()

                Throw New Exception("Errore CryptUnprotectData", _
                                New Win32Exception(errCode))
                End If

                Dim plainTextBytes(plainTextBlob.cbData) As Byte


                Marshal.Copy(plainTextBlob.pbData, plainTextBytes, 0, _
                                plainTextBlob.cbData)

                Return plainTextBytes
            Catch ex As Exception
            Throw New Exception(";DPAPI non puo decrittare i dati", ex)

            Finally
                If Not (plainTextBlob.pbData.Equals(IntPtr.Zero)) Then
                    Marshal.FreeHGlobal(plainTextBlob.pbData)
                End If

                If Not (cipherTextBlob.pbData.Equals(IntPtr.Zero)) Then
                    Marshal.FreeHGlobal(cipherTextBlob.pbData)
                End If

                If Not (entropyBlob.pbData.Equals(IntPtr.Zero)) Then
                    Marshal.FreeHGlobal(entropyBlob.pbData)
                End If
            End Try
        End Function
    End Class

Ответить

Номер ответа: 6
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #6
Добавлено: 29.09.07 02:58
Здесь нужна не длинная арифметика, а арифметика вычетов. Совсем просто получается, если n^2 влазит в твой тип. Используешь алгоритм быстрого возведения в степень и на каждом шаге считаешь модуль от деления. Т.к. Z_n — группа, результаты умножения будут в итоге равны.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам