27. september 2005 - 19:29Der 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
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#
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.
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 };
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?
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
Synes godt om
Ny brugerNybegynder
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.