Avatar billede pokgai Nybegynder
15. januar 2005 - 23:59 Der er 8 kommentarer

Krypering/Dekryptering af Jpg filer?

Jeg har prøvet at krypter jpg filer via indlæsning af en jpg fil til stream og brug af Crytostream. Problemet er bare at det vil ikke virke med jpg filer mens almindelig tekstfiler virker det fint!
Den kan sagten krypter og dekrypter, men windows kan ikke genkende den dekrypteret fil som jpg format!
Jeg har søgt en del på google uden held, er der nogen som kan hjælpe ??
Avatar billede arne_v Ekspert
16. januar 2005 - 00:01 #1
Da en korrekt kryptering + dekryptering giver præcis samme fil, så
må der jo være en fejl i enten kryptering eller dekryptering.

Må vi se noget kode ?
Avatar billede pixy Nybegynder
16. januar 2005 - 00:09 #2
Det kan måske have noget med charsets at gøre. Jeg har oplevet problemer med at det default charset som en streamer bruger, har problemer med mange forskellige tegn. Men som Arne_v siger... hit med noget kode :D
Avatar billede arne_v Ekspert
16. januar 2005 - 00:11 #3
En JPG fil er en binær fil - så data er forhåbentlig aldrig i nærheden af
strings, StreamReader/StreamWriter og andet charset aware.
Avatar billede pixy Nybegynder
16. januar 2005 - 00:20 #4
Det kommer jo an på hvordan man opfatter JPG filen. JPG formatet skal måske læses binært for at få det som JPG formatet er lavet til, men ønsker man fx. at kryptere JPG filen, skal man nødvændigvis ikke opfatte det som en bibær fil.
Avatar billede pokgai Nybegynder
16. januar 2005 - 01:11 #5
Tror ikke umiddlebart at der er en fej i koden.
Udrag af koden:

using System.Security;
using System.Security.Cryptography;

private FileStream stream;
private CryptoStream cryptoStreamDecr;
private ManualResetEvent ev;

public void start()
{
ev = new ManualResetEvent(false);
Encrypt();
Decrypt();
}

public void Encrypt()
{
stream = new FileStream("c:\\xbox.jpg", FileMode.Open, FileAccess.Read, FileShare.Read);

FileStream outStream = new FileStream("c:\\test\\xbox.enc", FileMode.OpenOrCreate, FileAccess.Write, FileShare.Read);
byte[] buf = new byte[stream.Length];
stream.Read(buf, 0, buf.Length);
           
DESCryptoServiceProvider DESProvider = new DESCryptoServiceProvider();
DESProvider.Key = ASCIIEncoding.ASCII.GetBytes("MySecret");
ICryptoTransform DESEncrypt = DESProvider.CreateEncryptor();
           
CryptoStream cryptoStream = new CryptoStream(outStream, DESEncrypt, CryptoStreamMode.Write);
       
byte[] bytearrayinput = new byte[stream.Length];
stream.Read(bytearrayinput, 0, bytearrayinput.Length);
   
stream.Read(bytearrayinput, 0, bytearrayinput.Length);
cryptoStream.Write(bytearrayinput, 0, corrected.Length);

cryptoStream.Close();
stream.Close();
outStream.Close();
}

public void Decrypt()
{
           
DESCryptoServiceProvider DESProvider = new DESCryptoServiceProvider();
DESProvider.Key = ASCIIEncoding.ASCII.GetBytes("MySecret");
           
FileStream decryptFile = new FileStream("c:\\test\\xbox.enc", FileMode.Open, FileAccess.Read, FileShare.Read);
ICryptoTransform DESDecrypt = DESProvider.CreateDecryptor();
           
cryptoStreamDecr = new CryptoStream(decryptFile, DESDecrypt, CryptoStreamMode.Read);
           
FileStream fileOutput = new FileStream("c:\\test\\xbox.jpg", FileMode.OpenOrCreate, FileAccess.Write, FileShare.Read);
           
buffer = new byte[1024];
cryptoStreamDecr.BeginRead(buffer, 0, buffer.Length, new AsyncCallback(ReaderCallBack), null);
           
ev.WaitOne();
byte[] f = Encoding.Unicode.GetBytes(data);
           
           
fileOutput.Write(f, 0, res.Length);

           
decryptFile.Close();
cryptoStreamDecr.Close();
fileOutput.Close();
           
}

public void ReaderCallBack(IAsyncResult res)
{
int byteRead = cryptoStreamDecr.EndRead(res);
if(byteRead > 0)
{
    data += Encoding.Unicode.GetString(buffer, 0, buffer.Length);
               
    cryptoStreamDecr.BeginRead(buffer, 0, buffer.Length, new AsyncCallback(ReaderCallBack), null);
}
else
{
    ev.Set();
}
Avatar billede arne_v Ekspert
16. januar 2005 - 17:50 #6
byte[] bytearrayinput = new byte[stream.Length];
stream.Read(bytearrayinput, 0, bytearrayinput.Length);
stream.Read(bytearrayinput, 0, bytearrayinput.Length);
cryptoStream.Write(bytearrayinput, 0, corrected.Length);

hvorfor læser du ind 2 gange i bytearrayinput ?

hvor kommer corrected ind i billedet ?
Avatar billede arne_v Ekspert
16. januar 2005 - 17:51 #7
hvorfor bruger du AsyncCallback ?

hvorfor konverterer du i Decrypt byte[] -> string -> byte[] ?
Avatar billede pokgai Nybegynder
16. januar 2005 - 18:14 #8
Hej undskyld... Koden er et udrag af et større system, så jeg måtte COPI/PASTET noget af det for at lave et uddrag. Men jeg har åbenbart ikke fået rettet det til korrekt...
Men det er bare for i har en idé af hvad jeg mener...
Dvs:
1 - Læs jpg fil ind i byte[] array
2 - Opret en CryptoProvider
3 - Opret en ouput fil og en Cryptostream.
4 - Skriv jpg byte[] array til output fil via kryptostream

Omvendt når man dekrypter..
Men problemet er stadig at man kan ikke krypter en jpg fil mens det virker fint med almindelig tekstfiler etc. !
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester