Imports System.Net.Sockets
Public Class MySocket
Inherits System.Net.Sockets.Socket
Private _BytesPassword() As Byte = Nothing
Private _Authenticated As Boolean = False
Private Rsa As New System.Security.Cryptography.RSACryptoServiceProvider
Public ReadOnly Property BytesPassword() As Byte()
Get
Return _BytesPassword
End Get
End Property
Public ReadOnly Property Authenticated() As Boolean
Get
Return _Authenticated
End Get
End Property
Sub New(ByVal addressFamily As System.Net.Sockets.AddressFamily, ByVal socketType As System.Net.Sockets.SocketType, ByVal protocolType As System.Net.Sockets.ProtocolType)
MyBase.New(addressFamily, socketType, protocolType)
End Sub
Private IV32 As Byte() = New Byte() {133, 206, 56, 64, 110, 158, 132, 22, _
99, 190, 35, 129, 101, 49, 204, 248, 251, 243, 13, 194, 160, 195, 89, 152, 149, 227, 245, 5, 218, 86, 161, 124}
Private Function Encrypt(ByVal Input() As Byte, ByVal Length As Integer) As Byte()
Dim Provider As New System.Security.Cryptography.RijndaelManaged
Dim BytePassword As Byte()
Dim Encryptor As System.Security.Cryptography.ICryptoTransform
Dim Output As Byte()
Provider.KeySize = 256
Provider.BlockSize = 256
BytePassword = _BytesPassword
Encryptor = Provider.CreateEncryptor(BytePassword, IV32)
Output = Encryptor.TransformFinalBlock(Input, 0, Length)
Provider.Clear()
Encryptor.Dispose()
Return Output
End Function
Private Function Decrypt(ByVal Input() As Byte, ByVal Length As Integer) As Byte()
Dim Provider As New System.Security.Cryptography.RijndaelManaged
Dim BytePassword As Byte()
Dim Decryptor As System.Security.Cryptography.ICryptoTransform
Dim Output As Byte()
Provider.KeySize = 256
Provider.BlockSize = 256
BytePassword = _BytesPassword
Decryptor = Provider.CreateDecryptor(BytePassword, IV32)
Output = Decryptor.TransformFinalBlock(Input, 0, Length)
Provider.Clear()
Decryptor.Dispose()
Return Output
End Function
Private Function GeneratePassword() As Byte()
Dim Key As String = ""
Dim Rnd As New Random
For i As Byte = 0 To 11
Key &= Convert.ToChar(Rnd.Next(33, 126))
Next
Dim SaltBytes() As Byte = {162, 21, 92, 34, 27, 239, 64, 30, 136, 102, 223}
Dim Derive As New System.Security.Cryptography.Rfc2898DeriveBytes(Key, SaltBytes, 5)
Dim DerivedBytes() As Byte
DerivedBytes = Derive.GetBytes(32)
Return DerivedBytes
End Function
Public Sub AuthenticateAsClient()
If _Authenticated = False Then
Dim Bytes() As Byte = System.Text.UTF8Encoding.UTF8.GetBytes(Rsa.ToXmlString(False))
Send(Bytes, Bytes.Length, SocketFlags.None)
Dim Read As Integer = 0
Dim BytesPassword(ReceiveBufferSize) As Byte
Read = Receive(BytesPassword, BytesPassword.Length, SocketFlags.None)
Dim TempBytes(Read - 1) As Byte
For i As Integer = 0 To UBound(TempBytes)
TempBytes(i) = Bytes(i)
Next
Dim Data As String = System.Text.UTF8Encoding.UTF8.GetString(TempBytes)
_BytesPassword = Convert.FromBase64String(Data)
_Authenticated = True
Else
Throw New Exception
End If
End Sub
Public Sub AuthenticateAsServer()
If _Authenticated = False Then
Dim Read As Integer = 0
Dim Bytes(ReceiveBufferSize) As Byte
Read = Receive(Bytes, Bytes.Length, SocketFlags.None)
Dim TempBytes(Read - 1) As Byte
For i As Integer = 0 To UBound(TempBytes)
TempBytes(i) = Bytes(i)
Next
Dim Data As String = System.Text.UTF8Encoding.UTF8.GetString(Bytes)
Dim Stringa() As String = Data.Split("|")
Dim Rsa As New System.Security.Cryptography.RSACryptoServiceProvider
Rsa.FromXmlString(Stringa(1))
_BytesPassword = Me.GeneratePassword()
Dim BytesPasswordEncrypted() As Byte = Rsa.Encrypt(BytesPassword, False)
Dim Password As String = Convert.ToBase64String(BytesPasswordEncrypted)
Send(System.Text.UTF8Encoding.UTF8.GetBytes(Password), Password.Length, SocketFlags.None)
_Authenticated = True
Else
Throw New Exception
End If
End Sub
Public Function SendEncryptedBytes(ByVal buffer() As Byte, ByVal size As Integer, ByVal socketFlags As System.Net.Sockets.SocketFlags) As Integer
If _Authenticated = True Then
Dim Read As Integer = 0
Dim Output() As Byte = Encrypt(buffer, size)
Read = Send(Output, Output.Length, socketFlags)
Return Read
Else
Throw New Exception
End If
End Function
Public Function ReceiveEncryptedBytes(ByRef buffer() As Byte, ByVal size As Integer, ByVal socketFlags As System.Net.Sockets.SocketFlags) As Integer
If _Authenticated = True Then
Dim Read As Integer = 0
Dim Input(size) As Byte
Read = Receive(Input, size, socketFlags)
buffer = Decrypt(Input, size)
Return Read
Else
Throw New Exception
End If
End Function
End Class