Для покупки данного компакт-диска нужно ПОЛНОСТЬЮ заполнить нижеприведенную форму, после чего, вам придет уведомление о прочтении
данного документа. Если же в течении 2-4 дней ответа не послупило, попробуйте отправить данные повторно. Если пришел ответ, то через 2-3 недели
на ваш адрес придет почтовое уведомление и вы должны будете выкупить на почте бандероль стоимостью 80-90 рублей.
После выхода рассылки мне начали приходить письма, что данный исходник содержит ошибки. И я решил его немного подкорректировать и
дополнить обработчиками ошибок.
Вначале разберемся с модулем чтения-записи в INI файлы. Красным цветом выделены изменения:
' Код модуля modINI
'Вставляем код проверки о существовании файла
Declare Function PathFileExists Lib "shlwapi.dll" _
Alias "PathFileExistsA" (ByVal pszPath As String) As Long
Dim giveme As Byte
' Чтение и запись строк в файлы инициализации
Declare Function GetPrivateProfileString& Lib _
"kernel32" Alias "GetPrivateProfileStringA" (ByVal _
lpszSection$, ByVal lpszKey$, ByVal lpszDefault$, _
ByVal lpszReturnBuffer$, ByVal cchReturnBuffer&, _
ByVal lpszFile$)
Declare Function WritePrivateProfileString Lib _
"kernel32" Alias "WritePrivateProfileStringA" (ByVal _
lpApplicationName As String, ByVal lpKeyName As String, _
ByVal lpString As String, ByVal lplFileName As String) As Long
' Чтение из файла инициализации
Public Function GetINI(INIfile As String, Section As String, _
Key As String, Default As String)
' Дешифруем
' Если файл существует, то:
giveme = PathFileExists(App.Path & "\" & "options.ini")
If giveme = 1 Then
Call Admin.DeCode
End If
' Читаем данные
Dim temp As String * 256
Dim length As Integer
temp = Space$(256)
length = GetPrivateProfileString(Section, Key, _
Default, temp, 255, INIfile)
GetINI = Left$(temp, length)
' Шифруем
Call Admin.Code
End Function
' Запись в файл инициализации
Public Sub SetINI(INIfile As String, Section As String, _
Key As String, Value As String)
' Дешифруем
' Если файл существует, то:
giveme = PathFileExists(App.Path & "\" & "options.ini")
If giveme = 1 Then
Call Admin.DeCode
End If
' Записываем данные
Dim n As Integer
Dim temp As String
temp = Value
For n = 1 To Len(Value)
If Mid$(Value, n, 1) = vbCr Or Mid$(Value, n, 1) = vbLf _
Then Mid$(Value, n) = ""
Next n
n = WritePrivateProfileString(Section, Key, temp, INIfile)
' Шифруем
Call Admin.Code
End Sub
Теперь вставляем обработчик ошибок в функцию Decrypt():
Sub Decrypt()
On Error GoTo hand
'тут код всей функции
hand: Exit Sub
End Sub
И в сам класс Cipher в функцию Shrink():
'~~~.Shrink
Public Sub Shrink()
On Error GoTo hands
'тут код всей функции
hands: Exit Sub
End Sub
Теперь, вы как поняли, ошибка заключалась в том, что программа пыталась расшифровать
несуществующий файл Options, который должен был быть созданным после первого чтения
настроект. Такое не случалось :) Но вот все исправлено.
Теперь хочу ответить за последовавшую критику моей статьи.
Димон. Я собирался создать довольно функциональный, простой и быстрый криптомодуль,
чтобы пользователь не копался в бесконечном коде, а мог сразу все понять и прооперировать.
Потом, я не утверждаю, что мой метод лучше 1024 битного. Я этого не говорил. Пусть мой поддерживает
только 24 бита, но зато с помощью этого примера многие пользователи разобратся в методах защиты
информации и смогли спасти настройки
своих проектов от 99% "покушений". Еще я собирался сам что-то свое сделать, а не искать находящийся
диск по криптографии под рукой. И стал бы ты каждый раз после записи информации программы
в файл открывать криптопакет и шифровать ее, а позже проделывать обратную операцию?
Нет. Думаю, я на все твои вопросы ответил.
И еще: прежде чем критиковать, подготовь хотя бы один выпуск рассылки САМ и потом уже
утвержай, что ты соавтор рассылки, причем, мы договаривались, что форма подписки будет на твоем сайте, а я ее
почему-то не нашел. Анализируй и обдумывай все это сам. Тем более, что я тебе дал пароль от рассылки, чтобы ты
отправлял РЕАЛЬНУЮ информацию, а не излагал свое мнение в отдельном выпуске. Вот. Удачи!