📄 megamail.bas
字号:
SelectCipher (NumberOfBlocks%)
Put #2, , CryptBuffer
Next
'* clear plaintext
For i% = 0 To BUFFERSIZE - 1: CryptBuffer(i%) = 0: Next
If ShortBufferLen% > 0 Then
ReDim CryptBuffer(ShortBufferLen% - 1)
Get #1, , CryptBuffer
'* process the last buffer (adjust shortblock)
BufferPointer& = 0
SetShort% = 0
If ShortBlockLen% > 0 Then SetShort% = 1
NumberOfBlocks% = (ShortBufferLen% \ BlockLen%) - SetShort%
SelectCipher (NumberOfBlocks%)
If ShortBlockLen% > 0 Then
'* save the FBR and do the two blocks in reverse
For i% = 1 To BlockLen%: SaveFBR(i%) = Pre_FBR(i%): Next
For i% = 1 To BlockLen%: Pre_FBR(i%) = 0: Next
BufferPointer& = ShortBufferLen% - BlockLen%
SelectCipher (1)
For i% = 1 To BlockLen%: Pre_FBR(i%) = SaveFBR(i%): Next
Foffset% = BlockLen% + ShortBlockLen%
BufferPointer& = ShortBufferLen% - Foffset%
SelectCipher (1)
End If
'* write the shortbuffer
Put #2, , CryptBuffer
'* clear plaintext
For i% = 0 To ShortBufferLen% - 1: CryptBuffer(i%) = 0: Next
End If
End If 'CompFlag
MainForm.Enabled = -1
End Sub
Sub CryptInit()
Select Case process%
Case 1
BlockLen% = LeapFrogBlockLen
LeapFrogExpand
Case 2
BlockLen% = LeapFrogBlockLen
LeapFrogExpand
End Select
End Sub
Sub SelectCipher(LastBlock%)
Select Case process%
Case 1
LeapFrogEncipher (LastBlock%)
Case 2
LeapFrogDecipher (LastBlock%)
'* more ciphers may be added here
End Select
End Sub
Private Sub LeapFrogEncipher(LastBlock%)
Dim T1 As Integer, T2 As Integer, T3 As Integer, T4 As Integer
For BlockNumber% = 0 To LastBlock% - 1
p1% = CryptBuffer(BufferPointer&)
p2% = CryptBuffer(BufferPointer& + 1)
p3% = CryptBuffer(BufferPointer& + 2)
p4% = CryptBuffer(BufferPointer& + 3)
p5% = CryptBuffer(BufferPointer& + 4)
p6% = CryptBuffer(BufferPointer& + 5)
p7% = CryptBuffer(BufferPointer& + 6)
p8% = CryptBuffer(BufferPointer& + 7)
If CipherMode% = CBC Then
p1% = p1% Xor FBR(1)
p2% = p2% Xor FBR(2)
p3% = p3% Xor FBR(3)
p4% = p4% Xor FBR(4)
p5% = p5% Xor FBR(5)
p6% = p6% Xor FBR(6)
p7% = p7% Xor FBR(7)
p8% = p8% Xor FBR(8)
End If
For x% = 0 To (LeapFrogRounds% \ 2) - 1
'* create the T variables
T1 = A1%(p1% Xor SK(x%, 0))
T2 = A2%(p2% Xor SK(x%, 1))
T3 = A3%(p3% Xor SK(x%, 2))
T4 = A4%(p4% Xor SK(x%, 3))
'* T variable order "A"
p5% = p5% Xor A1%(A1%(T2 Xor T3) Xor T4)
p6% = p6% Xor A2%(A2%(T1 Xor T4) Xor T3)
p7% = p7% Xor A3%(A3%(T4 Xor T2) Xor T1)
p8% = p8% Xor A4%(A4%(T3 Xor T1) Xor T2)
p5% = (p5% + T1) And &HFF
p6% = (p6% + T2) And &HFF
p7% = (p7% + T3) And &HFF
p8% = (p8% + T4) And &HFF
'* do other half without swapping
T1 = A5%(p5% Xor SK(x%, 4))
T2 = A6%(p6% Xor SK(x%, 5))
T3 = A7%(p7% Xor SK(x%, 6))
T4 = A8%(p8% Xor SK(x%, 7))
p1% = p1% Xor A5%(A5%(T2 Xor T3) Xor T4)
p2% = p2% Xor A6%(A6%(T1 Xor T4) Xor T3)
p3% = p3% Xor A7%(A7%(T4 Xor T2) Xor T1)
p4% = p4% Xor A8%(A8%(T3 Xor T1) Xor T2)
p1% = (p1% + T1) And &HFF
p2% = (p2% + T2) And &HFF
p3% = (p3% + T3) And &HFF
p4% = (p4% + T4) And &HFF
Next
For x% = (LeapFrogRounds% \ 2) To (LeapFrogRounds% - 1)
'* create the T variables
T1 = A1%(p1% Xor SK(x%, 0))
T2 = A2%(p2% Xor SK(x%, 1))
T3 = A3%(p3% Xor SK(x%, 2))
T4 = A4%(p4% Xor SK(x%, 3))
'* T variable order "B"
p5% = p5% Xor A1%(A1%(T2 Xor T3) Xor T4)
p6% = p6% Xor A2%(A2%(T3 Xor T4) Xor T1)
p7% = p7% Xor A3%(A3%(T4 Xor T1) Xor T2)
p8% = p8% Xor A4%(A4%(T1 Xor T2) Xor T3)
p5% = (p5% + T1) And &HFF
p6% = (p6% + T2) And &HFF
p7% = (p7% + T3) And &HFF
p8% = (p8% + T4) And &HFF
'* do other half without swapping
T1 = A5%(p5% Xor SK(x%, 4))
T2 = A6%(p6% Xor SK(x%, 5))
T3 = A7%(p7% Xor SK(x%, 6))
T4 = A8%(p8% Xor SK(x%, 7))
p1% = p1% Xor A5%(A5%(T2 Xor T3) Xor T4)
p2% = p2% Xor A6%(A6%(T3 Xor T4) Xor T1)
p3% = p3% Xor A7%(A7%(T4 Xor T1) Xor T2)
p4% = p4% Xor A8%(A8%(T1 Xor T2) Xor T3)
p1% = (p1% + T1) And &HFF
p2% = (p2% + T2) And &HFF
p3% = (p3% + T3) And &HFF
p4% = (p4% + T4) And &HFF
Next
'* whiten data
p1% = p1% Xor SK(LeapFrogRounds%, 0)
p2% = p2% Xor SK(LeapFrogRounds%, 1)
p3% = p3% Xor SK(LeapFrogRounds%, 2)
p4% = p4% Xor SK(LeapFrogRounds%, 3)
p5% = p5% Xor SK(LeapFrogRounds%, 4)
p6% = p6% Xor SK(LeapFrogRounds%, 5)
p7% = p7% Xor SK(LeapFrogRounds%, 6)
p8% = p8% Xor SK(LeapFrogRounds%, 7)
'* write cipher text
CryptBuffer(BufferPointer&) = p1%
CryptBuffer(BufferPointer& + 1) = p2%
CryptBuffer(BufferPointer& + 2) = p3%
CryptBuffer(BufferPointer& + 3) = p4%
CryptBuffer(BufferPointer& + 4) = p5%
CryptBuffer(BufferPointer& + 5) = p6%
CryptBuffer(BufferPointer& + 6) = p7%
CryptBuffer(BufferPointer& + 7) = p8%
FBR(1) = p1%
FBR(2) = p2%
FBR(3) = p3%
FBR(4) = p4%
FBR(5) = p5%
FBR(6) = p6%
FBR(7) = p7%
FBR(8) = p8%
BufferPointer& = BufferPointer& + 8
ByteNumber& = ByteNumber& + 8
Next
End Sub
Private Sub LeapFrogDecipher(LastBlock%)
Dim T1 As Integer, T2 As Integer, T3 As Integer, T4 As Integer
For BlockNumber% = 0 To LastBlock% - 1
p1% = CryptBuffer(BufferPointer&)
p2% = CryptBuffer(BufferPointer& + 1)
p3% = CryptBuffer(BufferPointer& + 2)
p4% = CryptBuffer(BufferPointer& + 3)
p5% = CryptBuffer(BufferPointer& + 4)
p6% = CryptBuffer(BufferPointer& + 5)
p7% = CryptBuffer(BufferPointer& + 6)
p8% = CryptBuffer(BufferPointer& + 7)
FBR(1) = p1%
FBR(2) = p2%
FBR(3) = p3%
FBR(4) = p4%
FBR(5) = p5%
FBR(6) = p6%
FBR(7) = p7%
FBR(8) = p8%
'* unwhiten data
p1% = p1% Xor SK(LeapFrogRounds%, 0)
p2% = p2% Xor SK(LeapFrogRounds%, 1)
p3% = p3% Xor SK(LeapFrogRounds%, 2)
p4% = p4% Xor SK(LeapFrogRounds%, 3)
p5% = p5% Xor SK(LeapFrogRounds%, 4)
p6% = p6% Xor SK(LeapFrogRounds%, 5)
p7% = p7% Xor SK(LeapFrogRounds%, 6)
p8% = p8% Xor SK(LeapFrogRounds%, 7)
For y% = 0 To (LeapFrogRounds% \ 2) - 1
'* invert subkeys
x% = (LeapFrogRounds% - 1) - y%
'* create the T variables
T1 = A5%(p5% Xor SK(x%, 4))
T2 = A6%(p6% Xor SK(x%, 5))
T3 = A7%(p7% Xor SK(x%, 6))
T4 = A8%(p8% Xor SK(x%, 7))
'* T variable order "B"
p1% = (p1% - T1) And &HFF
p2% = (p2% - T2) And &HFF
p3% = (p3% - T3) And &HFF
p4% = (p4% - T4) And &HFF
p1% = p1% Xor A5%(A5%(T2 Xor T3) Xor T4)
p2% = p2% Xor A6%(A6%(T3 Xor T4) Xor T1)
p3% = p3% Xor A7%(A7%(T4 Xor T1) Xor T2)
p4% = p4% Xor A8%(A8%(T1 Xor T2) Xor T3)
'* do other half without swapping
T1 = A1%(p1% Xor SK(x%, 0))
T2 = A2%(p2% Xor SK(x%, 1))
T3 = A3%(p3% Xor SK(x%, 2))
T4 = A4%(p4% Xor SK(x%, 3))
p5% = (p5% - T1) And &HFF
p6% = (p6% - T2) And &HFF
p7% = (p7% - T3) And &HFF
p8% = (p8% - T4) And &HFF
p5% = p5% Xor A1%(A1%(T2 Xor T3) Xor T4)
p6% = p6% Xor A2%(A2%(T3 Xor T4) Xor T1)
p7% = p7% Xor A3%(A3%(T4 Xor T1) Xor T2)
p8% = p8% Xor A4%(A4%(T1 Xor T2) Xor T3)
Next
For y% = (LeapFrogRounds% \ 2) To (LeapFrogRounds% - 1)
'* invert subkeys
x% = (LeapFrogRounds% - 1) - y%
'* create the T variables
T1 = A5%(p5% Xor SK(x%, 4))
T2 = A6%(p6% Xor SK(x%, 5))
T3 = A7%(p7% Xor SK(x%, 6))
T4 = A8%(p8% Xor SK(x%, 7))
'* T variable order "A"
p1% = (p1% - T1) And &HFF
p2% = (p2% - T2) And &HFF
p3% = (p3% - T3) And &HFF
p4% = (p4% - T4) And &HFF
p1% = p1% Xor A5%(A5%(T2 Xor T3) Xor T4)
p2% = p2% Xor A6%(A6%(T1 Xor T4) Xor T3)
p3% = p3% Xor A7%(A7%(T4 Xor T2) Xor T1)
p4% = p4% Xor A8%(A8%(T3 Xor T1) Xor T2)
'* do other half without swapping
T1 = A1%(p1% Xor SK(x%, 0))
T2 = A2%(p2% Xor SK(x%, 1))
T3 = A3%(p3% Xor SK(x%, 2))
T4 = A4%(p4% Xor SK(x%, 3))
p5% = (p5% - T1) And &HFF
p6% = (p6% - T2) And &HFF
p7% = (p7% - T3) And &HFF
p8% = (p8% - T4) And &HFF
p5% = p5% Xor A1%(A1%(T2 Xor T3) Xor T4)
p6% = p6% Xor A2%(A2%(T1 Xor T4) Xor T3)
p7% = p7% Xor A3%(A3%(T4 Xor T2) Xor T1)
p8% = p8% Xor A4%(A4%(T3 Xor T1) Xor T2)
Next
If CipherMode% = CBC Then
p1% = p1% Xor Pre_FBR(1)
p2% = p2% Xor Pre_FBR(2)
p3% = p3% Xor Pre_FBR(3)
p4% = p4% Xor Pre_FBR(4)
p5% = p5% Xor Pre_FBR(5)
p6% = p6% Xor Pre_FBR(6)
p7% = p7% Xor Pre_FBR(7)
p8% = p8% Xor Pre_FBR(8)
End If
Pre_FBR(1) = FBR(1)
Pre_FBR(2) = FBR(2)
Pre_FBR(3) = FBR(3)
Pre_FBR(4) = FBR(4)
Pre_FBR(5) = FBR(5)
Pre_FBR(6) = FBR(6)
Pre_FBR(7) = FBR(7)
Pre_FBR(8) = FBR(8)
'* write plain text
CryptBuffer(BufferPointer&) = p1%
CryptBuffer(BufferPointer& + 1) = p2%
CryptBuffer(BufferPointer& + 2) = p3%
CryptBuffer(BufferPointer& + 3) = p4%
CryptBuffer(BufferPointer& + 4) = p5%
CryptBuffer(BufferPointer& + 5) = p6%
CryptBuffer(BufferPointer& + 6) = p7%
CryptBuffer(BufferPointer& + 7) = p8%
BufferPointer& = BufferPointer& + 8
ByteNumber& = ByteNumber& + 8
Next
End Sub
Private Sub LeapFrogExpand()
PackPassword
For i% = 0 To 23
If k%(23 - i%) <> 0 Then Exit For
Next
RealKeyLen% = 24 - i%
UserKeyLen% = RealKeyLen%
If WithSalt% Then RealKeyLen% = RealKeyLen% + BlockLen%
'* replicate key into array
y% = 0
For x% = 0 To 255
'* if Salt is TRUE then append CBC-MAC to real key
If WithSalt% Then
If y% > (UserKeyLen% - 1) Then
LongKey%(x%) = Salt(SaltIndex%)
SaltIndex% = (SaltIndex% + 1) Mod BlockLen%
Else
LongKey%(x%) = k%(y%)
End If
Else
LongKey%(x%) = k%(y%)
End If
y% = (y% + 1) Mod RealKeyLen%
Next
'* initialize expanded key arrays
For i% = 0 To 255
A1%(i%) = i%: A5%(i%) = i%
A2%(i%) = i%: A6%(i%) = i%
A3%(i%) = i%: A7%(i%) = i%
A4%(i%) = i%: A8%(i%) = i%
Next
j% = 0
'* randomize array
For i% = 0 To 255
j% = (j% + A1%(i%) + LongKey%(i%)) And &HFF
SWAP A1%(i%), A1%(j%)
Next
For i% = 0 To 255
j% = (j% + A1%(i%)) And &HFF: SWAP A1%(i%), A1%(j%)
Next
'* randomize the other arrays
For i% = 0 To 255
j% = (j% + A1%(A2%(i%)) + A1%(LongKey%(i%))) And &HFF
SWAP A2%(i%), A2%(j%)
Next
For i% = 0 To 255
j% = (j% + A2%(A3%(i%)) + A2%(LongKey%(i%))) And &HFF
SWAP A3%(i%), A3%(j%)
Next
For i% = 0 To 255
j% = (j% + A3%(A4%(i%)) + A3%(LongKey%(i%))) And &HFF
SWAP A4%(i%), A4%(j%)
Next
For i% = 0 To 255
j% = (j% + A4%(A5%(i%)) + A4%(LongKey%(i%))) And &HFF
SWAP A5%(i%), A5%(j%)
Next
For i% = 0 To 255
j% = (j% + A5%(A6%(i%)) + A5%(LongKey%(i%))) And &HFF
SWAP A6%(i%), A6%(j%)
Next
For i% = 0 To 255
j% = (j% + A6%(A7%(i%)) + A6%(LongKey%(i%))) And &HFF
SWAP A7%(i%), A7%(j%)
Next
For i% = 0 To 255
j% = (j% + A7%(A8%(i%)) + A7%(LongKey%(i%))) And &HFF
SWAP A8%(i%), A8%(j%)
Next
'* make subkeys from S-boxes
Erase SK
For i% = 0 To 63
SK(0, 0) = (SK(0, 0) + A1%(i%)) And &HFF
SK(0, 1) = (SK(0, 1) + A2%(i%)) And &HFF
SK(0, 2) = (SK(0, 2) + A3%(i%)) And &HFF
SK(0, 3) = (SK(0, 3) + A4%(i%)) And &HFF
SK(0, 4) = (SK(0, 4) + A5%(i%)) And &HFF
SK(0, 5) = (SK(0, 5) + A6%(i%)) And &HFF
SK(0, 6) = (SK(0, 6) + A7%(i%)) And &HFF
SK(0, 7) = (SK(0, 7) + A8%(i%)) And &HFF
Next
For i% = 0 To LeapFrogRounds% - 1
SK(i% + 1, 0) = (SK(i%, 0) + A1%(64 + i%)) And &HFF
SK(i% + 1, 1) = (SK(i%, 1) + A2%(64 + i%)) And &HFF
SK(i% + 1, 2) = (SK(i%, 2) + A3%(64 + i%)) And &HFF
SK(i% + 1, 3) = (SK(i%, 3) + A4%(64 + i%)) And &HFF
SK(i% + 1, 4) = (SK(i%, 4) + A5%(64 + i%)) And &HFF
SK(i% + 1, 5) = (SK(i%, 5) + A6%(64 + i%)) And &HFF
SK(i% + 1, 6) = (SK(i%, 6) + A7%(64 + i%)) And &HFF
SK(i% + 1, 7) = (SK(i%, 7) + A8%(64 + i%)) And &HFF
Next
For i% = 0 To LeapFrogRounds%
SK(i%, 0) = A5(SK(i%, 0))
SK(i%, 1) = A6(SK(i%, 1))
SK(i%, 2) = A7(SK(i%, 2))
SK(i%, 3) = A8(SK(i%, 3))
Next
For i% = 0 To LeapFrogRounds%
SK(i%, 4) = A1(SK(i%, 4))
SK(i%, 5) = A2(SK(i%, 5))
SK(i%, 6) = A3(SK(i%, 6))
SK(i%, 7) = A4(SK(i%, 7))
Next
'* erase initial key arrays
Erase initkey%, k%, LongKey%
'* default to NoSalt
WithSalt% = 0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -