Ik heb een probleem bij het toepassen van asymmetrische encryptie (RSA) om de herkomst van een bestand te verifieren. Ik zal eerst kort uitleggen wat de context is en daarna wat ik probeer te doen.
Ik heb een Windows applicatie gemaakt welke door derden gebruikt wordt. Voor het gemak kunnen we het even voorstellen als bijvoorbeeld Powerpoint. Echter in mijn geval worden de "presentaties" enkel door mij gemaakt. Ik wil niet dat iemand anders zijn eigen presentaties kan maken (of in ieder geval mag hij ze niet kunnen openen in mijn applicatie). Simpel gezegd is de applicatie ("Powerpoint") gratis maar verkoop ik de "presentaties", ik wil dus niet dat mensen die kunnen aanpassen of op welke manier dan ook hun eigen presentaties kunnen maken.
De presentaties bestaan in principe simpelweg uit een zipfile met de benodigde bestanden, welke ik daarna ofwel encodeer of encrypt met simpele symmetrische encryptie (gewoon zodat ze niet met winzip etc gelezen kunnen worden). Het maken en daarna encrypten van de zipfile gebeurt in een aparte applicatie, en alleen ik heb deze applicatie, niemand anders heeft toegang tot de source code en zelfs niet de executable.
Om ervoor te zorgen dat mensen niet hun eigen presentaties kunnen maken of kunnen aanpassen had ik bedacht dat ik RSA encryptie kan gebruiken. Het concept had ik als volgt bedacht:
In mijn prive applicatie welke de presentaties maakt gebeuren deze stappen:
Nu komt het enige punt waar dit compleet mis loopt; iemand met ervaring heeft het vast al lang gezien. Ik kom er echter net achter dat de private key niet gebruikt kan worden voor encryption maar alleen voor decryption.
Het idee van RSA is blijkbaar dat je met de private key iets kan decrypten maar niet kan encrypten. Mijn hele concept werkt dus niet.
Ik kan ook niet "gewoon" de keys omdraaien (public key geheim houden en private key meesturen), want met de private key kan iedereen de public key gewoon berekenen, dus dan heeft het geen zin meer om die geheim te houden.
Ik maak waarschijnlijk een cruciale fout maar ik snap niet hoe ik dit kan implementeren. Moet ik iets radicaal anders verzinnen of kan ik dit op een iets andere manier toch werkend krijgen?
Ik heb een Windows applicatie gemaakt welke door derden gebruikt wordt. Voor het gemak kunnen we het even voorstellen als bijvoorbeeld Powerpoint. Echter in mijn geval worden de "presentaties" enkel door mij gemaakt. Ik wil niet dat iemand anders zijn eigen presentaties kan maken (of in ieder geval mag hij ze niet kunnen openen in mijn applicatie). Simpel gezegd is de applicatie ("Powerpoint") gratis maar verkoop ik de "presentaties", ik wil dus niet dat mensen die kunnen aanpassen of op welke manier dan ook hun eigen presentaties kunnen maken.
De presentaties bestaan in principe simpelweg uit een zipfile met de benodigde bestanden, welke ik daarna ofwel encodeer of encrypt met simpele symmetrische encryptie (gewoon zodat ze niet met winzip etc gelezen kunnen worden). Het maken en daarna encrypten van de zipfile gebeurt in een aparte applicatie, en alleen ik heb deze applicatie, niemand anders heeft toegang tot de source code en zelfs niet de executable.
Om ervoor te zorgen dat mensen niet hun eigen presentaties kunnen maken of kunnen aanpassen had ik bedacht dat ik RSA encryptie kan gebruiken. Het concept had ik als volgt bedacht:
In mijn prive applicatie welke de presentaties maakt gebeuren deze stappen:
- Maak een (MD5) hash van de zipfile
- Gebruik mijn private key om deze hash te encrypten. Het resultaat noem ik de "symmetric key". De private key is alleen bekend in mijn prive applicatie.
- Gebruik de symmetric key om de contents van de zipfile te encrypten.
- Voeg de data in raw bytes samen als "symmetric key" + "encrypted zipfile".
- Deze data is wat uiteindelijk verstuurd wordt als "de presentatie".
- Lees apart de bytes van de symmetric key en de rest van de data (ga er even vanuit dat ik de lengte weet of ook meestuur).
- Gebruik de symmetric key om de rest van de data te decrypten. Het resultaat is de relevante data (gezipt) die mijn Powerpoint kan lezen.
- Gebruik de public key (in "Powerpoint" meegestuurd dus publiek bekend) om de symmetric key te decrypten. Het resultaat zou de hash moeten zijn van de decrypted zipfile.
- Check of de hash inderdaad gelijk is aan de hash van de decrypted zipfile. Zo ja, dan is alles ok. Zo nee, dan is de zipfile aangepast en de verkeerde key meegestuurd --> fout.
Nu komt het enige punt waar dit compleet mis loopt; iemand met ervaring heeft het vast al lang gezien. Ik kom er echter net achter dat de private key niet gebruikt kan worden voor encryption maar alleen voor decryption.
Het idee van RSA is blijkbaar dat je met de private key iets kan decrypten maar niet kan encrypten. Mijn hele concept werkt dus niet.
Ik kan ook niet "gewoon" de keys omdraaien (public key geheim houden en private key meesturen), want met de private key kan iedereen de public key gewoon berekenen, dus dan heeft het geen zin meer om die geheim te houden.
Ik maak waarschijnlijk een cruciale fout maar ik snap niet hoe ik dit kan implementeren. Moet ik iets radicaal anders verzinnen of kan ik dit op een iets andere manier toch werkend krijgen?