Страница: 1 |
Страница: 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-сайт:
Профиль | | #1
Добавлено: 28.09.07 22:30
не знаю...
может вот так попробовать
небольшие числа правильно считает
Номер ответа: 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-сайт:
Профиль | | #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
<llImport("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
<llImport("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( _
 ecrypt(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("PAPI 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-сайт:
Профиль | | #6
Добавлено: 29.09.07 02:58
Здесь нужна не длинная арифметика, а арифметика вычетов. Совсем просто получается, если n^2 влазит в твой тип. Используешь алгоритм быстрого возведения в степень и на каждом шаге считаешь модуль от деления. Т.к. Z_n — группа, результаты умножения будут в итоге равны.