Sistem Cryptography Pada Framework .NET
Artikel ini telah dipublikasikan pada majalah Mikrodata Vol. 10 Series 17, Oktober 2002. Agus Kurniawan
[email protected] http://blog.aguskurniawan.net
Pendahuluan Dalam dunia security terutama teknik encrypt dan decrypt suatu data, sistem Cryptography lebih banyak digunakan. Tujuannya untuk mengamankan data agar data tidak dicuri oleh orang-orang yang tidak bertanggung jawab. Microsoft dengan teknologi barunya yaitu teknologi .NET telah melengkapi library nya dengan library Cryptography. Pada artikel ini akan dibahas beberapa arsitektur dari sistem Cryptography dan kemudian diimplementasikan kedalam aplikasi simulasi dengan bahasa C# yang merupakan bagian bahasa .NET Arsitektur Cryptography .NET Pembahasan mengenai Cryptography dalam framework .NET cukup menempati banyak tempat. Secara umum sistem Cryptography digambarkan seperti pada gambar 1 berdasarkan proses encrypt.
1|Halaman
Gambar 1. Sistem Cryptography berdasarkan prose encrypt Baik sistem Cryptography menggunakan algoritma Symmetri ataupun algoritma Asymmentri masing-masing mempunyai kelebihan dan kekurangan. Sistem algoritma Crytography dalam framework .NET ditangani oleh CryptoServiceProvider. Semuanya dengan memanfaatkan namespace System.Security.Cryptography .Untuk lebih detailnya dapat dijumpai sub bagian lainnya.
Symmetri Cryptography Pada sistem Symmetri Cryptography terutama dalam proses encrypt dan decrypt mempunyai key yang sama sehingga key ini dapat dikatakan sebagai Secret Key Encryption. Diagram proses dari Symmetri Cryptography dapat dilihat pada gambar 2.
2|Halaman
Gambar 2. Diagram sistem Symmetri Cryptography Keuntungan dari sistem ini adalah proses encrypt dan decrypt sangat cepat dan efisien tetapi permasalahan dan problem yang juga merupakan kekurangan dari sistem ini adalah proses pertukuran private key. Baik pada sisi server maupun client tidak menjamin saat pengiriman private key akan aman dalam perjalanannya. Mungkin kita bisa mengirim private key kita ke client melalui email atau telpon tetapi apakah kita bisa menjamin bahwa client kita tetap menyimpan rahasia private key yang telah kita berikan. Beberapa algoritma dan dengan memanfaatkan class dalam cryptography yang dapat digunakan adalah: 1. Algoritma DES menggunakan kelas DESCryptoServiceProvider. 2. Algoritma RC2 menggunakan kelas RC2CryptoServiceProvider. 3. Algoritma Rijndael menggunakan kelas RijndaelCryptoServiceProvider. 4. Algoritma TripleDES menggunakan kelas TripleDESCryptoServiceProvider.
Asymmetri Cryptography Untuk sistem Asymmetri Cryptography proses encrypt dan decrypt mempunyai key yang berbeda sehingga ada key yang dihasilkan dalam sistem ini antara lain Private key, untuk melakukan decrypt secara internal Public key, untuk diberikan pada siapa saja yang akan melakukan proses encrypt dimana bisa jadi setiap pemakai mempunyai public key yang berbeda-beda. Diagram proses Asymmetri Cryptography dapat dilihat pada gambar 3.
3|Halaman
Gambar 3. Diagram Asymmetri Cryptography Teknik encrypt/decrypt untuk private/public key yang umum dipakai adalah RSA. Istilah RSA diambil dari nama orang yang menciptakan yaitu Ron Rivest, Adi Shamir, dan Len Adleman. Dari gambar 3, terlihat bahwa pengirim yang akan mengirim data encrypt maka akan diberikan public key oleh penerima. Pada sisi penerima, proses decrypt nya menggunakan private key yang dimiliki. Berikut ini beberapa algoritma yang dapat dipakai dalam Asymmetri Cryptography 1. Algoritma DSA menggunakan kelas DSACryptoServiceProvider. 2. Algoritma RSA menggunakan kelas RSACryptoServiceProvider.
Implementasi Symmetri Cryptography Pada Framework .NET Pada bagian ini, kita akan membahas lebih jauh sistem Cryptography terutama implementasinya dalam framework .NET. Untuk itu kita akan membuat suatu simulasi yang menggambarkan proses Symmetri Cryptography dengan menggunakan bahasa C# dalam framework .NET. Bentuk GUI dari simulasi ini dapat dilihat pada gambar 4. Algortima yang dipakai dalam encrypt/decrypt data menggunakan DES.
4|Halaman
Gambar 4. Aplikasi simulasi Symmetri Cryptography Mula-mula kita memasukkan data yang akan di-encrypt dan private key kemudian saat menekan tombol Encrypt maka aplikasi akan menjalankan proses encrypt data sebagai berikut public string EncryptData(string Source, string Key) { try { byte[] bytIn = System.Text.ASCIIEncoding.ASCII.GetBytes(Source); System.IO.MemoryStream ms = new System.IO.MemoryStream(); byte[] bytKey = GetLegalKey(Key); ObjCrypto.Key = bytKey; ObjCrypto.IV = bytKey; ICryptoTransform encrypto = ObjCrypto.CreateEncryptor(); CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Write); cs.Write(bytIn, 0, bytIn.Length); cs.FlushFinalBlock(); byte[] bytOut = ms.GetBuffer(); int i = 0; for (i = 0; i < bytOut.Length; i++) if (bytOut[i] == 0) break; return System.Convert.ToBase64String(bytOut, 0, i); } catch(CryptographicException e) { MessageBox.Show(e.Message ,
5|Halaman
"Error",MessageBoxButtons.OK,MessageBoxIcon.Error); } return null; }
Sedangkan untuk melakukan proses decrypt maka kita memerlukan private key untuk membukanya. Private key yang dimasukkan pada proses decrypt harus sama dengan private key pada proses encrypt. Dengan menekan tombol Decrypt, aplikasi akan menjalankan proses decrypt data sebagai berikut public string DecryptData(string Source, string Key) { try { byte[] bytIn = System.Convert.FromBase64String(Source); System.IO.MemoryStream ms = new System.IO.MemoryStream(bytIn, 0, bytIn.Length); byte[] bytKey = GetLegalKey(Key); ObjCrypto.Key = bytKey; ObjCrypto.IV = bytKey; ICryptoTransform encrypto = ObjCrypto.CreateDecryptor(); CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Read); System.IO.StreamReader sr = new System.IO.StreamReader( cs ); if(!sr.Equals(StreamReader.Null)) return sr.ReadToEnd(); } catch(CryptographicException e) { MessageBox.Show(e.Message ,"Error", MessageBoxButtons.OK,MessageBoxIcon.Error); } return null; }
Implementasi Asymmetri Cryptography Pada Framework .NET Untuk bagian ini kita akan membuat simulasi Asymmetri Cryptography dengan memanfaatkan algoritma RSA untuk encrypt/decrypt. Bentuk GUI dapat dilihat pada gambar 5.
6|Halaman
Gambar 5. Aplikasi simulasi Asymmetri Cryptography Prinsip kerja dari aplikasi ini, mula-mula kita memasukkan data source kemudian menekan tombol Encrypt sehingga aplikasi akan melakukan proses encrypt sebagai berikut: public CipherData EncryptData(string message) { CipherData buff = new CipherData(); byte[] DataBytes = Encoding.Unicode.GetBytes(message.ToCharArray()); buff.PublicKey = rsa.ExportParameters(true); rc2.GenerateKey(); rc2.GenerateIV(); buff.InitVector = Convert.ToBase64String(rc2.IV); try { buff.PrivateKey =
7|Halaman
Convert.ToBase64String(rsa.Encrypt(rc2.Key,false)); } catch(CryptographicException e) { MessageBox.Show(e.Message,"Error",MessageBoxButtons.OK, MessageBoxIcon.Error); return null; } ICryptoTransform _crypto = rc2.CreateEncryptor(); MemoryStream ms = new MemoryStream(); CryptoStream cs = new CryptoStream(ms,_crypto,CryptoStreamMode.Write); try { cs.Write(DataBytes,0,DataBytes.Length); cs.FlushFinalBlock(); buff.Message = Convert.ToBase64String(ms.ToArray()); } catch(Exception e) { MessageBox.Show(e.Message,"Error",MessageBoxButtons.OK, MessageBoxIcon.Error); } finally { ms.Close(); cs.Close(); } return buff; }
Sedangkan proses decrypt ketika menekan tombol Decrypt. Code untuk decrypt sebagai berikut public string DecryptData(CipherData message) { string buff; rsa.ImportParameters(message.PublicKey); rc2.IV = Convert.FromBase64String(message.InitVector); try { rc2.Key = rsa.Decrypt(Convert.FromBase64String(message.PrivateKey),false); } catch(CryptographicException e) { MessageBox.Show(e.Message,"Error",MessageBoxButtons.OK,
8|Halaman
MessageBoxIcon.Error); return null; } ICryptoTransform _crypto = rc2.CreateDecryptor(); MemoryStream ms = new MemoryStream(Convert.FromBase64String(message.Message)); CryptoStream cs = new CryptoStream(ms,_crypto,CryptoStreamMode.Read); byte[] bt = Encoding.Unicode.GetBytes(message.Message); byte[] initMessage = new Byte[bt.Length]; try { cs.Read(initMessage,0,initMessage.Length); } catch(Exception e) { MessageBox.Show(e.Message,"Error",MessageBoxButtons.OK, MessageBoxIcon.Error); return null; } ms.Close(); cs.Close(); buff = Encoding.Unicode.GetString(initMessage); return buff; }
Untuk lebih mendalam membahas teknologi framework .NET terutama dengan menggunakan bahasa Visual C# dapat bergabung dalam mailist C# Indonesia, URL: http://groups.yahoo.com/group/csharp_indo atau dapat langsung mengirim email kosong ke
[email protected] Referensi MSDN .NET library tentang System.Security.Cryptography
Cryptography
System
dan
namespace
9|Halaman