📄 rijndaelmanagedtransform.cls
字号:
.T3 = mT0(.s(12)) Xor mT1(.s(17)) Xor mT2(.s(22)) Xor mT3(.s(3)) Xor mExpKey(j + 3)
.T4 = mT0(.s(16)) Xor mT1(.s(21)) Xor mT2(.s(2)) Xor mT3(.s(7)) Xor mExpKey(j + 4)
.T5 = mT0(.s(20)) Xor mT1(.s(1)) Xor mT2(.s(6)) Xor mT3(.s(11)) Xor mExpKey(j + 5)
j = j + 6
Call CopyMemory(ByVal mSPtr, ByVal mTmpPtr, 24)
Next i
MemLong(bPtr) = (mT4(.s(0)) And &HFF&) Xor (mT4(.s(5)) And &HFF00&) Xor (mT4(.s(10)) And &HFF0000) Xor (mT4(.s(15)) And &HFF000000) Xor mExpKey(j)
MemLong(bPtr + 4) = (mT4(.s(4)) And &HFF&) Xor (mT4(.s(9)) And &HFF00&) Xor (mT4(.s(14)) And &HFF0000) Xor (mT4(.s(19)) And &HFF000000) Xor mExpKey(j + 1)
MemLong(bPtr + 8) = (mT4(.s(8)) And &HFF&) Xor (mT4(.s(13)) And &HFF00&) Xor (mT4(.s(18)) And &HFF0000) Xor (mT4(.s(23)) And &HFF000000) Xor mExpKey(j + 2)
MemLong(bPtr + 12) = (mT4(.s(12)) And &HFF&) Xor (mT4(.s(17)) And &HFF00&) Xor (mT4(.s(22)) And &HFF0000) Xor (mT4(.s(3)) And &HFF000000) Xor mExpKey(j + 3)
MemLong(bPtr + 16) = (mT4(.s(16)) And &HFF&) Xor (mT4(.s(21)) And &HFF00&) Xor (mT4(.s(2)) And &HFF0000) Xor (mT4(.s(7)) And &HFF000000) Xor mExpKey(j + 4)
MemLong(bPtr + 20) = (mT4(.s(20)) And &HFF&) Xor (mT4(.s(1)) And &HFF00&) Xor (mT4(.s(6)) And &HFF0000) Xor (mT4(.s(11)) And &HFF000000) Xor mExpKey(j + 5)
End With
End Sub
Private Sub Encrypt256(ByRef Bytes() As Byte, ByVal Index As Long)
Dim bPtr As Long
bPtr = VarPtr(Bytes(Index))
MemLong(mSPtr) = MemLong(bPtr) Xor mExpKey(0)
MemLong(mSPtr + 4) = MemLong(bPtr + 4) Xor mExpKey(1)
MemLong(mSPtr + 8) = MemLong(bPtr + 8) Xor mExpKey(2)
MemLong(mSPtr + 12) = MemLong(bPtr + 12) Xor mExpKey(3)
MemLong(mSPtr + 16) = MemLong(bPtr + 16) Xor mExpKey(4)
MemLong(mSPtr + 20) = MemLong(bPtr + 20) Xor mExpKey(5)
MemLong(mSPtr + 24) = MemLong(bPtr + 24) Xor mExpKey(6)
MemLong(mSPtr + 28) = MemLong(bPtr + 28) Xor mExpKey(7)
With mTmp
Dim j As Long
j = 8
Dim i As Long
For i = 1 To mNr - 1
.T0 = mT0(.s(0)) Xor mT1(.s(5)) Xor mT2(.s(14)) Xor mT3(.s(19)) Xor mExpKey(j)
.T1 = mT0(.s(4)) Xor mT1(.s(9)) Xor mT2(.s(18)) Xor mT3(.s(23)) Xor mExpKey(j + 1)
.T2 = mT0(.s(8)) Xor mT1(.s(13)) Xor mT2(.s(22)) Xor mT3(.s(27)) Xor mExpKey(j + 2)
.T3 = mT0(.s(12)) Xor mT1(.s(17)) Xor mT2(.s(26)) Xor mT3(.s(31)) Xor mExpKey(j + 3)
.T4 = mT0(.s(16)) Xor mT1(.s(21)) Xor mT2(.s(30)) Xor mT3(.s(3)) Xor mExpKey(j + 4)
.T5 = mT0(.s(20)) Xor mT1(.s(25)) Xor mT2(.s(2)) Xor mT3(.s(7)) Xor mExpKey(j + 5)
.T6 = mT0(.s(24)) Xor mT1(.s(29)) Xor mT2(.s(6)) Xor mT3(.s(11)) Xor mExpKey(j + 6)
.T7 = mT0(.s(28)) Xor mT1(.s(1)) Xor mT2(.s(10)) Xor mT3(.s(15)) Xor mExpKey(j + 7)
j = j + 8
Call CopyMemory(ByVal mSPtr, ByVal mTmpPtr, 32)
Next i
MemLong(bPtr) = (mT4(.s(0)) And &HFF&) Xor (mT4(.s(5)) And &HFF00&) Xor (mT4(.s(14)) And &HFF0000) Xor (mT4(.s(19)) And &HFF000000) Xor mExpKey(j)
MemLong(bPtr + 4) = (mT4(.s(4)) And &HFF&) Xor (mT4(.s(9)) And &HFF00&) Xor (mT4(.s(18)) And &HFF0000) Xor (mT4(.s(23)) And &HFF000000) Xor mExpKey(j + 1)
MemLong(bPtr + 8) = (mT4(.s(8)) And &HFF&) Xor (mT4(.s(13)) And &HFF00&) Xor (mT4(.s(22)) And &HFF0000) Xor (mT4(.s(27)) And &HFF000000) Xor mExpKey(j + 2)
MemLong(bPtr + 12) = (mT4(.s(12)) And &HFF&) Xor (mT4(.s(17)) And &HFF00&) Xor (mT4(.s(26)) And &HFF0000) Xor (mT4(.s(31)) And &HFF000000) Xor mExpKey(j + 3)
MemLong(bPtr + 16) = (mT4(.s(16)) And &HFF&) Xor (mT4(.s(21)) And &HFF00&) Xor (mT4(.s(30)) And &HFF0000) Xor (mT4(.s(3)) And &HFF000000) Xor mExpKey(j + 4)
MemLong(bPtr + 20) = (mT4(.s(20)) And &HFF&) Xor (mT4(.s(25)) And &HFF00&) Xor (mT4(.s(2)) And &HFF0000) Xor (mT4(.s(7)) And &HFF000000) Xor mExpKey(j + 5)
MemLong(bPtr + 24) = (mT4(.s(24)) And &HFF&) Xor (mT4(.s(29)) And &HFF00&) Xor (mT4(.s(6)) And &HFF0000) Xor (mT4(.s(11)) And &HFF000000) Xor mExpKey(j + 6)
MemLong(bPtr + 28) = (mT4(.s(28)) And &HFF&) Xor (mT4(.s(1)) And &HFF00&) Xor (mT4(.s(10)) And &HFF0000) Xor (mT4(.s(15)) And &HFF000000) Xor mExpKey(j + 7)
End With
End Sub
Private Sub Decrypt128(ByRef Bytes() As Byte, ByVal Index As Long)
Dim bPtr As Long
bPtr = VarPtr(Bytes(Index))
MemLong(mSPtr) = MemLong(bPtr) Xor mExpKey(0)
MemLong(mSPtr + 4) = MemLong(bPtr + 4) Xor mExpKey(1)
MemLong(mSPtr + 8) = MemLong(bPtr + 8) Xor mExpKey(2)
MemLong(mSPtr + 12) = MemLong(bPtr + 12) Xor mExpKey(3)
With mTmp
Dim j As Long
j = 4
Dim i As Long
For i = 1 To mNr - 1
.T0 = mT0(.s(0)) Xor mT1(.s(13)) Xor mT2(.s(10)) Xor mT3(.s(7)) Xor mExpKey(j)
.T1 = mT0(.s(4)) Xor mT1(.s(1)) Xor mT2(.s(14)) Xor mT3(.s(11)) Xor mExpKey(j + 1)
.T2 = mT0(.s(8)) Xor mT1(.s(5)) Xor mT2(.s(2)) Xor mT3(.s(15)) Xor mExpKey(j + 2)
.T3 = mT0(.s(12)) Xor mT1(.s(9)) Xor mT2(.s(6)) Xor mT3(.s(3)) Xor mExpKey(j + 3)
j = j + 4
Call CopyMemory(ByVal mSPtr, ByVal mTmpPtr, 16)
Next i
MemLong(bPtr) = (mT4(.s(0)) And &HFF&) Xor (mT4(.s(13)) And &HFF00&) Xor (mT4(.s(10)) And &HFF0000) Xor (mT4(.s(7)) And &HFF000000) Xor mExpKey(j)
MemLong(bPtr + 4) = (mT4(.s(4)) And &HFF&) Xor (mT4(.s(1)) And &HFF00&) Xor (mT4(.s(14)) And &HFF0000) Xor (mT4(.s(11)) And &HFF000000) Xor mExpKey(j + 1)
MemLong(bPtr + 8) = (mT4(.s(8)) And &HFF&) Xor (mT4(.s(5)) And &HFF00&) Xor (mT4(.s(2)) And &HFF0000) Xor (mT4(.s(15)) And &HFF000000) Xor mExpKey(j + 2)
MemLong(bPtr + 12) = (mT4(.s(12)) And &HFF&) Xor (mT4(.s(9)) And &HFF00&) Xor (mT4(.s(6)) And &HFF0000) Xor (mT4(.s(3)) And &HFF000000) Xor mExpKey(j + 3)
End With
End Sub
Private Sub Decrypt192(ByRef Bytes() As Byte, ByVal Index As Long)
Dim bPtr As Long
bPtr = VarPtr(Bytes(Index))
MemLong(mSPtr) = MemLong(bPtr) Xor mExpKey(0)
MemLong(mSPtr + 4) = MemLong(bPtr + 4) Xor mExpKey(1)
MemLong(mSPtr + 8) = MemLong(bPtr + 8) Xor mExpKey(2)
MemLong(mSPtr + 12) = MemLong(bPtr + 12) Xor mExpKey(3)
MemLong(mSPtr + 16) = MemLong(bPtr + 16) Xor mExpKey(4)
MemLong(mSPtr + 20) = MemLong(bPtr + 20) Xor mExpKey(5)
With mTmp
Dim j As Long
j = 6
Dim i As Long
For i = 1 To mNr - 1
.T0 = mT0(.s(0)) Xor mT1(.s(21)) Xor mT2(.s(18)) Xor mT3(.s(15)) Xor mExpKey(j)
.T1 = mT0(.s(4)) Xor mT1(.s(1)) Xor mT2(.s(22)) Xor mT3(.s(19)) Xor mExpKey(j + 1)
.T2 = mT0(.s(8)) Xor mT1(.s(5)) Xor mT2(.s(2)) Xor mT3(.s(23)) Xor mExpKey(j + 2)
.T3 = mT0(.s(12)) Xor mT1(.s(9)) Xor mT2(.s(6)) Xor mT3(.s(3)) Xor mExpKey(j + 3)
.T4 = mT0(.s(16)) Xor mT1(.s(13)) Xor mT2(.s(10)) Xor mT3(.s(7)) Xor mExpKey(j + 4)
.T5 = mT0(.s(20)) Xor mT1(.s(17)) Xor mT2(.s(14)) Xor mT3(.s(11)) Xor mExpKey(j + 5)
j = j + 6
Call CopyMemory(ByVal mSPtr, ByVal mTmpPtr, 24)
Next i
MemLong(bPtr) = (mT4(.s(0)) And &HFF&) Xor (mT4(.s(21)) And &HFF00&) Xor (mT4(.s(18)) And &HFF0000) Xor (mT4(.s(15)) And &HFF000000) Xor mExpKey(j)
MemLong(bPtr + 4) = (mT4(.s(4)) And &HFF&) Xor (mT4(.s(1)) And &HFF00&) Xor (mT4(.s(22)) And &HFF0000) Xor (mT4(.s(19)) And &HFF000000) Xor mExpKey(j + 1)
MemLong(bPtr + 8) = (mT4(.s(8)) And &HFF&) Xor (mT4(.s(5)) And &HFF00&) Xor (mT4(.s(2)) And &HFF0000) Xor (mT4(.s(23)) And &HFF000000) Xor mExpKey(j + 2)
MemLong(bPtr + 12) = (mT4(.s(12)) And &HFF&) Xor (mT4(.s(9)) And &HFF00&) Xor (mT4(.s(6)) And &HFF0000) Xor (mT4(.s(3)) And &HFF000000) Xor mExpKey(j + 3)
MemLong(bPtr + 16) = (mT4(.s(16)) And &HFF&) Xor (mT4(.s(13)) And &HFF00&) Xor (mT4(.s(10)) And &HFF0000) Xor (mT4(.s(7)) And &HFF000000) Xor mExpKey(j + 4)
MemLong(bPtr + 20) = (mT4(.s(20)) And &HFF&) Xor (mT4(.s(17)) And &HFF00&) Xor (mT4(.s(14)) And &HFF0000) Xor (mT4(.s(11)) And &HFF000000) Xor mExpKey(j + 5)
End With
End Sub
Private Sub Decrypt256(ByRef Bytes() As Byte, ByVal Index As Long)
Dim bPtr As Long
bPtr = VarPtr(Bytes(Index))
MemLong(mSPtr) = MemLong(bPtr) Xor mExpKey(0)
MemLong(mSPtr + 4) = MemLong(bPtr + 4) Xor mExpKey(1)
MemLong(mSPtr + 8) = MemLong(bPtr + 8) Xor mExpKey(2)
MemLong(mSPtr + 12) = MemLong(bPtr + 12) Xor mExpKey(3)
MemLong(mSPtr + 16) = MemLong(bPtr + 16) Xor mExpKey(4)
MemLong(mSPtr + 20) = MemLong(bPtr + 20) Xor mExpKey(5)
MemLong(mSPtr + 24) = MemLong(bPtr + 24) Xor mExpKey(6)
MemLong(mSPtr + 28) = MemLong(bPtr + 28) Xor mExpKey(7)
With mTmp
Dim j As Long
j = 8
Dim i As Long
For i = 1 To mNr - 1
.T0 = mT0(.s(0)) Xor mT1(.s(29)) Xor mT2(.s(22)) Xor mT3(.s(19)) Xor mExpKey(j)
.T1 = mT0(.s(4)) Xor mT1(.s(1)) Xor mT2(.s(26)) Xor mT3(.s(23)) Xor mExpKey(j + 1)
.T2 = mT0(.s(8)) Xor mT1(.s(5)) Xor mT2(.s(30)) Xor mT3(.s(27)) Xor mExpKey(j + 2)
.T3 = mT0(.s(12)) Xor mT1(.s(9)) Xor mT2(.s(2)) Xor mT3(.s(31)) Xor mExpKey(j + 3)
.T4 = mT0(.s(16)) Xor mT1(.s(13)) Xor mT2(.s(6)) Xor mT3(.s(3)) Xor mExpKey(j + 4)
.T5 = mT0(.s(20)) Xor mT1(.s(17)) Xor mT2(.s(10)) Xor mT3(.s(7)) Xor mExpKey(j + 5)
.T6 = mT0(.s(24)) Xor mT1(.s(21)) Xor mT2(.s(14)) Xor mT3(.s(11)) Xor mExpKey(j + 6)
.T7 = mT0(.s(28)) Xor mT1(.s(25)) Xor mT2(.s(18)) Xor mT3(.s(15)) Xor mExpKey(j + 7)
j = j + 8
Call CopyMemory(ByVal mSPtr, ByVal mTmpPtr, 32)
Next i
MemLong(bPtr) = (mT4(.s(0)) And &HFF&) Xor (mT4(.s(29)) And &HFF00&) Xor (mT4(.s(22)) And &HFF0000) Xor (mT4(.s(19)) And &HFF000000) Xor mExpKey(j)
MemLong(bPtr + 4) = (mT4(.s(4)) And &HFF&) Xor (mT4(.s(1)) And &HFF00&) Xor (mT4(.s(26)) And &HFF0000) Xor (mT4(.s(23)) And &HFF000000) Xor mExpKey(j + 1)
MemLong(bPtr + 8) = (mT4(.s(8)) And &HFF&) Xor (mT4(.s(5)) And &HFF00&) Xor (mT4(.s(30)) And &HFF0000) Xor (mT4(.s(27)) And &HFF000000) Xor mExpKey(j + 2)
MemLong(bPtr + 12) = (mT4(.s(12)) And &HFF&) Xor (mT4(.s(9)) And &HFF00&) Xor (mT4(.s(2)) And &HFF0000) Xor (mT4(.s(31)) And &HFF000000) Xor mExpKey(j + 3)
MemLong(bPtr + 16) = (mT4(.s(16)) And &HFF&) Xor (mT4(.s(13)) And &HFF00&) Xor (mT4(.s(6)) And &HFF0000) Xor (mT4(.s(3)) And &HFF000000) Xor mExpKey(j + 4)
MemLong(bPtr + 20) = (mT4(.s(20)) And &HFF&) Xor (mT4(.s(17)) And &HFF00&) Xor (mT4(.s(10)) And &HFF0000) Xor (mT4(.s(7)) And &HFF000000) Xor mExpKey(j + 5)
MemLong(bPtr + 24) = (mT4(.s(24)) And &HFF&) Xor (mT4(.s(21)) And &HFF00&) Xor (mT4(.s(14)) And &HFF0000) Xor (mT4(.s(11)) And &HFF000000) Xor mExpKey(j + 6)
MemLong(bPtr + 28) = (mT4(.s(28)) And &HFF&) Xor (mT4(.s(25)) And &HFF00&) Xor (mT4(.s(18)) And &HFF0000) Xor (mT4(.s(15)) And &HFF000000) Xor mExpKey(j + 7)
End With
End Sub
''
' Creates the expanded key used for encrypting data. If the CipherMode is CFB,
' then the expanded key is used for decryption as well.
'
Private Sub CreateExpandedKey(ByRef RgbKey() As Byte)
ReDim mExpKey(0 To (mNb * (mNr + 1)) - 1)
Call CopyMemory(mExpKey(0), RgbKey(0), cArray.GetLength(RgbKey))
Dim W As Long
Dim i As Long
For i = mNk To UBound(mExpKey)
W = mExpKey(i - 1)
If (i Mod mNk) = 0 Then
W = SubWord(RRotate(W, 8))
W = W Xor mRCon(i \ mNk - 1)
ElseIf (mNk > 6) And ((i Mod mNk) = 4) Then
W = SubWord(W)
End If
mExpKey(i) = mExpKey(i - mNk) Xor W
Next i
If (Not mIsEncrypting) And (mMode <> CipherMode.CFB) Then
mExpKey = CreateDecryptionKey(mExpKey)
End If
End Sub
Private Sub CalculateNumberOfRounds()
If (mNk = 8) Or (mNb = 8) Then
mNr = 14
ElseIf (mNk = 6) Or (mNb = 6) Then
mNr = 12
Else
mNr = 10
End If
End Sub
Private Function SubWord(ByVal Word As Long) As Long
With AsQByteArr(Word)
.Bytes(0) = mSBox(.Bytes(0))
.Bytes(1) = mSBox(.Bytes(1))
.Bytes(2) = mSBox(.Bytes(2))
.Bytes(3) = mSBox(.Bytes(3))
SubWord = AsLong(.Bytes(0))
End With
End Function
''
' Creates a decryption version of the expanded key. This will not be
' used if the CipherMode is CFB.
'
Private Function CreateDecryptionKey(ByRef ExpKey() As Long) As Long()
Dim Ret() As Long
ReDim Ret(0 To UBound(ExpKey))
Dim i As Long
Dim j As Long
Dim K As Long
K = mNb * mNr
For i = 0 To mNr
Call CopyMemory(Ret(j), ExpKey(K), mBlockSizeBytes)
j = j + mNb
K = K - mNb
Next i
Dim Te4(0 To 255) As Long
Dim Td0(0 To 255) As Long
Dim Td1(0 To 255) As Long
Dim Td2(0 To 255) As Long
Dim Td3(0 To 255) As Long
Call CopyMemory(Td0(0), ByVal Rijndael.Td0Ptr, 1024)
Call CopyMemory(Td1(0), ByVal Rijndael.Td1Ptr, 1024)
Call CopyMemory(Td2(0), ByVal Rijndael.Td2Ptr, 1024)
Call CopyMemory(Td3(0), ByVal Rijndael.Td3Ptr, 1024)
Call CopyMemory(Te4(0), ByVal Rijndael.Te4Ptr, 1024)
For i = mNb To mNb * mNr - 1
With AsQByteArr(Ret(i))
Ret(i) = Td0(Te4(.Bytes(0)) And &HFF&) Xor _
Td1(Te4(.Bytes(1)) And &HFF&) Xor _
Td2(Te4(.Bytes(2)) And &HFF&) Xor _
Td3(Te4(.Bytes(3)) And &HFF&)
End With
Next i
CreateDecryptionKey = Ret
End Function
Private Sub InitLookupTables()
If (mIsEncrypting) Or (mMode = CipherMode.CFB) Then
Call CopyMemory(mT0(0), ByVal Rijndael.Te0Ptr, 1024)
Call CopyMemory(mT1(0), ByVal Rijndael.Te1Ptr, 1024)
Call CopyMemory(mT2(0), ByVal Rijndael.Te2Ptr, 1024)
Call CopyMemory(mT3(0), ByVal Rijndael.Te3Ptr, 1024)
Call CopyMemory(mT4(0), ByVal Rijndael.Te4Ptr, 1024)
Else
Call CopyMemory(mT0(0), ByVal Rijndael.Td0Ptr, 1024)
Call CopyMemory(mT1(0), ByVal Rijndael.Td1Ptr, 1024)
Call CopyMemory(mT2(0), ByVal Rijndael.Td2Ptr, 1024)
Call CopyMemory(mT3(0), ByVal Rijndael.Td3Ptr, 1024)
Call CopyMemory(mT4(0), ByVal Rijndael.Td4Ptr, 1024)
End If
SAPtr(mSBox) = Rijndael.SBoxPtr
SAPtr(mRCon) = Rijndael.RConPtr
End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Class Events
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub Class_Initialize()
mTmpPtr = VarPtr(mTmp.T0)
mSPtr = VarPtr(mTmp.s(0))
End Sub
Private Sub Class_Terminate()
SAPtr(mSBox) = vbNullPtr
SAPtr(mRCon) = vbNullPtr
End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' IObject Interface
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Function IObject_Equals(Value As Variant) As Boolean
IObject_Equals = Equals(Value)
End Function
Private Function IObject_GetHashcode() As Long
IObject_GetHashcode = GetHashCode
End Function
Private Function IObject_ToString() As String
IObject_ToString = ToString
End Function
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' ICryptoTransform Interface
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Property Get ICryptoTransform_CanReuseTransform() As Boolean
ICryptoTransform_CanReuseTransform = CanReuseTransform
End Property
Private Property Get ICryptoTransform_CanTransformMultipleBlocks() As Boolean
ICryptoTransform_CanTransformMultipleBlocks = CanTransformMultipleBlocks
End Property
Private Property Get ICryptoTransform_InputBlockSize() As Long
ICryptoTransform_InputBlockSize = InputBlockSize
End Property
Private Property Get ICryptoTransform_OutputBlockSize() As Long
ICryptoTransform_OutputBlockSize = OutputBlockSize
End Property
Private Function ICryptoTransform_TransformBlock(InputBuffer() As Byte, ByVal InputOffset As Long, ByVal InputCount As Long, OutputBuffer() As Byte, ByVal OutputOffset As Long) As Long
ICryptoTransform_TransformBlock = TransformBlock(InputBuffer, InputOffset, InputCount, OutputBuffer, OutputOffset)
End Function
Private Function ICryptoTransform_TransformFinalBlock(InputBuffer() As Byte, ByVal InputOffset As Long, ByVal InputCount As Long) As Byte()
ICryptoTransform_TransformFinalBlock = TransformFinalBlock(InputBuffer, InputOffset, InputCount)
End Function
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -