Voor een programmeervak moest ik een implementatie maken van de Vigenère versleuteling. So far so good, dus ik een mooie implementatie gemaakt. Echter, de Vigenère versleuteling is al redelijk oud en het zwakste punt is de sleutellengte. Als die eenmaal bekend is (oa. mogelijk met de Kasiski test of de Friedman-test bijvoorbeeld), is het mbv frequentieanalyse mogelijk de versleuteling terug te brengen tot een Ceasar cipher, die gemakkelijk te kraken is, gesteld dat de taal van de plaintext bekend is.
Nu verloopt het coderen in mijn progje met een tussenstap, de plaintext wordt eerst in BASE64 omgezet, om ervoor te zorgen dat de plaintext alle informatie kan bevatten die je maar kunt bedenken en je met een relatief kleine tabula recta aan de slag kan (een 63*63 matrix). Daarnaast kun je kiezen tussen de "originele" versleuteling of de "Variant Beauford" (waarbij het decryptie-proces gebruikt wordt om te encrypten en het encryptieproces om te decrypten).
Om gebruikers toch een goede sleutellengte te bieden bij een minimaal wachtwoord, heb ik het volgende gedaan: allereerst wordt het wachtwoord gehashed mbv SHA512, waardoor je een string van een vaste lengte krijgt. Omdat dit de sleutellengte vast maakt, moet je dat niet willen. Daarom wordt de uiteindelijke sleutel als volgt in elkaar gedraaid:
De uiteindelijke sleutellengte is dus afhankelijk van de lengte van het opgegeven wachtwoord en varieert van 31 tekens (bij wachtwoord van 1 teken) tot 136 tekens (bij een wachtwoord van 16 of meer tekens).
Nu mijn vraag:
In hoeverre is mijn Vigenère cipher bestand tegen cryptoanalyse (gesteld dat mijn implementatie van het Vigenère cipher bugvrij is)? Ik heb mijn best gedaan om het lastig te maken, maar ben geen cryptoanalist of briljant wiskundige, dus wellicht heb ik heel veel dingen over het hoofd gezien.
Zowel het achterhalen van de sleutellengte als een frequentie analyse lijken mij behoorlijk lastig. Er is immers geen sprake van een natural language waar je een een frequentie analyse van kunt gebruiken, maar een BASE64 encoding van mogelijk binaire bestanden of platte tekst met allerlei leestekens etc.
Uiteraard is het niet bedoeld om NSA-safe te zijn, maar als ik toch een opdracht moet maken, kan ik het maar net zo goed goed uitvoeren ook
Iemand met wat meer verstand van crypto die hier iets zinnigs over kan zeggen?
Nu verloopt het coderen in mijn progje met een tussenstap, de plaintext wordt eerst in BASE64 omgezet, om ervoor te zorgen dat de plaintext alle informatie kan bevatten die je maar kunt bedenken en je met een relatief kleine tabula recta aan de slag kan (een 63*63 matrix). Daarnaast kun je kiezen tussen de "originele" versleuteling of de "Variant Beauford" (waarbij het decryptie-proces gebruikt wordt om te encrypten en het encryptieproces om te decrypten).
Om gebruikers toch een goede sleutellengte te bieden bij een minimaal wachtwoord, heb ik het volgende gedaan: allereerst wordt het wachtwoord gehashed mbv SHA512, waardoor je een string van een vaste lengte krijgt. Omdat dit de sleutellengte vast maakt, moet je dat niet willen. Daarom wordt de uiteindelijke sleutel als volgt in elkaar gedraaid:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| ' OK, we now do know the password has 64 bytes. Now lets make it somewhat harder to do a succesful attack on the encrypted text by making the length of the ' password variable (ranging from 31 to 136 chars). For intCounter = 0 To intSecretLength ' Sorry, passwords with a length of 16 chars or more makes no sense in this way (only for the hash!) If (intCounter >= 16) Then Exit For ' Determine starting position intStart = intCounter * (17 - intCounter) ' Make sure we can take the substring If ((intStart + (16 - intCounter)) >= strSecret.Length) Then intStart = intCounter * 3 End If strSecretSecured += strSecret.Substring(intStart, 16 - intCounter) Next |
De uiteindelijke sleutellengte is dus afhankelijk van de lengte van het opgegeven wachtwoord en varieert van 31 tekens (bij wachtwoord van 1 teken) tot 136 tekens (bij een wachtwoord van 16 of meer tekens).
Nu mijn vraag:
In hoeverre is mijn Vigenère cipher bestand tegen cryptoanalyse (gesteld dat mijn implementatie van het Vigenère cipher bugvrij is)? Ik heb mijn best gedaan om het lastig te maken, maar ben geen cryptoanalist of briljant wiskundige, dus wellicht heb ik heel veel dingen over het hoofd gezien.
Zowel het achterhalen van de sleutellengte als een frequentie analyse lijken mij behoorlijk lastig. Er is immers geen sprake van een natural language waar je een een frequentie analyse van kunt gebruiken, maar een BASE64 encoding van mogelijk binaire bestanden of platte tekst met allerlei leestekens etc.
Uiteraard is het niet bedoeld om NSA-safe te zijn, maar als ik toch een opdracht moet maken, kan ik het maar net zo goed goed uitvoeren ook
Iemand met wat meer verstand van crypto die hier iets zinnigs over kan zeggen?
Make it idiot proof and someone will make a better idiot.
Real programmers don't document. If it was hard to write, it should be hard to understand.