
Mellékelt példa megnyitása előtt szükséges egy RC2Service nevű virtuális könyvtár létrehozása, mely a példa mappájában található RC2Service alkönyvtárra mutat. Ehhez nyissa meg a mappa Tulajdonság ablakát és itt a Webmegosztás lapon engedélyezze a mappa megosztását olvasási és parancsfájlok futtatási jogával.
A szerviz alkalmazás futtatása előtt gondoskodnunk kell arról, hogy a Web szerver virtuális mappájában engedélyezzük a névtelen hozzáférést.
Szerviz alkalmazás
A szerviz alkalmazásunkban a RC2 algoritmus felhasználásával titkosítunk egy karakterláncot, majd ezt a bináris adatfolyamot egy bájttömbben visszaadjuk.
A megoldásban a privát kulcsos titkosítást alkalmaztuk, mely azt jelenti, hogy mindkét, a kommunikációban részt vevő programnak ugyanazzal a kulccsal kell rendelkeznie, mely kulcsot csak a kommunikációban résztvevő felek ismerhetik.
A titkosítás esetén az úgynevezett UTF-8 kódolást használjuk, így a szövegben megtalálható ékezetes karakterek is tökéletesen átküldhetők.
UTF8Encoding converter = new UTF8Encoding();
A kódoláshoz létrehozunk egy RC2CryptoServiceProvider objektumot.
RC2CryptoServiceProvider provider = new RC2CryptoServiceProvider();
A kódolás kulcsát és az inicializáló vektort egy-egy byte-tömbben helyezzük el.
byte[] key = {2, 55, 86, 23, 2, 21, 111, 132, 222, 182, 72, 132, 12, 3, 231, 12};
byte[] iv = {12, 231, 34, 242, 52, 12, 8, 21, 98, 33, 48, 78, 57, 11, 49, 88};
A transzformáló objektumot ezekkel az információkkal képezzük az objektum CreateEncryptor metódus segítségével.
ICryptoTransform encryptor = provider.CreateEncryptor(key, iv);
Szükségünk van egy MemoryStream objektumra.
MemoryStream mStream = new MemoryStream();
És a titkos adatfolyamot tároló CryptoStream objektumra.
CryptoStream cStream = new CryptoStream(mStream, encryptor, CryptoStreamMode.Write);
A titkosítandó üzenetet bájt-formátumra hozzuk.
from = converter.GetBytes(message);
A bájtfolyamot a titkos adatfolyamba írjuk, majd a kapott információt egy újabb bájttömbben helyezzük, mely már a metódus visszatérési értéke lesz.
cStream.Write(from, 0, from.Length);
cStream.FlushFinalBlock();
to = mStream.ToArray();
Érdemes egy pillantást vetni a kódolt információra, mely egy SOAP borítékban utazik a SOAP csatornán.
<?xml version="1.0" encoding="utf-8" ?>
<base64Binary xmlns="http://tempuri.org/">vSdEIFyB2H3YQ4iwJqZjDw==</base64Binary>
Kliens-alkalmazás
Első lépésként egy Webes referenciát kell a kliensünkhöz adni, melynek eredményeképpen egy Reference.cs állomány adódik a projekthez. Ez tartalmazza a proxy osztály kódját, melyben az RC2Service osztályt a LOCALHOST névtéren keresztül érhetünk el.
localhost.RC2Service proxy = new localhost.RC2Service();
byte[] from = proxy.SendSecureMessage();
A visszakapott bájttömb visszafejtéséhez azokat az objektumokat használjuk, mint a szerviz alkalmazás esetén, csak itt alapvetően egy olvasási műveletről van szó.
ICryptoTransform decryptor = provider.CreateDecryptor(key, iv);
MemoryStream mStream = new MemoryStream(from);
CryptoStream cStream = new CryptoStream(mStream, decryptor, CryptoStreamMode.Read);
A művelet akkor lesz sikeres, ha a titkosításhoz felhasznált kulcsok azonosak a szervizben megadott kulcsokkal.
A titkosított adatfolyamból a konverziós objektum felhasználásával kiolvassuk az új, már a titkosítatlan szöveget tartalmazó bájtsort.
cStream.Read(to, 0, to.Length);
Majd karakterlánccá konvertáljuk, és megjelenítjük a szövegmezőben.
textBox1.Text = converter.GetString(to);
A visszafejtés természetesen itt is UTF-8 szabványú.