[C#] String replace: Karakter per karakter vervangen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dames en heren,

Sinds kort begonnen met het bestuderen van nieuwe ontwikkel talen, ben nu bezig met C# voor websites.
Heb nu 1,5 week flink geoefend in deze taal en ben nu bezig met een simpele studie opdracht.

Voor deze opdracht moet ik een C# encrypter en decrypter maken voor het versleutelen van bepaalde gegevens.
Alvorens ik de informatie in de Encrypter gooi wil ik graag nog enkele handelingen verrichten, 1 daarvan is om elke karakter in de gegeven string te vervangen met het een andere karakter. Hiervoor heb ik simpelweg twee arrays gemaakt waarvan de eerste het alfabet van A-Z is en de tweede is Z-A:
C#:
1
2
string[] abc = { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"};
string[] cba = { "z", "y", "x", "w", "v", "u", "t", "s", "r", "q", "p", "o", "n", "m", "l", "k", "j", "i", "h", "g", "f", "e", "d", "c", "b", "a", };


Wat ik wil bereiken is dat de gegeven string wordt opgedeeld, per karakter, en dat in een array wordt geplaatst. Dit array wordt uitgelezen en doormiddel van de replace functie worden de karakters omgegooid. Na dit proces wil ik dat de array gegevens weer aan elkaar worden geplakt zodat ik weer 1 string terug krijg. Hierna kan ik deze string in de encrypter gooien.

Het proces in het kort:
string "appels" gaat de functie in en string "zkkvos" komt eruit.
Reden dat ik het hier vraag: ik kan de hele string afgaan en vervangen maar omdat ik de string niet opdeel krijg ik waardes die ik niet meer kan terugkeren:
"appels" wordt "zzkvos" o.i.d.

Ik sta open voor verbeteringen in elk opzicht, aangezien ik nog een beginneling ben op dit gebied. Ik zal vast wel een bepaalde functie over het hoofd zien of ik zal wellicht teveel handelingen laten uitvoeren voor iets wat veel makkelijker kan. Echter is het wel een must dat deze handeling wordt uitgevoerd alvorens het de encrypter in gaat!!!

Mvg,
Roberto

Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 18:32

gorgi_19

Kruimeltjes zijn weer op :9

Zet het in een dictionary, maak van de tekst een char array en loop deze een voor een af met de corresponderende waarde en zet deze achtereenvolgens in een stringbuilder?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

  • ValHallASW
  • Registratie: Februari 2003
  • Niet online
Oh nee, er is geen standaardfunctie die doet wat ik wil, wat nu?!

Nou, zelf implementeren. Bedenk eens wat de replace-functie doet en implementeer dat. Vervolgens is het vrij evident wat je moet doen om het genoemde probleem te omzeilen.

Acties:
  • 0 Henk 'm!

  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 17:23
Ik snap je probleem niet.

Je encrypt en decrypt functie kunnen trouwens hetzelfde zijn.

encrypt(encrypt("appels")) levert ook weer "appels" op.

[ Voor 4% gewijzigd door Jaap-Jan op 04-02-2010 15:07 ]

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 20:07

MBV

Dat is een vrij triviale eigenschap van ROT13 encoding ;)

@TS: zoek eens op ROT13 C# met google, dan zie je hoe anderen het hebben gedaan. Begin gewoon eens met karakter-voor-karakter, als je het zelf niet doet moet een of andere library het net zo goed doen :)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
gorgi_19 schreef op donderdag 04 februari 2010 @ 15:06:
Zet het in een dictionary, maak van de tekst een char array...
Ik had indd al wat gelezen over char array, echter ben ik zo ver gekomen dat ik enkel woorden in een array geplaatst krijgt omdat de seperator op specifieke karakters staan. dus de output hiervan was enkel:
charArray[0] = 'appels'.
ipc
charArray[0] = 'a'.
gorgi_19 schreef op donderdag 04 februari 2010 @ 15:06:
en loop deze een voor een af met de corresponderende waarde...
Ik heb een mooie foreach lus gemaakt die dit voor mij kan afhandelen met de twee arrays in mijn startpost.
gorgi_19 schreef op donderdag 04 februari 2010 @ 15:06:
en zet deze achtereenvolgens in een stringbuilder?
Dit zal ik nog uitzoeken! Thanks for the tip!
ValHallASW schreef op donderdag 04 februari 2010 @ 15:07:
Oh nee, er is geen standaardfunctie die doet wat ik wil, wat nu?!

Nou, zelf implementeren. Bedenk eens wat de replace-functie doet en implementeer dat. Vervolgens is het vrij evident wat je moet doen om het genoemde probleem te omzeilen.
Bedankt voor je opbouwende kritiek! Echter heb ik, zoals ik al aangaf, weinig ervaring met deze taal, ik ben het dus ook nog aan het leren. Ik heb verschillende methodes geprobeerd en uitgedacht en tot de conclusie gekomen dat ik er niet zelf kan uitkomen. Ik snap zelf het principe van programmeren wel, wat er niet is kan je lekker zelf maken. Ik programmeer al langere tijd in PHP en daar had ik dit probleem al duizend keer getackeld! Denk eens terug naar de tijd dat je dit zelf niet kon.... ;).
Jaap-Jan schreef op donderdag 04 februari 2010 @ 15:07:
Ik snap je probleem niet.

Je encrypt en decrypt functie kunnen trouwens hetzelfde zijn.

encrypt(encrypt("appels")) levert ook weer "appels" op.
Mijn probleem:
het vervangen van de karakters (a met z, b met y, c met x, etc etc) lukt me wel. Echter wanneer ik dit in een string zou doen met bijvoorbeeld de tekst 'azerty' dan zou de output niet meer omgedraaid kunnen worden. De A wordt namelijk een Z. Daarna wordt de Z weer veranderd in A wat de orginele waarde is. Maar met het terugdraaien van de output krijg ik niet meer de input want dan zou ik ipv 'azerty' iets terug krijgen wat begint met een Z ipv A.

Tevens staat deze functie los van het encrypten en decrypten, dat is een ander proces :). mijn opdracht:
string manipulatie => string omdraaien,
string manipulatie => karakters veranderen,
string manipulatie = > string encrypten,

alles moet terug gedraaid kunnen worden.

[ Voor 5% gewijzigd door Verwijderd op 04-02-2010 15:51 . Reden: omdat het nodig was.. ]


Acties:
  • 0 Henk 'm!

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 23:59

TeeDee

CQB 241

@MBV: Dit is toch geen ROT13? Tenminste, niet zoals TS het wil.

[ Voor 5% gewijzigd door TeeDee op 04-02-2010 15:48 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
MBV schreef op donderdag 04 februari 2010 @ 15:42:
Dat is een vrij triviale eigenschap van ROT13 encoding ;)

@TS: zoek eens op ROT13 C# met google, dan zie je hoe anderen het hebben gedaan. Begin gewoon eens met karakter-voor-karakter, als je het zelf niet doet moet een of andere library het net zo goed doen :)
WOW! Dit is brilliant! En ik maar moeilijk doen. Hartstikke bedankt voor deze tip!

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
TeeDee schreef op donderdag 04 februari 2010 @ 15:47:
@MBV: Dit is toch geen ROT13? Tenminste, niet zoals TS het wil.
Eigenlijk, hij heeft gelijk. Maar aangezien ROT13 wel een vooraf gedefinieerde methodiek hanteert is het mogelijk om dit ook weer terug te draaien, dus dit is een goed alternatief. Echter ben ik nog wel benieuwd naar hoe ik mijn voorgestelde methodiek kan bereiken.

Acties:
  • 0 Henk 'm!

  • BM
  • Registratie: September 2001
  • Laatst online: 20:37

BM

Moderator Spielerij
Als je het toch met die 2 arrays wilt oplossen, zou het volgende toch moeten werken?

Loop door alle karakters van je string heen. Zoek de index van dat karakter op in array1, zoek vervolgens in array2 op welk karakter op die plek staat, en voeg dat toe aan een nieuwe string.
De nieuwe string die je hebt als je door alle karakters heen bent is je uitkomt.

Omkeren is hetzelfde proces nog een keer doen, maar dan met de waarde die je wilt ontcijferen.

Xbox
Even the dark has a silver lining | I'm all you can imagine times infinity, times three


Acties:
  • 0 Henk 'm!

  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 17:23
Als ik het goed begrijp, is je vraag dus hoe je een nieuwe string kunt maken, je kunt de individuele karakters wel omdraaien, maar je weet niet hoe je er een nieuwe string van kunt maken. Kijk dan eens naar StringBuilder.

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Naar de implementaties van ROT13 kijken lijkt me een goed idee. :)
Verwijderd schreef op donderdag 04 februari 2010 @ 15:01:
string "appels" gaat de functie in en string "zkkvos" komt eruit.
Dat lijkt mij een gekke functie, bedoel je niet "zkkvoh"? Hier is een functie om te testen:
C#:
1
2
3
4
5
6
        static string EncryptTest(string s)
        {
            return new String(s.ToCharArray().Select(
                a => a >= 'a' && a <= 'z' ? (char)(219 - a) : a
                ).ToArray());
        }

Dit is niet de functie die je moet gaan inleveren natuurlijk, of je gaat er vragen over krijgen. ;) Voor je implementatie, die totaal anders gaat zijn, kun je beter met een StringBuilder aan de gang. :)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Hydra
  • Registratie: September 2000
  • Laatst online: 21-08 17:09
Verwijderd schreef op donderdag 04 februari 2010 @ 15:52:
WOW! Dit is brilliant! En ik maar moeilijk doen. Hartstikke bedankt voor deze tip!
Nee, sorry maar dat is gewoon dom. Want zo kijk je het af en copy-paste je een oplossing in plaats van zelf het denkproces te doorlopen. Dat is de hele bedoeling van deze (triviale) oefening. Ik raad je sterk aan om te proberen zelf oplossingen te bedenken.

https://niels.nu


Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 20:07

MBV

TeeDee schreef op donderdag 04 februari 2010 @ 15:47:
@MBV: Dit is toch geen ROT13? Tenminste, niet zoals TS het wil.
Nee, maar het is wel een vergelijkbare 'encryptie' (die in 1 minuut te hacken is, wat voor string replacement je ook doet).

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hydra schreef op donderdag 04 februari 2010 @ 16:04:
[...]


Nee, sorry maar dat is gewoon dom. Want zo kijk je het af en copy-paste je een oplossing in plaats van zelf het denkproces te doorlopen. Dat is de hele bedoeling van deze (triviale) oefening. Ik raad je sterk aan om te proberen zelf oplossingen te bedenken.
Je hebt helemaal gelijk!! Maar daarom dat ik ook heb gepost dat ik alsnog op zoek ben naar de oplossing voor mijn probleem.
Jaap-Jan schreef op donderdag 04 februari 2010 @ 15:58:
Als ik het goed begrijp, is je vraag dus hoe je een nieuwe string kunt maken, je kunt de individuele karakters wel omdraaien, maar je weet niet hoe je er een nieuwe string van kunt maken. Kijk dan eens naar StringBuilder.
Ja hier heeft een andere tweaker ook al naar verwezen, hier ga ik indd ook nog naar kijken! En dat was niet eens mijn grote probleem, het is eerder die transformatie per karakter waar ik moeite mee heb. Alsnog bedankt! Ben erg blij met alle input van iedereen!
MBV schreef op donderdag 04 februari 2010 @ 16:06:
[...]

Nee, maar het is wel een vergelijkbare 'encryptie' (die in 1 minuut te hacken is, wat voor string replacement je ook doet).
Ik ga de ROT13 methode niet gebruiken, ik heb opgevat dat dit erg makkelijk terug te draaien is.


Het doel van deze tussenstap is dat wanneer een waarde gedecrypt wordt je alsnog 2 handelingen dient uit te voeren alvorens je de orginele waarde te pakken hebt. Ik heb gekozen voor het omdraaien van het alfabet omdat, in mijn ogen, dit niet enorm voor de hand ligt. Ik acht het nivo van mijn docenten niet hoog genoeg om daar achter te komen.
pedorus schreef op donderdag 04 februari 2010 @ 16:00:
Naar de implementaties van ROT13 kijken lijkt me een goed idee. :)

[...]

Dat lijkt mij een gekke functie, bedoel je niet "zkkvoh"? Hier is een functie om te testen:
C#:
1
2
3
4
5
6
        static string EncryptTest(string s)
        {
            return new String(s.ToCharArray().Select(
                a => a >= 'a' && a <= 'z' ? (char)(219 - a) : a
                ).ToArray());
        }

Dit is niet de functie die je moet gaan inleveren natuurlijk, of je gaat er vragen over krijgen. ;) Voor je implementatie, die totaal anders gaat zijn, kun je beter met een StringBuilder aan de gang. :)
Je hebt gelijk, ik heb een tik foutje gemaakt denk ik...maar goed, die functie doet wat ik wil, maar waarom zou ik dat niet kunnen gebruiken ? De output is een array, maar dat kan ik doormiddel van de stringbuilder toch casten ?

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Verwijderd schreef op donderdag 04 februari 2010 @ 16:18:
[...]
Ik ga de ROT13 methode niet gebruiken, ik heb opgevat dat dit erg makkelijk terug te draaien is.
Net zoals elk willekeurig eigen "slim" algoritme je zelf bedenkt ;)

Het is misschien een leuke oefening om programmeren onder de knie te krijgen, en dus zeker leuk om te doen, maar als het echt om veiligheid van data gaat moet je gewoon een bestaand en bewezen algoritme gebruiken.

[ Voor 3% gewijzigd door Woy op 04-02-2010 16:23 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Woy schreef op donderdag 04 februari 2010 @ 16:22:
[...]

Net zoals elk willekeurig eigen "slim" algoritme je zelf bedenkt ;)

Het is misschien een leuke oefening om programmeren onder de knie te krijgen, en dus zeker leuk om te doen, maar als het echt om veiligheid van data gaat moet je gewoon een bestaand en bewezen algoritme gebruiken.
Ik beschouw dit ook als leuke oefening ;) Ik ben, zoals vermeld, nog maar 1,5 week bekend met deze taal :).

Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 20:07

MBV

Jouw methode is net zo makkelijk om te draaien als ROT13, dat is wat ik bedoelde. ROT13 en omdraaien zijn de 2 simpelste, maar elke willekeurige mapping van karakter X naar karakter Y is met moderne software in een paar minuten om te draaien (als je de bron-taal weet). Dus ook al gebruik je karakters in een willekeurige volgorde in cba, dan nog kan je het oorspronkelijke bericht heel snel traceren (als die lang genoeg is en in een bekende taal): Wikipedia: Frequency analysis

Alhoewel: nu ik nog eens kijk, is het toch minstens zo veilig als 3x ROT13 :+

[ Voor 6% gewijzigd door MBV op 04-02-2010 16:40 ]


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
MBV schreef op donderdag 04 februari 2010 @ 16:39:
Alhoewel: nu ik nog eens kijk, is het toch minstens zo veilig als 3x ROT13 :+
Ik zou zeggen, minstens zo veilig als 5 x ROT13 :+

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Wouter.S
  • Registratie: Maart 2009
  • Laatst online: 15-09 18:37

Wouter.S

e^(i*pi ) +1 = 0

Verwijderd schreef op donderdag 04 februari 2010 @ 16:18:
Ik heb gekozen voor het omdraaien van het alfabet omdat, in mijn ogen, dit niet enorm voor de hand ligt. Ik acht het nivo van mijn docenten niet hoog genoeg om daar achter te komen.
Niet slecht bedoeld hoor maar het omkeren van het alfabet is in mijn ogen één van de meest basic coderingsmechanismen. Julius Ceasar maakt al gebruik van een dergelijk mechanisme om boodschappen te coderen. Als je toch karakters wilt wisselen zorg dan eerder voor een volledige random verwisseling. Randomnize je tweede string volledig. Het implementatieproces is exact hetzelfde maar het is net iets moeilijker te doorzien dan gewoon achterstevoren.

Any intelligent fool can make things bigger, more complex, and more violent. It takes a touch of genius -- and a lot of courage -- to move in the opposite direction.


Acties:
  • 0 Henk 'm!

  • Hydra
  • Registratie: September 2000
  • Laatst online: 21-08 17:09
Woy schreef op donderdag 04 februari 2010 @ 16:44:
Ik zou zeggen, minstens zo veilig als 5 x ROT13 :+
Stukken veiliger dan 10x ROT26 idd.
MBV schreef op donderdag 04 februari 2010 @ 16:39:
Jouw methode is net zo makkelijk om te draaien als ROT13, dat is wat ik bedoelde. ROT13 en omdraaien zijn de 2 simpelste, maar elke willekeurige mapping van karakter X naar karakter Y is met moderne software in een paar minuten om te draaien (als je de bron-taal weet). Dus ook al gebruik je karakters in een willekeurige volgorde in cba, dan nog kan je het oorspronkelijke bericht heel snel traceren (als die lang genoeg is en in een bekende taal): Wikipedia: Frequency analysis

Alhoewel: nu ik nog eens kijk, is het toch minstens zo veilig als 3x ROT13 :+
Sterker nog: in dit soort simpele gevallen kun je het zelfs gewoon met de hand en de blote hersentjes doen.

Maargoed, encryptiemethodes bedenken is sowieso leuk ;)

[ Voor 69% gewijzigd door Hydra op 04-02-2010 16:55 ]

https://niels.nu


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Wouter.S schreef op donderdag 04 februari 2010 @ 16:50:
[...]


