Шифровалка для строк

Хороший пример шифрования строк с паролем.
Платформы: Windows , Linux
Автор: voodooattack, создано в 2006 году.

шифрование

    
    'Option Explicit
    
    #INCLUDE "crt.bi"
    
    ' Seed/Hash type: 
    '
    '   valid datatypes: ubyte/ushort/uinteger/ulongint (keep it unsigned)
    '
    
    Type vcrypt_seed As Uinteger
    
    Const vcrypt_seed_max As vcrypt_seed = (2 ^ (Sizeof(vcrypt_seed) * 8)) - 1
    
'------------------------------------------------------------------------------
'//////////////////////////////////////////////////////////////////////////////
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    
    Function HexEncode(Byval Buffer As Ubyte Ptr, Byval length As Integer) As String
        Dim i As Integer
        Dim r As String
        Dim s As String = Space(2)
        For i = 0 To length - 1
            Rset s, Hex(Buffer[i])
            If s[0] = Asc(" ") Then s[0] = Asc("0")
            r += s
        Next
        Return r
    End Function

    Function EvSum(Byval Buffer As Ubyte Ptr, length As Integer) As Integer
        Dim i As Integer
        Dim l As Integer
        l = buffer[0]
        For i = 1 To length - 2
            l = (l Xor Buffer[i]) Xor (Not i) Xor ((Buffer[i+1] Xor Buffer[i-1] Xor Buffer[length-i-1]) Shl (i Mod (Sizeof(l) * 8)))
        Next
        
        l = l Xor length Xor buffer[length - 1]
        
        Return l
    End Function

    Function DeVCrypt(eBuffer As String, Key As String) As String
        
        If Len(Key) = 0 Then Return eBuffer
        
        Dim d           As vcrypt_seed
        Dim r           As String
        Dim t           As String * Sizeof(vcrypt_seed)
        Dim i           As Integer
        Dim c           As Ubyte
        Dim l           As Ubyte
        Dim s           As String
        Dim Buffer      As String


        t = (eBuffer)
        
        memcpy @d, Strptr(t), Sizeof(vcrypt_seed)

        Buffer = String(Len(eBuffer)-sizeof(d), 0)
        memcpy(Strptr(Buffer), Strptr(eBuffer)+sizeof(d), Len(eBuffer) - Sizeof(d))
        
        d = d Xor EvSum(Strptr(Buffer), Len(Buffer)) Xor EvSum(Strptr(Key), Len(Key))
        memcpy Strptr(t), @d , Sizeof(vcrypt_seed)
        
        r = Space(Len(Buffer))
        
        Randomize d
        
        l = Rnd * 255
        
        For i = 0 To Len(Buffer) - 1
            c = Buffer[i] Xor EvSum(Strptr(Key), Len(Key)) Xor Len(Buffer) Xor l
            
            r[i] = c
            
            l = c Or ((c Xor t[l Mod Sizeof(d)] And Not l) Xor Key[i Mod Len(Key)] _
            Xor Not EvSum(Strptr(t),Sizeof(d))) _
            Xor (Rnd * 255) And &HFF 
            
            l = l Xor EvSum(Strptr(Buffer),i)
            l = l And &HFF
        Next
        
        Return r
        
    End Function
    
    
    Function VCrypt_SeedInit(Key As String) As vcrypt_seed
        
        Static d As vcrypt_seed

        Randomize (Timer * 1000)
        
        If d = 0 Then d = Cast(vcrypt_seed, vcrypt_seed_max) 'init the seed
        
        d = d Shl (Rnd * 8)
        d = Rnd Or Not d Or (Timer Shr 24)

        Randomize (Timer)
        d = d Xor EvSum(Strptr(Key), Len(Key)) * Rnd
        d = Iif(Rnd > .5, d Shr Rnd * ((Sizeof(vcrypt_seed) * 8) \ 16) ,d Shl Rnd * ((Sizeof(vcrypt_seed) * 8) \ 16))
        
        Return d
        
    End Function
    
    Function VCrypt(Buffer As String, Key As String) As String
        
        If Len(Key) = 0 Then Return Buffer
        
        Randomize Timer
        
        Dim d           As vcrypt_seed 
        Dim eBuffer     As String
        Dim t           As String * Sizeof(vcrypt_seed)
        Dim i           As Integer
        Dim c           As Ubyte
        Dim l           As Ubyte
        
        d = VCrypt_SeedInit(Key)

        memcpy Strptr(t), @d, Sizeof(vcrypt_seed)
        
        eBuffer = Space(Len(Buffer))
        
        Randomize d
        
        l = Rnd * 255
        
        For i = 0 To Len(Buffer) - 1
            c = Buffer[i] Xor EvSum(Strptr(Key), Len(Key)) Xor Len(Buffer) Xor l            
            eBuffer[i] = c
            
            l = Buffer[i] Or ((Buffer[i] Xor t[l Mod Sizeof(d)] And Not l) _
                Xor Key[i Mod Len(Key)] Xor Not EvSum(Strptr(t),Sizeof(d))) _
                Xor (Rnd * 255) And &HFF
            l = l Xor EvSum(Strptr(eBuffer),i)
            l = l And &HFF
        Next
        
        d = d Xor EvSum(Strptr(eBuffer), Len(eBuffer)) Xor EvSum(Strptr(Key), Len(Key))
        
        eBuffer = String(Sizeof(d),0) & eBuffer
        memcpy Strptr(eBuffer), @d, Sizeof(vcrypt_seed)
        
        Return eBuffer 
        
    End Function

