Avatar billede cdull Nybegynder
27. september 2005 - 19:29 Der er 16 kommentarer og
1 løsning

krypteringsklasse , fra VB til C#

Jeg har fundet et eksempel på noget kryptering på nettet, det er bare skrevet i VB. Meningen er at jeg skal bruge det i C#.

Har selv prøvet at omskrive noget af det men har nogle problemer med nogle keys.
Er der en der lige gide kigge det igennem for er ved at gå småkold i det.



Det her er det jeg har prøvet at skrive om.

using System;
using System.IO;
using System.Text;
using System.Security.Cryptography;



public class Encryp
{

    private byte[] key =
   
   
    private byte[] IV =
   


    public Array Decrypt(string stringToDecrypt, string sEncryptionKey)
    {

        byte[] inputByteArray = new byte[stringToDecrypt.Length];
        key = System.Text.Encoding.UTF8.GetBytes(sEncryptionKey);

        DESCryptoServiceProvider des = new DESCryptoServiceProvider();
        inputByteArray = Convert.FromBase64String(stringToDecrypt);
        MemoryStream ms = new MemoryStream();
        CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(key, IV), CryptoStreamMode.Write);
        cs.Write(inputByteArray, 0, inputByteArray.Length);
        cs.FlushFinalBlock();
        System.Text.Encoding encoding = new System.Text.UTF8Encoding();
        return encoding.GetString(ms.ToArray()).ToCharArray();
    }


public Array Encrypt(string stringToEncrypt ,string SEncryptionKey)
{
key = System.Text.Encoding.UTF8.GetBytes(SEncryptionKey);
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
byte[] inputByteArray = Encoding.UTF8.GetBytes(stringToEncrypt);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(key, IV),CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
return Convert.ToBase64String(ms.ToArray()).ToCharArray();
        }
}



Og her er den oprindelige kode.

Imports System
Imports System.IO
Imports System.Xml
Imports System.Text
Imports System.Security.Cryptography

Public Class Encryption
Private key() As Byte = {}

Private IV() As Byte = {&H12, &H34, &H56, &H78, &H90, &HAB, &HCD, &HEF}
Public Function Decrypt(ByVal stringToDecrypt As String, _
ByVal sEncryptionKey As String) As String
Dim inputByteArray(stringToDecrypt.Length) As Byte
Try
key = System.Text.Encoding.UTF8.GetBytes(Left(sEncryptionKey, 8))
Dim des As New DESCryptoServiceProvider
inputByteArray = Convert.FromBase64String(stringToDecrypt)
Dim ms As New MemoryStream
Dim cs As New CryptoStream(ms, des.CreateDecryptor(key, 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 e As Exception
Return e.Message
End Try
End Function
Public Function Encrypt(ByVal stringToEncrypt As String, _
ByVal SEncryptionKey As String) As String

Try
key = System.Text.Encoding.UTF8.GetBytes(Left(SEncryptionKey, 8))
Dim des As New DESCryptoServiceProvider
Dim inputByteArray() As Byte = Encoding.UTF8.GetBytes( _
stringToEncrypt)
Dim ms As New MemoryStream
Dim cs As New CryptoStream(ms, des.CreateEncryptor(key, IV), _
CryptoStreamMode.Write)
cs.Write(inputByteArray, 0, inputByteArray.Length)
cs.FlushFinalBlock()
Return Convert.ToBase64String(ms.ToArray())
Catch e As Exception
Return e.Message
End Try
End Function
End Class
Avatar billede driis Nybegynder
27. september 2005 - 19:31 #1
private byte[] IV = {0x12,0x34,0x56,0x78,0x90,0xab,0xcd,0xef};

Er det det du mangler ?
Avatar billede driis Nybegynder
27. september 2005 - 19:34 #2
og key kan du erklære som

private byte [] key = null;

Idet den sættes senere i koden.
Avatar billede cdull Nybegynder
27. september 2005 - 19:42 #3
Ja noget i den stil.
Så langt så godt :)

Får nu denne fejl.
Specified key is not a valid size for this algorithm.
Line 41:         CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(key, IV),CryptoStreamMode.Write);

jeg har lidt på fornemmelsen at det drejer sig om det sidste tal her, som angiver længden af den key som jeg sender til klassen. Hvordan får jeg den med i C# koden.
Prøvede at skrive det som det var i VB, men left() findes åbenbart ikke i C#