Niet slecht bedoeld hoor maar het omkeren van het alfabet is in mijn ogen één van de meest basic coderingsmechanismen. Julius Ceasar maakt al gebruik van een dergelijk mechanisme om boodschappen te coderen. Als je toch karakters wilt wisselen zorg dan eerder voor een volledige random verwisseling. Randomnize je tweede string volledig. Het implementatieproces is exact hetzelfde maar het is net iets moeilijker te doorzien dan gewoon achterstevoren.
Dus eigenlijk zou ik dus gebruik moeten maken van een ROT13 methode maar dan ipv 13 plaatsen opzij te gaan dan het x aantal plaatsen opzij gaan doormiddel van een random seed? Zolang je die sleutel niet hebt kan je niet terugkoppelen?

Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 20:07

MBV

kijk eens naar die wikipedialink die ik je net heb gegeven. X plaatsen roteren kost maar 1 minuut werk: zoek welk teken het meeste wordt gebruikt, dat is in het Nederlands en Engels geheid de 'e'. Als het C-code is, zijn er 2 tekens die even vaak (en samen het meest) voorkomen: { en } (mocht je hem uitbreiden naar speciale tekens).
De enige methode die je niet uit je hoofd kan kraken is met willekeurige tekens, daarvoor moet je brute-forcen (geholpen met de statistiek) totdat je spell-checker zo min mogelijk fouten vindt. Wil je het echt veilig hebben, dan moet je een echt encryptie-algoritme gebruiken als AES of Blowfish.

Dat neemt allemaal niet weg dat je het prima als huiswerkopdracht kan zien om eens die taal te leren kennen. Beschouw het alleen niet als veilig.

[ Voor 3% gewijzigd door MBV op 04-02-2010 17:16 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hieronder een brakkig voorbeeld van wat ik probeer te bereiken. Heb deze code niet getest aangezien ik dit gewoon even snel heb getikt. Dit is meer ter illustratie.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
public string replaceChar(string str) {
        string[] abc = { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };
        string[] cba = { "z", "y", "x", "w", "v", "u", "t", "s", "r", "q", "p", "o", "n", "m", "l", "k", "j", "i", "h", "g", "f", "e", "d", "c", "b", "a", "9", "8", "7", "6", "5", "4", "3", "2", "1", "0" };
        string newstring = "";
        int i=0;
        foreach (string symbol in abc)
        {
            newstring = str.Replace(symbol, cba[i]);
            i++;
        }
        return newstring;
    }

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
MBV schreef op donderdag 04 februari 2010 @ 17:15:
kijk eens naar die wikipedialink die ik je net heb gegeven. X plaatsen roteren kost maar 1 minuut werk: zoek welk teken het meeste wordt gebruikt, dat is in het Nederlands en Engels geheid de 'e'. Als het C-code is, zijn er 2 tekens die even vaak (en samen het meest) voorkomen: { en } (mocht je hem uitbreiden naar speciale tekens).
De enige methode die je niet uit je hoofd kan kraken is met willekeurige tekens, daarvoor moet je brute-forcen (geholpen met de statistiek) totdat je spell-checker zo min mogelijk fouten vindt. Wil je het echt veilig hebben, dan moet je een echt encryptie-algoritme gebruiken als AES of Blowfish.

Dat neemt allemaal niet weg dat je het prima als huiswerkopdracht kan zien om eens die taal te leren kennen. Beschouw het alleen niet als veilig.
Ik zal bij thuiskomst die wikilink eens goed bestuderen! Thanks!

Enne deze functie is een stap voor het encrypten. De functie voro het encrypten en decrypten is als volgt:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
// Encrypt input string
    public static string Encrypt(string toEncrypt, bool useHashing)
    {
        byte[] keyArray;
        byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt);

        System.Configuration.AppSettingsReader settingsReader =
                                            new AppSettingsReader();
        // Get the key from config file

        string key = (string)settingsReader.GetValue("SecurityKey",
                                                         typeof(String));
        //System.Windows.Forms.MessageBox.Show(key);
        //If hashing use get hashcode regards to your key
        if (useHashing)
        {
            MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
            keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
            //Always release the resources and flush data
            // of the Cryptographic service provide. Best Practice

            hashmd5.Clear();
        }
        else
            keyArray = UTF8Encoding.UTF8.GetBytes(key);

        TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
        //set the secret key for the tripleDES algorithm
        tdes.Key = keyArray;
        //mode of operation. there are other 4 modes.
        //We choose ECB(Electronic code Book)
        tdes.Mode = CipherMode.ECB;
        //padding mode(if any extra byte added)

        tdes.Padding = PaddingMode.PKCS7;

        ICryptoTransform cTransform = tdes.CreateEncryptor();
        //transform the specified region of bytes array to resultArray
        byte[] resultArray =
          cTransform.TransformFinalBlock(toEncryptArray, 0,
          toEncryptArray.Length);
        //Release resources held by TripleDes Encryptor
        tdes.Clear();
        //Return the encrypted data into unreadable string format
        return Convert.ToBase64String(resultArray, 0, resultArray.Length);
    }
    // decrypt input to string
    public static string Decrypt(string cipherString, bool useHashing)
    {
        byte[] keyArray;
        //get the byte code of the string

        byte[] toEncryptArray = Convert.FromBase64String(cipherString);

        System.Configuration.AppSettingsReader settingsReader =
                                            new AppSettingsReader();
        //Get your key from config file to open the lock!
        string key = (string)settingsReader.GetValue("SecurityKey",
                                                     typeof(String));

        if (useHashing)
        {
            //if hashing was used get the hash code with regards to your key
            MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
            keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
            //release any resource held by the MD5CryptoServiceProvider

            hashmd5.Clear();
        }
        else
        {
            //if hashing was not implemented get the byte code of the key
            keyArray = UTF8Encoding.UTF8.GetBytes(key);
        }

        TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
        //set the secret key for the tripleDES algorithm
        tdes.Key = keyArray;
        //mode of operation. there are other 4 modes. 
        //We choose ECB(Electronic code Book)

        tdes.Mode = CipherMode.ECB;
        //padding mode(if any extra byte added)
        tdes.Padding = PaddingMode.PKCS7;

        ICryptoTransform cTransform = tdes.CreateDecryptor();
        byte[] resultArray = cTransform.TransformFinalBlock(
                             toEncryptArray, 0, toEncryptArray.Length);
        //Release resources held by TripleDes Encryptor                
        tdes.Clear();
        //return the Clear decrypted TEXT
        return UTF8Encoding.UTF8.GetString(resultArray);
    }

Acties:
  • 0 Henk 'm!

Verwijderd

wat je wellicht ook kan doen is karakter voor karakter door je tekst heen gaan met een foreach en een teller. en dan str.Remove en str.Insert gebruiken

tweede optie is gaan voor leestekens (dingen die niet veel voorkomen) en die daarna weer omzetten naar karakters. het is misschien een simpele oplossing maar het zou best goed kunnen werken. let dan wel op veelvoorkomende leestekens als '.' en ','

Acties:
  • 0 Henk 'm!

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 08-09 11:33
Als dit gewoon is om een beetje te knoeien met C#, prima, mooi even oefenen met strings. (Wel zou ik de StringBuilder gebruiken en van de string een char[] maken zodat je iets krijgt als

C#:
1
2
3
4
5
6
7
8
Dictionary<char, char> encoding; //invullen met je data
StringBuilder sb = new StringBuilder();
string input = "hallo wereld";
char[] a =  input.ToCharArray();
for(int i = 0; i < a.length; ++i)
{
    sb.Append(encoding[a[i]]);
}


Dat gaat waarschijnlijk een stuk rapper dan wat je nu doet.


Als dit een semi-serieuze manier is om data te beveilingen dan ga je nu echt verkeerd :). Kijk dan naar de door het .net framework aangeboden encrypters en decrypters :).

~ Mijn prog blog!


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
MBV schreef op donderdag 04 februari 2010 @ 17:15:
De enige methode die je niet uit je hoofd kan kraken is met willekeurige tekens, daarvoor moet je brute-forcen (geholpen met de statistiek) totdat je spell-checker zo min mogelijk fouten vindt.
Ook met random characters is het erg makkelijk te kraken door middel van frequentie analyse. Een simpel subsitutie algoritme is gewoon niet veilig, maar daar waren we al uit. Een iets veiliger manier van substitutie is iets als een Vigenère cypher ( Wikipedia: Vigenèrecijfer ).
Verwijderd schreef op donderdag 04 februari 2010 @ 17:19:
[...]
Enne deze functie is een stap voor het encrypten. De functie voro het encrypten en decrypten is als volgt:
Een stap voor je encryptie heeft niet zo veel nut, en kan het potentieel zelfs minder veilig maken.

Voor security is het sowieso een goed uitgangspunt om er gewoon van uit te gaan dat een potentiele aanvaller je algoritme heeft, en dat alleen de eventuele key geheim is ( Bij een one-way functie hoeft die niet te bestaan natuurlijk )

[ Voor 30% gewijzigd door Woy op 05-02-2010 09:17 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op donderdag 04 februari 2010 @ 17:25:
wat je wellicht ook kan doen is karakter voor karakter door je tekst heen gaan met een foreach en een teller. en dan str.Remove en str.Insert gebruiken

tweede optie is gaan voor leestekens (dingen die niet veel voorkomen) en die daarna weer omzetten naar karakters. het is misschien een simpele oplossing maar het zou best goed kunnen werken. let dan wel op veelvoorkomende leestekens als '.' en ','
Ik dacht dat dat juist meer handelingen zouden zijn aangezien ik dan, gebaseerd op die teller, de index van het karakter dien te vinden, daarna deze weer door 2 arrays te halen om de juiste karakter te vervangen met de tegenstrijdige variant ervan en daarna weer terug te plaatsen...of zie ik dat verkeerd?
roy-t schreef op donderdag 04 februari 2010 @ 17:49:
Als dit gewoon is om een beetje te knoeien met C#, prima, mooi even oefenen met strings. (Wel zou ik de StringBuilder gebruiken en van de string een char[] maken zodat je iets krijgt als

C#:
1
2
3
4
5
6
7
8
Dictionary<char, char> encoding; //invullen met je data
StringBuilder sb = new StringBuilder();
string input = "hallo wereld";
char[] a =  input.ToCharArray();
for(int i = 0; i < a.length; ++i)
{
    sb.Append(encoding[a[i]]);
}


Dat gaat waarschijnlijk een stuk rapper dan wat je nu doet.


Als dit een semi-serieuze manier is om data te beveilingen dan ga je nu echt verkeerd :). Kijk dan naar de door het .net framework aangeboden encrypters en decrypters :).
Ja dit is geen semi-serieuze manier om data te beveiligen, dit is gewoon oefening voor mij om bekend te raken, dus string manipulatie. ;). Ik zal dit toepassen in mijn project kijken of ik de gewenste output kan genereren. Indien hetgeen wat ik wil gewoon niet te bereiken is zal ik een andere methode verzinnen (zat al te kijken naar random seed generator in combinatie met hex en base64.


En
Woy schreef op vrijdag 05 februari 2010 @ 09:15:
[...]

Ook met random characters is het erg makkelijk te kraken door middel van frequentie analyse. Een simpel subsitutie algoritme is gewoon niet veilig, maar daar waren we al uit. Een iets veiliger manier van substitutie is iets als een Vigenère cypher ( Wikipedia: Vigenèrecijfer ).

[...]

Een stap voor je encryptie heeft niet zo veel nut, en kan het potentieel zelfs minder veilig maken.

Voor security is het sowieso een goed uitgangspunt om er gewoon van uit te gaan dat een potentiele aanvaller je algoritme heeft, en dat alleen de eventuele key geheim is ( Bij een one-way functie hoeft die niet te bestaan natuurlijk )
Onveiliger maken ? Ik dacht dat wanneer ik de string omdraaide en vervolgens de karakters wijzigde via een standaard methodiek (wat weer omgedraaid kan worden) dat dit toch geen gevolgen heeft voor het encrypten? want stel dat ik dezelfde gegenereerde output in de encrypter zou stoppen zonder de vernoemde handelingen van te voren uit te voeren, dan is dit toch ook niet minder veilig ? En het is een two-way functie, het gaat hier om het versleutelen van minimaal 3 waardes voor een SQL verbinding:
  1. User ID,
  2. Password,
  3. Server,
Hier wordt dan een connectionString van gemaakt voor de applicatie.

Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 20:07

MBV

In dit geval niet nee, maar er zijn aardig wat gevallen bekend van mensen die iets veiliger wilden maken door 2 encrypties achter elkaar te zetten, waardoor het triviaal werd om te decrypten.

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Verwijderd schreef op donderdag 04 februari 2010 @ 17:16:
Hieronder een brakkig voorbeeld van wat ik probeer te bereiken. Heb deze code niet getest aangezien ik dit gewoon even snel heb getikt. Dit is meer ter illustratie.
Er zit een redelijk ernstige denkfout in de code die je hier post, probeer hem zelf maar eens te achterhalen...

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Grijze Vos schreef op vrijdag 05 februari 2010 @ 12:47:
[...]


Er zit een redelijk ernstige denkfout in de code die je hier post, probeer hem zelf maar eens te achterhalen...
Ja ik denk dat ik weet waar je op doelt: newstring kan niet opnieuw gedeclareerd worden in deze context. Of bedoel je dat niet / sla ik de plank totaal mis ? Zoals aangegeven, deze code is niet gecompiled maar ter illustratie van wat ik wil bereiken ;).

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Nee, ik heb het over je algoritme concept, niet over eventuele compiler issues.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

Heb je het over dat string replace algo? (Verwijderd in "\[C#] String replace: Karakter per karakt...")
.edit: euh ja dus, je quote 'm zelfs 8)7
Maar idd, dat is niet helemaal goed uitgedacht :)

[ Voor 78% gewijzigd door .oisyn op 05-02-2010 13:12 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 20:07

MBV

lol, ik moest even 3x kijken. Er zitten trouwens 2 problemen in: die variabele i vind ik op z'n zachtst gezegd niet echt netjes in een foreach. Nooit die 2 concepten mixen, als je een i nodig hebt moet je gewoon een for-loop gebruiken.

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Het feit dat ie de invoer weer retourneert als uitvoer vind ik toch een groter probleem. :P

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 20:07

MBV

Ik had beter van je verwacht. Kijk nog eens goed, wat geeft hij terug bij bla890bla? :P

offtopic:
hoever ben je al met je scriptie? ;)

[ Voor 21% gewijzigd door MBV op 05-02-2010 13:46 ]


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Met de preconditie dat je alleen tekst invoert. :P

Scriptie is 60% ongeveer, maar het gaat niet zo snel als je het naast een fulltime baan doet. ;)
Succes met je verdediging maandag.

[ Voor 16% gewijzigd door Grijze Vos op 05-02-2010 14:08 ]

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Grijze Vos schreef op vrijdag 05 februari 2010 @ 13:07:
Nee, ik heb het over je algoritme concept, niet over eventuele compiler issues.
Ja hier waren we al achter dat hetgeen ik heb bedacht niet 100% (zelfs niet eens voor 10%) safe is :) maar het is enkel als leerdoel om dit te kunnen bereiken, ik zal het nooit en ten nimmer gebruiken als optie voor encrypten.
MBV schreef op vrijdag 05 februari 2010 @ 13:45:
Ik had beter van je verwacht. Kijk nog eens goed, wat geeft hij terug bij bla890bla? :P

offtopic:
hoever ben je al met je scriptie? ;)
Beter van mij ? of van de college tweakert?
MBV schreef op vrijdag 05 februari 2010 @ 13:40:
lol, ik moest even 3x kijken. Er zitten trouwens 2 problemen in: die variabele i vind ik op z'n zachtst gezegd niet echt netjes in een foreach. Nooit die 2 concepten mixen, als je een i nodig hebt moet je gewoon een for-loop gebruiken.
Jah je hebt gelijk, wederom. Beter zou indd zoiets zijn als dit:
C#:
1
2
3
4
5
6
string[] abc = { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };
        int limit = abc.Count;
        for (int i = 0; i < limit; i++)
        {
            // handeling uitvoeren
        }
Of zit ik er weer enorm naast??

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op vrijdag 05 februari 2010 @ 14:20:
[...]

Ja hier waren we al achter dat hetgeen ik heb bedacht niet 100% (zelfs niet eens voor 10%) safe is :) maar het is enkel als leerdoel om dit te kunnen bereiken, ik zal het nooit en ten nimmer gebruiken als optie voor encrypten.
Ik zie hier een hoop gelul maar je gaat mij niet wijsmaken dat je het conceptuele probleem nou daadwerkelijk ziet ;)
En er zitten idd 2 problemen in, en dat is dan nog zonder die i (wat natuurlijk minder netjes is, maar niet fout). De ene is een bug in je code, de ander is echt de conceptuele fout waardoor je code met een paar veranderingen nog altijd niet goed kan werken.

Maar ik zal een (waarschijnlijk te makkelijke) hint geven. Stel je hebt een string "ab", waarbij je elke 'a' wilt veranderen in een 'b' en elke 'b' in een 'a'. De uitvoer moet dus "ba" zijn. Maar dat gaat niet op de manier waarop je het nu aanpakt. Waarom niet?

[ Voor 36% gewijzigd door .oisyn op 05-02-2010 14:59 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 20:07

MBV

Verwijderd schreef op vrijdag 05 februari 2010 @ 14:20:
[...]
Beter van mij ? of van de college tweakert?
Van Grijze Vos, waar ik op reageerde. jij bent toch ook een collega tweakert :?
Jah je hebt gelijk, wederom. Beter zou indd zoiets zijn als dit:
[knip]
Of zit ik er weer enorm naast??
Je zit er nog steeds naast, zoals .oisyn cryptisch omschrijft ;)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
.oisyn schreef op vrijdag 05 februari 2010 @ 14:52:
[...]

Ik zie hier een hoop gelul maar je gaat mij niet wijsmaken dat je het conceptuele probleem nou daadwerkelijk ziet ;)
En er zitten idd 2 problemen in, en dat is dan nog zonder die i (wat natuurlijk minder netjes is, maar niet fout). De ene is een bug in je code, de ander is echt de conceptuele fout waardoor je code met een paar veranderingen nog altijd niet goed kan werken.

Maar ik zal een (waarschijnlijk te makkelijke) hint geven. Stel je hebt een string "ab", waarbij je elke 'a' wilt veranderen in een 'b' en elke 'b' in een 'a'. De uitvoer moet dus "ba" zijn. Maar dat gaat niet op de manier waarop je het nu aanpakt. Waarom niet?
Sorry ik trok een snelle conclusie omdat ik ervan uitging dat je iets anders bedoelde. Maar waar jij op doelt is dat de output nu niet 'ba' wordt maar 'bb' en dat ik nooit meer terug kan gaan naar 'ab'.
[ab => bb => aa]
[aa => bb =>aa]

En dat is dus de reden dat ik het per karakter wil laten transformeren, daarom dat ik deze topic ben gestart. En heb dankzij deze topic nu ontdekt dat ik dus een CharArray moet gebruiken, deze kende ik eigenlijk nog niet :$....
MBV schreef op vrijdag 05 februari 2010 @ 15:06:
[...]

Van Grijze Vos, waar ik op reageerde. jij bent toch ook een collega tweakert :?
Ja en nee :P ik beschouw mijzelf geen tweakert in C#, wel in PHP. En ik beschouw me ergens pas een tweaker als ik er andere mee kan helpen, want dat is waar tweakers uiteindelijk op gebouwd is (in mijn ogen :)).

Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 20:07

MBV

Waarom een charArray, heeft C# geen stringbuilder :? * MBV heeft meer ervaring met Java.

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Verwijderd schreef op vrijdag 05 februari 2010 @ 16:06:
En dat is dus de reden dat ik het per karakter wil laten transformeren, daarom dat ik deze topic ben gestart. En heb dankzij deze topic nu ontdekt dat ik dus een CharArray moet gebruiken, deze kende ik eigenlijk nog niet :$....
ToCharArray() zal in een goede implementatie niet voorkomen, omdat je op een string str gewoon str[index] en str.Length kan gebruiken, en dat zal nog sneller gaan ook (geen tijd verspilt aan het maken van een onnodige kopie). Ook kun je gewoon foreach(char c in str) gebruiken. Zelfs in het stukje code wat ik heb gegeven kun je ".ToCharArray()" gewoon weglaten, want hoewel autocompletion dat niet direct ziet, kun je direct een LINQ-Select() op een string toepassen.
MBV schreef op vrijdag 05 februari 2010 @ 16:32:
Waarom een charArray, heeft C# geen stringbuilder :? * MBV heeft meer ervaring met Java.
Tuurlijk wel, een goede implementatie ziet er volgens mij zo uit:
C#:
1
2
3
4
5
6
        public static string Encrypt(string s)
        {
            var result = new StringBuilder(s.Length);
            ... // ao result.append(...)
            return result.ToString();
        }

Maar bij nader inzien ziet een echt goede implementatie er toch zo uit:
C#:
1
2
3
4
5
6
        public static string Encrypt(string s)
        {
            var result = new char[s.Length];
            ... // ao result[i]=...
            return new string(result);
        }

Dat is meer dan 3x zo snel!


Een andere conceptuele onhandigheid is trouwens het opslaan van characters als allemaal strings van lengte 1. Dus {"a","b",...} zou ik als {'a','b',...} noteren, en als ze exact op die volgorde staan lijkt het me dat je geeneens een array nodig hebt.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 20:07

MBV

wacht even. Je initialiseert een stringbuilder op de goede lengte, en dan nog is hij 3x zo langzaam dan een array? WTF doet een stringbuilder dan in z'n append :S

Acties:
  • 0 Henk 'm!

  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 17:23
Of de JIT weet daar niet gewoon een simpele array- access van te maken.

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
MBV schreef op vrijdag 05 februari 2010 @ 17:03:
wacht even. Je initialiseert een stringbuilder op de goede lengte, en dan nog is hij 3x zo langzaam dan een array? WTF doet een stringbuilder dan in z'n append :S
Hoe het komt weet ik ook niet, maar het is ook nog eens zo dat het verschil naar zo'n 4-5 keer sneller gaat als de lengte van de string toeneemt (getest zonder debugger). Waarschijnlijk heeft het te maken met bounds-checking en andere checks, en onnodig kopiëren van stukken geheugen. En dit is natuurlijk een zeer eenvoudige encryptie (ik heb alleen a-z meegenomen overigens, niet 0-9 en/of hoofdletters).

