How to convert Stream to Image? - vb.net

I have a WCF service and I send img by parameter in Stream, and I want save the image that I sent in file in my server, in this case is localhost.
Can you help me?
Public Function UploadStream(ByVal stream As Stream) As Byte() Implements IService1.UploadStream
Dim buffer As Byte() = New Byte(9999) {}
Dim bytesRead As Integer, totalBytesRead As Integer = 0
Do
bytesRead = stream.Read(buffer, 0, buffer.Length)
totalBytesRead += bytesRead
Loop While bytesRead > 0
Dim imagememorystream As MemoryStream = New MemoryStream(buffer)
Dim imgFromStream As Image = Image.FromStream(imagememorystream)
Return buffer
End Function
If I remove this code: Dim imagememorystream As MemoryStream = New MemoryStream(buffer)
Dim imgFromStream As Image = Image.FromStream(imagememorystream),
the function returns the bytearray, when I add him the WCF service doesn't work.
Erro do Pedido
O servidor encontrou um erro ao processar o pedido. A mensagem de exceção é 'O parâmetro não é válido.'. Consulte os registos do servidor para obter mais detalhes. O rastreio da pilha de exceções é:
em System.Drawing.Image.FromStream(Stream stream, Boolean useEmbeddedColorManagement, Boolean validateImageData)
em WcfService2.Service1.UploadStream(Stream stream)
em C:\Users\d-sil\source\repos\WcfService2\WcfService2\Service1.svc.vb:line 40
em SyncInvokeUploadStream(Object , Object[] , Object[] )
em System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs)
em System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)
em System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc)
em System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc& rpc)
em System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)

i don't know much about vb but i did the same thing in c#. at first you need to return Stream instead of byte array and the simply return the image like this:
var Image = new MemoryStream(image) { Position = 0 };
WebOperationContext.Current.OutgoingResponse.ContentType = "image/*";
return Image;

Related

How to use a Script Task to Download One or More Files from FTP?

I've created a Script Task in my SSIS 2012 package that needs to grab files from a FTP server and store them on the local server's hard drive. The code I've written in the script task s as follows:
Public Sub Main()
'
' Add your code here
'
Const localFile As String = "C:\InboundOrders\*.*"
Const remoteFile As String = "/remote/folder/filename.pgp"
Const host As String = "ftp://ftp1.commerceub.com"
Const user As String = "ourusername"
Const pw As String = "ourpassword"
Dim URI As String = host & remoteFile
Dim ftp As System.Net.FtpWebRequest = CType(FtpWebRequest.Create(URI),
FtpWebRequest)
ftp.Credentials = New System.Net.NetworkCredential(user, pw)
ftp.KeepAlive = False
ftp.UseBinary = True
ftp.Method = System.Net.WebRequestMethods.Ftp.DownloadFile
Using response As System.Net.FtpWebResponse = CType(ftp.GetResponse,
System.Net.FtpWebResponse)
Using responseStream As IO.Stream = response.GetResponseStream
Using fs As New IO.FileStream(localFile, IO.FileMode.Create)
Dim buffer(2047) As Byte
Dim read As Integer = 0
Do
read = responseStream.Read(buffer, 0, buffer.Length)
fs.Write(buffer, 0, read)
Loop Until read = 0
responseStream.Close()
fs.Flush()
fs.Close()
End Using
responseStream.Close()
End Using
response.Close()
End Using
Dts.TaskResult = ScriptResults.Success
End Sub
When I run the package, I receive an error stating:
DTS Script Task has encountered an exception in user code.
at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments,
Signature sig, Boolean constructor)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr,
Binder binder, Object[] parameters, CultureInfo culture)
at System.RuntimeType.InvokeMember(String name, BindingFlags bindingFlags, Binder
binder, Object target, Object[] providedArgs, ParameterModifier[] modifiers,
CultureInfo culture, String[] namedParams)
at System.Type.InvokeMember(String name, BindingFlags invokeAttr, Binder binder,
Object target, Object[] args, CultureInfo culture)
at Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTATaskScriptingEngine.ExecuteScript()
What should I do to remedy the above error? Thanks for your help and guidance.
UPDATE: I specified a file that is actually on the FTP server in my code. I receive the same error. Is there a different approach I should take?

Encryption of email address in vb.net

I would like to know how I can encrypt an email address via vb.net code.
I found one sample which doesn't quite work with special characters and I am getting this error:
The input is not a valid Base-64 string as it contains a non-base 64 character, more than two padding characters, or a non-white space character among the padding characters.
Here is the code I am trying:
'The function used to encrypt the text
Private Function Encrypt(ByVal strText As String, ByVal strEncrKey _
As String) As String
Dim byKey() As Byte = {}
Dim IV() As Byte = {&H12, &H34, &H56, &H78, &H90, &HAB, &HCD, &HEF}
Try
byKey = System.Text.Encoding.UTF8.GetBytes(Left(strEncrKey, 8))
Dim des As New DESCryptoServiceProvider()
Dim inputByteArray() As Byte = Encoding.UTF8.GetBytes(strText)
Dim ms As New MemoryStream()
Dim cs As New CryptoStream(ms, des.CreateEncryptor(byKey, IV), CryptoStreamMode.Write)
cs.Write(inputByteArray, 0, inputByteArray.Length)
cs.FlushFinalBlock()
Return Convert.ToBase64String(ms.ToArray())
Catch ex As Exception
Return ex.Message
End Try
End Function
What do you guys think? What am I doing wrong?
Thanks, Laziale
UPDATE: Full Stack trace:
System.FormatException was caught
Message=The input is not a valid Base-64 string as it contains a non-base 64 character, more than two padding characters, or a non-white space character among the padding characters.
Source=mscorlib
StackTrace:
at System.Convert.FromBase64String(String s)
at WEbsite.Login.Decrypt(String strText, String sDecrKey) in D:\Website\Account\Login.aspx.vb:line 213
InnerException:
UPDATE 2:
Encryption method added:
'The function used to decrypt the text
Private Function Decrypt(ByVal strText As String, ByVal sDecrKey _
As String) As String
Dim byKey() As Byte = {}
Dim IV() As Byte = {&H12, &H34, &H56, &H78, &H90, &HAB, &HCD, &HEF}
Dim inputByteArray(strText.Length) As Byte
Try
byKey = System.Text.Encoding.UTF8.GetBytes(Left(sDecrKey, 8))
Dim des As New DESCryptoServiceProvider()
inputByteArray = Convert.FromBase64String(strText)
Dim ms As New MemoryStream()
Dim cs As New CryptoStream(ms, des.CreateDecryptor(byKey, IV), CryptoStreamMode.Write)
cs.Write(inputByteArray, 0, inputByteArray.Length)
cs.FlushFinalBlock()
Dim encoding As System.Text.Encoding = System.Text.Encoding.UTF8
Return encoding.GetString(ms.ToArray())
Catch ex As Exception
Return ex.Message
End Try
End Function
I have tried your Decrypt using, as input, the encrypted text and the same key.
It works as expected. The only change I have made to your code is the use of the Substring method instead of Left as in
byKey = System.Text.Encoding.UTF8.GetBytes(strDecrKey.Substring(0, 8))
I call the two methods in this way:
Dim result as String = Encrypt("test#gmail.com", "ABCD9876")
Dim decrypted = Decrypt(result, "ABCD9876")
I get back "test#gmail.com".
-Buon Weekend anche a te-
Use an String Builder instead of string as the parameter with the special characters.
Best regards.

VB.Net DES encryption function, to Triple DES

Public Shared Function DESEncrypt(ByVal Data As String, ByVal Key As String) As Byte()
Dim IV() As Byte = {&H12, &H34, &H56, &H78, &H90, &HAB, &HCD, &HEF}
Try
Dim bykey() As Byte = System.Text.Encoding.UTF8.GetBytes(Left(Key, 8))
Dim InputByteArray() As Byte = System.Text.Encoding.UTF8.GetBytes(Data)
Dim des As New DESCryptoServiceProvider
Dim ms As New MemoryStream
Dim cs As New CryptoStream(ms, des.CreateEncryptor(bykey, IV), CryptoStreamMode.Write)
cs.Write(InputByteArray, 0, InputByteArray.Length)
cs.FlushFinalBlock()
Return ms.ToArray()
Catch ex As Exception
End Try
End Function
this is what I currently have for my DES encryption, but as I am fairly new to VB.Net I can figure out how to make it use Triple DES rather than DES
Try this
Public Shared Function DESEncrypt(ByVal Data As String, ByVal Key As String) As Byte()
Dim IV() As Byte = {&H12, &H34, &H56, &H78, &H90, &HAB, &HCD, &HEF}
Try
Dim bykey() As Byte = System.Text.Encoding.UTF8.GetBytes(Left(Key, 24))
If String.IsNullOrEmpty(Data) Then
Throw New ArgumentException("No data passed", "input")
ElseIf bykey Is Nothing OrElse bykey.Length <> 24 Then
Throw New ArgumentException("Invalid Key. Key must be 24 bytes length", "key")
End If
Dim InputByteArray() As Byte = System.Text.Encoding.UTF8.GetBytes(Data)
Using ms As New IO.MemoryStream
Using des As New Security.Cryptography.TripleDESCryptoServiceProvider
Using cs As New Security.Cryptography.CryptoStream(ms, des.CreateEncryptor(bykey, IV), Security.Cryptography.CryptoStreamMode.Write)
cs.Write(InputByteArray, 0, InputByteArray.Length)
cs.FlushFinalBlock()
Return ms.ToArray()
End Using
End Using
End Using
Catch ex As Exception
End Try
End Function

Overflow error for encryption

I am getting an overflow error in the following code:
Public Shared Function AESFileEncrypt(inputFilename As String, outputFilename As String) As Boolean
'Create SymmetricAlgorithm object and specify the Key and IV.
Dim AES As RijndaelManaged = New RijndaelManaged
AES.Key = objKeys.aesKey
AES.IV = objKeys.aesIV
'Create an ICryptoTransform (Encryptor) object.
Dim Encryptor As ICryptoTransform
Encryptor = AES.CreateEncryptor
'Read the unencrypted file.
Dim InputFileStream As FileStream
InputFileStream = New FileStream(inputFilename, FileMode.Open, FileAccess.Read)
Dim InputFileData(CType(InputFileStream.Length, Integer)) As Byte
InputFileStream.Read(InputFileData, 0, CType(InputFileStream.Length, Integer))
Dim OutputFileStream As FileStream
OutputFileStream = New FileStream(outputFilename, FileMode.Create, FileAccess.Write)
'Create a CryptoStream object using the Stream and ICryptoTransform objects.
Dim EncryptCryptoStream As CryptoStream
EncryptCryptoStream = New CryptoStream(OutputFileStream, Encryptor, CryptoStreamMode.Write)
EncryptCryptoStream.Write(InputFileData, 0, InputFileData.Length)
EncryptCryptoStream.FlushFinalBlock()
'Clear any sensitive data from the cyptographic object.
AES.Clear()
'Close stream objects.
EncryptCryptoStream.Close()
InputFileStream.Close()
OutputFileStream.Close()
Return True
'Catch ex As Exception
'Debug.Print("AESFileEncrypt", ex.Message)
'Return False
'End Try
End Function
The error is at this line:
Dim InputFileData(CType(InputFileStream.Length, Integer)) As Byte
This happens on large files. I know it is because the byte array cannot be that large. Can I please have some help to modify this code to get it working?
Thanks
EDIT
This is my current work on this function:
Public Function AESFileEncrypt(inputFilename As String, outputFilename As String, Password As String, Salt As String) As Boolean
Dim AES As RijndaelManaged = New RijndaelManaged
Dim HashAlgorithm As String = "SHA1" 'Can be SHA1 or MD5
Dim PasswordIterations As String = 2
Dim InitialVector As String = "WinStorePassword" 'This should be a string of 16 ASCII characters.
Dim KeySize As Integer = 256 'Can be 128, 192, or 256.
Dim InitialVectorBytes As Byte() = Encoding.ASCII.GetBytes(InitialVector)
Dim SaltValueBytes As Byte() = Encoding.ASCII.GetBytes(Salt)
Dim DerivedPassword As PasswordDeriveBytes = New PasswordDeriveBytes(Password, SaltValueBytes, HashAlgorithm, PasswordIterations)
Dim KeyBytes As Byte() = DerivedPassword.GetBytes(KeySize / 8)
Dim Encryptor As ICryptoTransform
Encryptor = AES.CreateEncryptor(KeyBytes, InitialVectorBytes)
Dim InputFileStream As FileStream
InputFileStream = New FileStream(inputFilename, FileMode.Open, FileAccess.Read)
Dim OutputFileStream As FileStream
OutputFileStream = New FileStream(outputFilename, FileMode.Create, FileAccess.Write)
Dim EncryptCryptoStream As CryptoStream
EncryptCryptoStream = New CryptoStream(OutputFileStream, Encryptor, CryptoStreamMode.Write)
Const BUFFER_SIZE As Integer = 4096
Dim buffer(BUFFER_SIZE - 1) As Byte
Dim Position As Long
Do
If (Position + BUFFER_SIZE) > InputFileStream.Length Then
InputFileStream.Read(buffer, Position, InputFileStream.Length - Position)
EncryptCryptoStream.Write(buffer, Position, BUFFER_SIZE)
Exit Do
Else
InputFileStream.Read(buffer, Position, BUFFER_SIZE)
EncryptCryptoStream.Write(buffer, Position, BUFFER_SIZE)
End If
Position += BUFFER_SIZE
Loop
EncryptCryptoStream.FlushFinalBlock()
AES.Clear()
EncryptCryptoStream.Close()
InputFileStream.Close()
OutputFileStream.Close()
Return True
End Function
Is this correct? I did a test an a small file, and the output was a lot larger than i expected?

Error on encryption/decryption files

When I decrypt an encrypted file; it doesn't have the same size in bytes as the original file and the the hash of the file is different.
I get the bytes of the file using File.ReadAllBytes and send to EncryptBytes with the password. Also the same with DecryptBytes.
When I receive the bytes encrypted or decrypted i save them using File.WriteAllBytes.
I need that the decrypted file and original file have the same hash an bytes.
Please help
This my code:
Public Function EncryptBytes(ByVal pass As String, ByVal bytes() As Byte)
Dim myRijndael As New RijndaelManaged
myRijndael.Padding = PaddingMode.Zeros
myRijndael.KeySize = 256
myRijndael.BlockSize = 256
Dim encrypted() As Byte
Dim key() As Byte = CreateKey(pass)
Dim IV() As Byte = CreateIV(pass)
Dim encryptor As ICryptoTransform = myRijndael.CreateEncryptor(key, IV)
Dim msEncrypt As New MemoryStream()
Dim csEncrypt As New CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)
csEncrypt.Write(bytes, 0, bytes.Length)
csEncrypt.FlushFinalBlock()
encrypted = msEncrypt.ToArray()
Return encrypted
End Function
Public Function DecryptBytes(ByVal pass As String, ByVal bytes() As Byte)
Dim myRijndael As New RijndaelManaged
myRijndael.Padding = PaddingMode.Zeros
myRijndael.KeySize = 256
myRijndael.BlockSize = 256
Dim key() As Byte = CreateKey(pass)
Dim IV() As Byte = CreateIV(pass)
Dim decryptor As ICryptoTransform = myRijndael.CreateDecryptor(key, IV)
Dim fromEncrypt() As Byte = New Byte(bytes.Length) {}
Dim msDecrypt As New MemoryStream(bytes)
Dim csDecrypt As New CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)
csDecrypt.Read(fromEncrypt, 0, fromEncrypt.Length)
Return fromEncrypt
End Function
Private Function CreateKey(ByVal strPassword As String) As Byte()
Dim chrData() As Char = strPassword.ToCharArray
Dim intLength As Integer = chrData.GetUpperBound(0)
Dim bytDataToHash(intLength) As Byte
For i As Integer = 0 To chrData.GetUpperBound(0)
bytDataToHash(i) = CByte(Asc(chrData(i)))
Next
Dim SHA512 As New System.Security.Cryptography.SHA512Managed
Dim bytResult As Byte() = SHA512.ComputeHash(bytDataToHash)
Dim bytKey(31) As Byte
For i As Integer = 0 To 31
bytKey(i) = bytResult(i)
Next
Return bytKey
End Function
Private Function CreateIV(ByVal strPassword As String) As Byte()
Dim chrData() As Char = strPassword.ToCharArray
Dim intLength As Integer = chrData.GetUpperBound(0)
Dim bytDataToHash(intLength) As Byte
For i As Integer = 0 To chrData.GetUpperBound(0)
bytDataToHash(i) = CByte(Asc(chrData(i)))
Next
Dim SHA512 As New System.Security.Cryptography.SHA512Managed
Dim bytResult As Byte() = SHA512.ComputeHash(bytDataToHash)
Dim bytIV(31) As Byte
For i As Integer = 32 To 47
bytIV(i - 32) = bytResult(i)
Next
Return bytIV
End Function
Your DecryptBytes() method is broken. You are not using the return value of csDecrypt.Read(), it tells you have many bytes were decrypted. That will not be the same as fromEncrypt.Length. You'd also have a very hard time guessing how large a byte array to pass to this function.
Consider changing the function to return a MemoryStream. Call Read() in a loop and write what was read to the memory stream. Exit the loop when Read() returns 0.
Try this:
Public Function EncryptBytes(ByVal pass As String, ByVal bytes() As Byte)
Dim myRijndael As New RijndaelManaged
myRijndael.Padding = PaddingMode.PKCS7
myRijndael.Mode = CipherMode.CBC
myRijndael.KeySize = 256
myRijndael.BlockSize = 256
Dim encrypted() As Byte
Dim key() As Byte = CreateKey(pass)
Dim IV() As Byte = CreateIV(pass)
Dim encryptor As ICryptoTransform = myRijndael.CreateEncryptor(key, IV)
Dim msEncrypt As New MemoryStream()
Dim csEncrypt As New CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)
csEncrypt.Write(bytes, 0, bytes.Length)
csEncrypt.FlushFinalBlock()
encrypted = msEncrypt.ToArray()
Return encrypted
msEncrypt.Close()
csEncrypt.Close()
End Function
Public Function DecryptBytes(ByVal pass As String, ByVal bytes() As Byte)
Dim myRijndael As New RijndaelManaged
myRijndael.Padding = PaddingMode.PKCS7
myRijndael.Mode = CipherMode.CBC
myRijndael.KeySize = 256
myRijndael.BlockSize = 256
Dim decrypted() As Byte
Dim key() As Byte = CreateKey(pass)
Dim IV() As Byte = CreateIV(pass)
Dim decryptor As ICryptoTransform = myRijndael.CreateDecryptor(key, IV)
Dim msDecrypt As New MemoryStream()
Dim csDecrypt As New CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Write)
csDecrypt.Write(bytes, 0, bytes.Length)
csDecrypt.FlushFinalBlock()
decrypted = msDecrypt.ToArray()
Return decrypted
msDecrypt.Close()
csDecrypt.Close()
End Function