key = System.Text.Encoding.UTF8.GetBytes(Left(SEncryptionKey, 8))
Avatar billede cdull Nybegynder
27. september 2005 - 19:43 #4
I C# har jeg skrevet det sådan her.

key = System.Text.Encoding.UTF8.GetBytes(SEncryptionKey);

her ligger fejlen vil jeg mene.
Avatar billede arne_v Ekspert
27. september 2005 - 19:54 #5
prøv:

key = System.Text.Encoding.UTF8.GetBytes(SEncryptionKey.Substring(0, 8));
Avatar billede arne_v Ekspert
27. september 2005 - 19:57 #6
et simpelt eksempel (som dog er lidt anderleds end din kode):

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

class MainClass
{
    public static void Main(string[] args)
    {
        Encoding utf = new UTF8Encoding();
        DES des = new DESCryptoServiceProvider();
        byte[] key = utf.GetBytes("hemmelig");
        byte[] iv = { 1, 2, 3, 4, 5, 6, 7, 8 };
        ICryptoTransform encrypt = des.CreateEncryptor(key, iv);
        string plain = "Dette er en lille test";
        Console.WriteLine(plain);
        byte[] cipher = encrypt.TransformFinalBlock(utf.GetBytes(plain), 0, utf.GetByteCount(plain));
        string cipherb64 = Convert.ToBase64String(cipher);
        Console.WriteLine(cipherb64);
        ICryptoTransform decrypt = des.CreateDecryptor(key, iv);
        byte[] cipher2 = Convert.FromBase64String(cipherb64);
        string plain2 = utf.GetString(decrypt.TransformFinalBlock(cipher2, 0, cipher.Length));
        Console.WriteLine(plain2);
    }
}
Avatar billede cdull Nybegynder
27. september 2005 - 20:02 #7
Jeg får stadigvæk samme fejl.
Avatar billede driis Nybegynder
27. september 2005 - 20:22 #8
Prøv:
key = System.Text.Encoding.UTF8.GetBytes(SEncryptionKey.Substring(0, 7));
IDet du skal bruge 8 bytes.
I øvrigt er det nok mere fornuftigt at bruge System.Text.Encoding.ASCII; idet du risikerer at et af tegnene i UTF8 fylder mere end én byte.
Avatar billede arne_v Ekspert
27. september 2005 - 20:25 #9
andet argument til Substring er antal tegn
Avatar billede driis Nybegynder
27. september 2005 - 20:30 #10
... du har ret, der jeg var for hurtig

cdull >> prøv med ASCII encoding, idet du risikerer at GetBytes på en 8 karakter lang streng i UTF8 encoding returnerer mere end 8 bytes.
Avatar billede cdull Nybegynder
27. september 2005 - 21:27 #11
har prøvet at lave en klasse udfra dit eksempel ArneV.
Men får fejlen.
Invalid length for a Base-64 char array.
Line 33: byte[] cipher2 = Convert.FromBase64String(plain2);


class MainClass
{
   
