Text =
(
Не жалею, не зову, не плачу,
Все пройдет, как с белых яблонь дым.
Увяданья золотом охваченный,
Я не буду больше молодым.
Ты теперь не так уж будешь биться,
Сердце, тронутое холодком,
И страна березового ситца
Не заманит шляться босиком.
)
Key1 = AutoHotkey forever!
Key2 = Хрен поймёшь, что тут написано.
Key3 = 1234567890
Shifr := Cipher(Text, Key1, Key2, Key3) ; Шифруем.
Shifr := StrToBASE64(Shifr)
MsgBox, % Shifr
Shifr := BASE64ToStr(Shifr)
Text := Cipher(Shifr, Key3, Key2, Key1) ; Дешифруем, ключи в обратном порядке.
MsgBox, % Text
Cipher(Src, Key1, Key2 = 0, Key3 = 0) ; Два последних ключа необязательны.
{
Loop, 3
{
If not Key%A_Index%
Break
StringSplit, Keys, Key%A_Index% ; Разбиваем фразу на отдельные ключи.
Dest =
Loop, Parse, Src ; Перебор символов текста.
{
Index := Mod(A_Index, Keys0) + 1 ; Чтобы Index не вышел за пределы
; числа символов в ключевой фразе.
Key := Asc(Keys%Index%) ; Очередной ключ.
Code := Asc(A_LoopField) ; Код очередного символа текста.
Dest .= Chr(Code = Key ? Code : Code ^ Key) ; Шифруем и добавляем.
}
Src := Dest
}
Return Dest
}
StrToBASE64(Str, NOCRLF=1) {
Crypt := 1 | (NOCRLF ? 0x40000000 : 0)
Bytes := StrLen(Str) * (A_IsUnicode ? 2 : 1)
DllCall("Crypt32.dll\CryptBinaryToString", Ptr, &Str, UInt, Bytes, UInt, Crypt, Ptr, 0, UIntP, Chars)
VarSetCapacity(OutData, Chars * (A_IsUnicode ? 2 : 1))
DllCall("Crypt32.dll\CryptBinaryToString", Ptr, &Str, UInt, Bytes, UInt, Crypt, Str, OutData, UIntP, Chars)
Return OutData
}
BASE64ToStr(StringBase64) {
DllCall("Crypt32.dll\CryptStringToBinary", Ptr, &StringBase64
, UInt, StrLen(StringBase64), UInt, 1, UInt, 0, UIntP, Bytes, UIntP, 0, UIntP, 0)
VarSetCapacity(OutData, Bytes)
DllCall("Crypt32.dll\CryptStringToBinary", Ptr, &StringBase64
, UInt, StrLen(StringBase64), UInt, 1, Str, OutData, UIntP, Bytes, UIntP, 0, UIntP, 0)
Return OutData
}