NAME: XOR using a dynamic-length key
CREATOR: n/a
PB AUTHOR: Stavros A. Petridis, Wayne Diamond, Steve Hutchesson
DESCRIPTION: XORs every byte in a string with the single byte that is defined as the key
NOTES: Easily broken if two or more ciphertexts can be obtained, but stronger than the 8-bit (single-byte) XOR cipher.
SOURCE: http://www.powerbasic.com/support/forums/Forum6/HTML/002540.html
Viewing source from xorkey.bas   4991 bytes   Last modified Wed, 20 September 2006

'Included are three variations of the same cipher, by Stavros A. Petridis and Steve Hutchesson


'########################################################################
'PB XOR cipher
'Author: Stavros A. Petridis
'Source: http://www.powerbasic.com/support/forums/Forum6/HTML/002540.html
'
Sub Cipher(InString As String,PassWord As String)
    Register i            As Dword
    Register Len_PassWord As Dword
    Local    Init_y       As Dword
    Local x               As Byte Ptr
    Local y               As Byte Ptr
    x            = StrPtr(InString)
    Init_y       = StrPtr(PassWord)
    y            = Init_y
    Len_PassWord = Len(PassWord) + Init_y - 1
    For i = 1  To Len(InString)
        @x = @x Xor @y
        Incr x
        If y = Len_PassWord Then
           y = Init_y
        Else
           Incr y
        End If
    Next
End Sub


'########################################################################
'Inline Assembly XOR cipher
'Author: Stavros A. Petridis
'Source: http://www.powerbasic.com/support/forums/Forum6/HTML/002540.html
Sub CipherAsm(InString As String,PassWord As String)
    Local Len_PassWord As Dword
    Local Len_Str      As Dword
    Local Init_y       As Dword
    Local x            As Dword 
    x            = StrPtr(InString)
    Init_y       = StrPtr(PassWord)-1 
    Len_PassWord = Len(PassWord) '+ Init_y
    Len_Str      = Len(InString) 
    !Push ecx
    !Push esi
    !Push edi
    !Push eax
    !Push ebx 
    !Mov  ecx,Len_Str
    !Mov  esi,Init_Y
    !Mov  edi,x
    !Mov  eax,Len_PassWord
    !Add  eax,esi
l1:
    !Inc  esi
    !Mov  bh,[esi]
    !Mov  bl,[edi]
    !Xor  bl,bh
    !Mov  [edi],bl
    !Inc  edi
    !Cmp  esi,eax
    !Jne  n1
    !Mov  esi,Init_Y
n1:
'    !Loop l1 This line was rem out and replaced with the 2 lines below after Berns suggestion.
    !Dec ecx 
    !Jnz l1 
    !Pop ebx
    !Pop eax
    !Pop edi
    !Pop esi
    !Pop ecx 
End Sub


'########################################################################
'Author: Wayne Diamond
'
SUB XorKey(sTest AS STRING, sKey AS STRING)
#REGISTER NONE
DIM len1 AS LONG, len2 AS LONG, ptr1 AS LONG, ptr2 AS LONG
len1 = LEN(sTest)
len2 = LEN(sKey)
ptr1 = STRPTR(sTest)
ptr2 = STRPTR(sKey)
! push ebp
! xor ecx, ecx
! mov esi, ptr1  ;esi = text to xor
! mov edi, ptr2  ;edi = key
! mov edx, len2  ;edx = len key
! mov ebp, len1  ;ebp = last byte
! add ebp, esi
xornextbyte:
! mov al, [esi]
! mov bl, [edi]
! xor al, bl
! mov [esi], al
! inc ecx
! inc esi
! inc edi
! cmp esi, ebp
! jge xorcomplete
! cmp ecx, edx
! jge xornextround
! jmp xornextbyte
xornextround:
! xor ecx, ecx
! sub edi, edx
! jmp xornextbyte
xorcomplete:
! pop ebp
END SUB


'########################################################################
'Inline Assembly XOR cipher
'Author: Steve Hutchesson
'Source: http://www.powerbasic.com/support/forums/Forum4/HTML/005357.html
'
FUNCTION XorString(bString$,KeyString$) AS LONG
ON ERROR RESUME NEXT
#REGISTER NONE
      LOCAL ln   AS LONG      ' source length
      LOCAL lkey AS LONG      ' key length
      LOCAL lref AS LONG      ' counter reference for key char position
      LOCAL src  AS LONG, lpBt AS LONG, pcnt AS LONG
      LOCAL bvar AS BYTE
      ! push ebx
      ! push esi
      ! push edi
      ln   = LEN(bString$)
      lkey = LEN(KeyString$)
      IF ln = 0 OR lkey = 0 THEN EXIT FUNCTION
      lpBt = STRPTR(KeyString$)   ' get starting address of key string
      pcnt = lpBt                 ' copy it to another variable
      lref = pcnt + lkey
      ! mov esi, lpBt
      ! mov al,[esi]
      ! mov bvar, al      ; put 1st byte in bvar
      src = STRPTR(bString$)
      ! mov ecx, ln
      ! mov esi, src
      ! mov edi, src
    xsSt:
      ! mov al,[esi]      ; copy 1st byte of source into al
      ! inc esi
      ! xor al, bvar      ; xor al with the byte in bvar
      ! push eax
      ! push esi
    ' ====== This code gets the next byte in the key string ======
    '        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      ! inc pcnt          ; increment byte address
      ! mov esi, pcnt     ; put it in esi
      ! mov al,[esi]
      ! inc esi
      ! mov ebx, lref
      ! cmp pcnt, ebx     ; if pcnt = lref
      ! jne xsNxt
      ! mov edx, lpBt
      ! mov pcnt, edx     ; reset pcnt to ariginal address
      ! mov esi, pcnt     ; put original address in esi
      ! mov al,[esi]
      ! inc esi
    xsNxt:
      ! mov bvar, al      ; put the next byte in the variable
    ' ============================================================
      ! pop esi
      ! pop eax
      ! mov [edi], al
      ! inc edi
      ! dec ecx
      ! cmp ecx, 0
      ! jne xsSt
      ! pop edi
      ! pop esi
      ! pop ebx
      FUNCTION = 1
END FUNCTION
 
'########################################################################

Back to The Archives