    public string Crypt(string plain)
    {
        Encoding utf = new UTF8Encoding();
        DES des = new DESCryptoServiceProvider();
        byte[] key = utf.GetBytes("hemmelig");
        byte[] iv = { 1, 2, 3, 4, 5, 6, 7, 8 };
       
        ICryptoTransform encrypt = des.CreateEncryptor(key, iv);
        byte[] cipher = encrypt.TransformFinalBlock(utf.GetBytes(plain), 0, utf.GetByteCount(plain));
        return Convert.ToBase64String(cipher);
       
       
        /*ICryptoTransform decrypt = des.CreateDecryptor(key, iv);
        byte[] cipher2 = Convert.FromBase64String(cipherb64);
        string plain2 = utf.GetString(decrypt.TransformFinalBlock(cipher2, 0, cipher.Length));
        Console.WriteLine(plain2);*/
    }
    public string Decrypt(string plain2)
    {
        Encoding utf = new UTF8Encoding();
        DES des = new DESCryptoServiceProvider();
        byte[] key = utf.GetBytes("hemmelig");
        byte[] iv = { 1, 2, 3, 4, 5, 6, 7, 8 };

        ICryptoTransform decrypt = des.CreateDecryptor(key, iv);
        byte[] cipher2 = Convert.FromBase64String(plain2);
        return utf.GetString(decrypt.TransformFinalBlock(cipher2, 0, cipher2.Length));
       
    }
Avatar billede arne_v Ekspert
27. september 2005 - 21:35 #12
det virker fint hos mig

komplet eksempel:

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

namespace E
{
    public class DESUtil
    {
        public static string Crypt(string plain)
        {
            Encoding utf = new UTF8Encoding();
            DES des = new DESCryptoServiceProvider();
            byte[] key = utf.GetBytes("hemmelig");
            byte[] iv = { 1, 2, 3, 4, 5, 6, 7, 8 };
            ICryptoTransform encrypt = des.CreateEncryptor(key, iv);
            byte[] cipher = encrypt.TransformFinalBlock(utf.GetBytes(plain), 0, utf.GetByteCount(plain));
            return Convert.ToBase64String(cipher);
        }
        public static string Decrypt(string plain2)
        {
            Encoding utf = new UTF8Encoding();
            DES des = new DESCryptoServiceProvider();
            byte[] key = utf.GetBytes("hemmelig");
            byte[] iv = { 1, 2, 3, 4, 5, 6, 7, 8 };
            ICryptoTransform decrypt = des.CreateDecryptor(key, iv);
            byte[] cipher2 = Convert.FromBase64String(plain2);
            return utf.GetString(decrypt.TransformFinalBlock(cipher2, 0, cipher2.Length));
        }
    }
    class MainClass
    {
        public static void Main(string[] args)
        {
            string s1 = "Dette er en lille test";
            string s2 = DESUtil.Crypt(s1);
            string s3 = DESUtil.Decrypt(s2);
            Console.WriteLine(s1 + "->" + s2 + "->" + s3);
        }
    }
}
Avatar billede cdull Nybegynder
27. september 2005 - 21:42 #13
Virker  stadig ikke.
Meget mystisk. Som om den ikke kan tage den streng som skal dekrypteres.
Avatar billede arne_v Ekspert
28. september 2005 - 19:31 #14
kan du køre min kode ovenfor på din maskine ?
Avatar billede cdull Nybegynder
28. september 2005 - 21:00 #15
Nu virker det. Mange tak Arne.
Jeg prøvede din consolekode, og det virkede. Så det måtte være noget jeg lavede.
Debuggede koden og fandt så ud af at jeg smed den kyrpterede kode i en label, når jeg så ville køre koden til at dekryptere havde labellen fået sin standardværdi som i mit tilfælde var null. Null indeholder jo ikke den der key som klassen skal bruge for at dekrypte, derfor meldede den om fejl.
Til andre med problemer, husk 3 gyldne regler. Debug, Eksperten og når alt andet ikke hjælper ArneV.

Ps. Arne, kan se at du er en meget dygtig og erfaren udvikler, har du nogle fifs, evt områder som du ville mene ville være en god ting at specialisere sig i for en ung uerfaren programmør?

Endnu engang tak, Smid lige et svar.
Avatar billede arne_v Ekspert
28. september 2005 - 21:36 #16
svar
Avatar billede arne_v Ekspert
28. september 2005 - 21:46 #17
et godt råd til en nyuddannet (datamatiker/dataingeniør/datalog/whatever) som
skal ud og have job:

koncentrer på de mere hårde discipliner

vær rigtig god til flere af de store programmerings sprog: Java, C#, C++, C, Delphi,
VB, Cobol, Fortran, PL/I

vær rigtig god til generel SQL (uden at specialisere dig i en bestemt database)

hav godt styr på basale objektorienterede principper (ikke static versus static,
virtual versus ikke virtual og den slags)

kend mindst et andet styre system end Windows godt nok til at du kan arbejde på det

sælg dig på at du kan de ting men lad være med at sælge dig som verdensmester i alt

sats ikke på de bløde discipliner (brugervenlige UI, krav specifikation,
udviklings metodikker, HTML/JavaScript/PHP/ASP og lignende web teknologier) - den
slags forventer de at du bare kan lære hvis der er brug for det

og undlad at gøre dig til ekspert i arkitektur eller projekt ledelse - den
slags kræver erfaring
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