'------------------------------------------------------------------------------
'//////////////////////////////////////////////////////////////////////////////
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

    #DEFINE USE_STATIC_KEY

    Dim Buffer      As String
    Dim Key         As String
    Dim eBuffer     As String
    Dim dBuffer     As String
    Dim hexCrypt    As String
    Dim t           As Double
    Dim t2          As Double
    Dim t3          As Double
    Dim t4          As Double
    
    'screen 18
    
    
    Do While Multikey(1) = 0 And inkey$ <> Chr(255,107)
        
        Locate 1,1,0
        
        
        
        Cls
            
        Buffer = "FreeBASIC pwns j00!"
        
        #IFDEF USE_STATIC_KEY
            Key = "STATIC_KEY"
        #ELSE
            Randomize Timer
            Key = "random key! #" & (Rnd * 9999999999 ^ Rnd)
        #ENDIF
        
        t = Timer
        eBuffer = VCrypt(Buffer, Key)
        t2 = Timer
        
        'try to corrupt anything ;)
        
        'Key = Left(Key, Len(Key) - 1)
        'swap eBuffer[rnd * len(eBuffer)], eBuffer[rnd * len(eBuffer)]
        
        hexCrypt = HexEncode(Strptr(eBuffer), Len(eBuffer))
        
        t3 = Timer
        dBuffer = DeVCrypt(eBuffer, Key)
        t4 = Timer
        
        Print
        Print
        Print "  Original String: " & """" &  Buffer  & """" 
        Print "              Key: " & """" &  Key  & """"
        Print " Encrypted String: " & """" &  hexCrypt & """" 
        Print " Decrypted String: " & """" &  dBuffer  & """" 
        Print
        Print "           Intact: " & *iif((dBuffer = Buffer), @"Yes", @"No") 
        Print " Encrypted Length: " & Len(eBuffer) & Space(5)
        Print "  Original Length: " & Len(Buffer) & Space(5)
        Print "       Difference: " & Len(eBuffer) - Len(Buffer) 
        Print "  Encryption Time: " & Cuint(t2 - t) & " Seconds" 
        Print "  Decryption Time: " & Cuint(t4 - t3) & " Seconds"
        Print
        Print
        Print " Press ESC to exit..";
        
        Sleep 10
        
        If dBuffer <> Buffer Then Sleep
        
    Loop