Ik kan me trouwens voorstellen dat je ook met java zo'n verschil krijgt - niet getest.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Heren allen bedankt voor jullie input! ik heb hier zeker veel van geleerd en ben goed op mijn fouten gewezen! Ik heb met de gegeven input en voorbeelden genoeg informatie om verder te kunnen. Bedankt!

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
MBV schreef op vrijdag 05 februari 2010 @ 17:03:
wacht even. Je initialiseert een stringbuilder op de goede lengte, en dan nog is hij 3x zo langzaam dan een array? WTF doet een stringbuilder dan in z'n append :S
Ik vind het logisch dat de array versie sneller is, aangezien de StringBuilder ook gewoon met een array geïmplementeerd zal zijn. De factor 3 vind ik dan wel vreemd, maar dat kan misschien ook aan de manier van timing liggen.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Je kan het zelf uitproberen:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
        public static string Encrypt(string s)
        {
            var r = new StringBuilder(s.Length);
            foreach (var c in s)
                r.Append(c >= 'a' && c <= 'z' ? (char)(219 - c) : c);
            return r.ToString();
        }
        public static string Encrypt2(string s)
        {
            var r = new char[s.Length];
            for (int i = 0; i < s.Length; i++)
                r[i] = s[i] >= 'a' && s[i] <= 'z' ? (char)(219 - s[i]) : s[i];
            return new string(r);         
        }
        public static string Encrypt3(string s)
        {
            var r = new StringBuilder(s.Length);
            for (int i = 0; i < s.Length; i++)
                r.Append((s[i] >= 'a' && s[i] <= 'z' ? (char)(219 - s[i]) : s[i]));
            return r.ToString();
        }
        public static string Encrypt4(string s)
        {
            var r = "";
            foreach (var c in s)
                r += c >= 'a' && c <= 'z' ? (char)(219 - c) : c;
            return r;
        }
        static void Main(string[] args)
        {
            var str = "appels en peren";
            var iter = 1000000;
            var s = Stopwatch.StartNew();
            for (int i = 0; i < iter; i++)
            {
                var tmp = Encrypt(str);
            }
            Console.WriteLine(s.ElapsedMilliseconds);
            s = Stopwatch.StartNew();
            for (int i = 0; i < iter; i++)
            {
                var tmp = Encrypt2(str);
            }
            Console.WriteLine(s.ElapsedMilliseconds);
            s = Stopwatch.StartNew();
            for (int i = 0; i < iter; i++)
            {
                var tmp = Encrypt3(str);
            }
            Console.WriteLine(s.ElapsedMilliseconds);
            s = Stopwatch.StartNew();
            for (int i = 0; i < iter; i++)
            {
                var tmp = Encrypt4(str);
            }
            Console.WriteLine(s.ElapsedMilliseconds);
        }

Wel buiten de debugger draaien natuurlijk (ctrl-f5).

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 01:05

Reptile209

- gers -

Ik heb hier geen compiler, welke stats krijg je?

Zo scherp als een voetbal!


Acties:
  • 0 Henk 'm!

  • BM
  • Registratie: September 2001
  • Laatst online: 20:37

BM

Moderator Spielerij
Reptile209 schreef op dinsdag 09 februari 2010 @ 12:31:
Ik heb hier geen compiler, welke stats krijg je?
Encrypt took: 420
Encrypt2 took: 122
Encrypt3 took: 425
Encrypt4 took: 1721
Heb even de output wat verduidelijkt
pedorus schreef op dinsdag 09 februari 2010 @ 12:26:
Je kan het zelf uitproberen:
*snip*
Wel buiten de debugger draaien natuurlijk (ctrl-f5).
offtopic:
Mag ik trouwens zeggen dat je irritant gebruik maakt van 'var'? :X

[ Voor 4% gewijzigd door BM op 09-02-2010 12:44 ]

Xbox
Even the dark has a silver lining | I'm all you can imagine times infinity, times three


Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 20:07

MBV

offtopic:
viel mij ook al op ja. Heeft in deze context toch geen enkel nut, en kan toch ook voor een lagere performance zorgen? Los daarvan haal je alle voordelen van een strongly typed language weg, ga dan lekker ironPython gebruiken als je in .NET wilt spelen :X


Even vertaald naar java, voor de lol. Nogal naïef vertaald, dus de snelste 2 verder geoptimaliseerd naar 5 en 6:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    public static String Encrypt5(String s)
    {
        int length = s.length();
        StringBuilder r = new StringBuilder(length);
        for (int i = 0; i < length; i++) {
            char c = s.charAt(i);
            r.append((c >= 'a' && c <= 'z' ? (char)(219 - c) : c));
        }
        return r.toString();
    }
    public static String Encrypt6(String s)
    {
        int length = s.length();
        char[] r = new char[length];
        for (int i = 0; i < length; i++) {
            char c = s.charAt(i);
            r[i] = (c >= 'a' && c <= 'z' ? (char)(219 - c) : c);
        }
        return new String(r);         
    }


code:
1
2
3
4
5
6
Encrypt 1: 500
Encrypt 2: 266
Encrypt 3: 453
Encrypt 4: 4359
Encrypt 5: 406
Encrypt 6: 235

Het groeien van de string bij nummer 4 kunnen ze nog ietsje optimaliseren :+ Strings zijn immutable, dus als je de waarde van een string wijzigt wordt in java een nieuw object aangemaakt.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

MBV schreef op dinsdag 09 februari 2010 @ 14:47:
offtopic:
viel mij ook al op ja. Heeft in deze context toch geen enkel nut, en kan toch ook voor een lagere performance zorgen? Los daarvan haal je alle voordelen van een strongly typed language weg, ga dan lekker ironPython gebruiken als je in .NET wilt spelen :X
Anders ga je je eerst even inlezen in wat 'var' precies doet. Ik ben het met de stelling eens dat het hier niet echt nodig is en alleen maar wat verwarrend werkt, maar als je het gaat hebben over performance en strong typing snap je niet wat de feature eigenlijk doet. Het is namelijk gewoon static type inference, itt het 'dynamic' keyword in C# 4.0 die daadwerkelijk dynamic typing toevoegt. Maar deze discussie is al eerder geweest geloof ik. Bottom line is iig dat de code exact equivalent is aan de variant waarbij je wel expliciet alle types opgeeft.

[ Voor 12% gewijzigd door .oisyn op 09-02-2010 14:58 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 20:07

MBV

Sorry, ik weet erg weinig van C# behalve dat het veel op Java lijkt. Er zijn wel andere talen waar je variabelen met een variabel type kan declareren die wel dat soort nadelen hebben.

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
BM schreef op dinsdag 09 februari 2010 @ 12:44:
offtopic:
Mag ik trouwens zeggen dat je irritant gebruik maakt van 'var'? :X
Natuurlijk, graag hier beargumenteren: :)

\[C#][discussie] Lekker veel var gebruiken?

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten

Pagina: 1