21 Ocak 2013 Pazartesi

RC2 Şifreleme Algoritması


RC2 Şifreleme Algoritması

RC2, Ron Rivest tarafından RSA güvenliği için tasarlanmıştır. Bu yazımızda Microsoft .NET teknolojileri ile RC2 algoritmasının nasıl gerçekleşebileceğimizi inceleyeceğiz.

Resmi olarak RC harflerinin “Rivest Cipher” simgelediği tanımlanmış olsa bile bir çok kişi “Ron’s Code” ’u simgelediğini düşünür. DES’in yerine düşünülmüştür ve DES’ten üç kat daha hızlıdır. Anahtara 40 ile 88 bit arası uzunluklarda değişen “salt” adında ayrı ek bir anahtar daha kullanılabilmektedir.

Microsoft .NET Framework’ te System.Security.Cryptography altında yer alan RC2 soyut sınıfı RC2 algoritmasını gerçeklemek isteyen sınıflar için ana sınıfı tanımlar. RC2 sınıfında yer alan erişilebilir metotlar şunlardır:
  • BlockSize, kriptografik işlemler için kullanılacak olan blok boyutunu bit olarak belirtir. Varsayılan değeri 64 bittir.
  • EffectiveKeySize, RC2 algoritması tarafından kullanılan etkili anahtar boyutunu ifade eder. Varsayılan etkili anahtar boyutu 128 bittir.
  • FeedbackSize, kriptografik işlemin geri besleme boyutunu bit olarak ifade eder, varsayılan değeri 8 bittir.
  • IV, RC2 algoritmasının ilk vektörünü (Initial Vector) ifade eder.
  • Key, RC2 algoritması tarafından kullanılan anahtarı ifade eder.
  • KeySize, RC2 algoritması tarafından kullanılan gizli anahtarın boyutunu bit olarak belirtir. Varsayılan değeri 128 bittir.
  • LegalBlockSizes, RC2 tarafından desteklenen blok boyutlarının sınırını bit olarak ifade eder. Ancak RC2 için tek değer vardır. En az ve en çok değeri 64 bittir.
  • LegalKeySizes, RC2 tarafından desteklenen anahtar boyutlarının sınırını bit olarak ifade eder. En az 40 ve en çok değeri 128 bittir.
  • Mode, RC2’nin hangi mod ile şifreleme yapacağını gösterir.
  • Padding, RC2 algoritması tarafından kullanılacak olan doldurma modunu ifade eder.
Bu sınıfın erişilebilir metotları ise şunlardır:
  • Clear, RC2 algoritması tarafından kullanılan tüm kaynakları sisteme geri verir.
  • Create, RC2 algoritmasını gerçekleştirecek bir nesne oluşturur.
  • CreateDecryptor, RC2 deşifreleyicisi oluşturur.
  • CreateEncryptor, RC2 şifreleyicisi oluşturur.
  • Equals, iki nesnenin birbirine eşit olup olmadığını test eder.
  • GenerateIV, RC2 algoritması tarafından kullanılacak rastgele bir ilk vektör değeri oluşturur.
  • GenerateKey, RC2 algoritması tarafından kullanılacak rastgele bir anahtar oluşturur.
  • GetHashCode, bellekteki o nesneye özgü bir hash kodu oluşturur.
  • GetType, bu nesnenin tipini verir.
  • ToString, şu an ki nesneyi ifade eden bir metin oluşturur.
  • ValidKeySize, bu algoritma için belirtilen anahtar boyutunun geçerli olup olmadığını test eder.

RC2CryptoServiceProvider, standart RC2 algoritmasını gerçekleyen, RC2 soyut sınıfından türeyen mühürlü bir sınıftır. Mühürlü sınıf, hiç bir sınıfın kendisinden türetilemeyeceğini ifade eder. Bu sınıfın erişilebilir özellikleri şunlardır:
  • BlockSize, kriptografik işlemler için kullanılacak olan blok boyutunu bit olarak belirtir. Varsayılan değeri 64 bittir.
  • EffectiveKeySize, RC2 algoritması tarafından kullanılan etkili anahtar boyutunu ifade eder. Varsayılan etkili anahtar boyutu 128 bittir.
  • FeedbackSize, kriptografik işlemin geri besleme boyutunu bit olarak ifade eder, varsayılan değeri 8 bittir.
  • IV, RC2 algoritmasının ilk vektörünü (Initial Vector) ifade eder.
  • Key, RC2 algoritması tarafından kullanılan anahtarı ifade eder.
  • KeySize, RC2 algoritması tarafından kullanılan gizli anahtarın boyutunu bit olarak belirtir. Varsayılan değeri 128 bittir.
  • LegalBlockSizes, RC2 tarafından desteklenen blok boyutlarının sınırını bit olarak ifade eder. Ancak RC2 için tek değer vardır. En az ve en çok değeri 64 bittir.
  • LegalKeySizes, RC2 tarafından desteklenen anahtar boyutlarının sınırını bit olarak ifade eder. RC2 için en az 40 bit ve en çok 128 bittir.
  • Mode, RC2’nin hangi mod ile şifreleme yapacağını gösterir.
  • Padding, RC2 algoritması tarafından kullanılacak olan doldurma modunu ifade eder.
Bu sınıfın erişilebilir metotları ise şunlardır:
  • Clear, RC2 algoritması tarafından kullanılan tüm kaynakları sisteme geri verir.
  • Create, RC2 algoritmasını gerçekleştirecek bir nesne oluşturur.
  • CreateDecryptor, RC2 deşifreleyicisi oluşturur.
  • CreateEncryptor, RC2 şifreleyicisi oluşturur.
  • Equals, iki nesnenin birbirine eşit olup olmadığını test eder.
  • GenerateIV, RC2 algoritması tarafından kullanılacak rastgele bir ilk vektör değeri oluşturur.
  • GenerateKey, RC2 algoritması tarafından kullanılacak rastgele bir anahtar oluşturur.
  • GetHashCode, bellekteki o nesneye özgü bir hash kodu oluşturur.
  • GetType, bu nesnenin tipini verir.
  • ToString, şu an ki nesneyi ifade eden bir metin oluşturur.
  • ValidKeySize, bu algoritma için belirtilen anahtar boyutunun geçerli olup olmadığını test eder.
Bu sınıfın kullanımını daha iyi anlayabilmek için örnek bir sınıf hazırlayalım. Kodlama olarak Rijndael sınıfına birebir benzeyen bir kod oluşacaktır. Çalışmaları birbirinden çok farklı olan algoritmaların bu kadar basite indergenmiş olması ve bunun dil bağımlılığının olmaması belki de Microsoft .NET Framework’ ün güvenlik altyapısı oluştururken rakipsiz bir hale getirmiştir. 4 ayrı programlama dilinde de kodların birbirine ne kadar benzediğine dikkat edelim.

C#
using System.Text;
using System.IO;
using System.Security.Cryptography;
 
namespace CryptographyServicesCS
{
    public class RC2Cipher
    {
        private RC2CryptoServiceProvider rc2 = new RC2CryptoServiceProvider();
        public RC2Cipher()
        {
            rc2.GenerateIV();
            rc2.GenerateKey();
        }
 
        public byte[] EncryptString(string stringToEncrypt)
        {
            MemoryStream ms = new MemoryStream();
            CryptoStream encStream;
            try
            {
                byte[] buffer = Encoding.UTF8.GetBytes(stringToEncrypt);
                encStream = new CryptoStream(ms,
                rc2.CreateEncryptor(rc2.Key,rc2.IV),CryptoStreamMode.Write);
                encStream.Write(buffer,0,buffer.Length);
                encStream.Close();
                return ms.ToArray();
            }
            finally
            {
                ms.Close();
            }
        }
 
        public string DecryptString(byte[] buffer)
        {
            MemoryStream ms = new MemoryStream();
            CryptoStream decStream;
            try
            {
                decStream = new CryptoStream(ms,
                rc2.CreateDecryptor(rc2.Key,rc2.IV),CryptoStreamMode.Write);
                decStream.Write(buffer,0,buffer.Length);
                decStream.Close();
                return Encoding.UTF8.GetString(ms.ToArray());
            }
            finally
            {
                ms.Close();
            }
        }
 
    }
}

VB.NET
Imports System.Text
Imports System.Security.Cryptography
Imports System.IO
 
Public Class RC2Cipher
    Private rc2 As New RC2CryptoServiceProvider
    Public Sub New()
        rc2.GenerateIV()
        rc2.GenerateKey()
    End Sub
    Public Function EncryptString(ByVal stringToEncrypt As String) As Byte()
        Dim ms As New MemoryStream
        Dim encStream As CryptoStream
        Try
            Dim buffer As Byte() = Encoding.UTF8.GetBytes(stringToEncrypt)
            encStream = New CryptoStream(ms, 
            rc2.CreateEncryptor(rc2.Key, rc2.IV), CryptoStreamMode.Write)
            encStream.Write(buffer, 0, buffer.Length)
            encStream.Close()
            Return ms.ToArray()
        Finally
            ms.Close()
        End Try
    End Function
    Public Function DecryptString(ByVal buffer As Byte()) As String
        Dim ms As New MemoryStream
        Dim decStream As CryptoStream
        Try
            decStream = New CryptoStream(ms, 
            rc2.CreateDecryptor(rc2.Key, rc2.IV), CryptoStreamMode.Write)
            decStream.Write(buffer, 0, buffer.Length)
            decStream.Close()
            Return Encoding.UTF8.GetString(ms.ToArray())
        Finally
            ms.Close()
        End Try
    End Function
End Class
C++.NET
#pragma once
using namespace System;
using namespace System::IO;
using namespace System::Text;
using namespace System::Security::Cryptography;
 
namespace CryptographyServicesCPP
{
    public __gc class RC2Cipher
    {
    private:
        RC2CryptoServiceProvider __gc* rc2;
    public:
        RC2Cipher()
        {
            rc2 = __gc new RC2CryptoServiceProvider();
            rc2->GenerateIV();
            rc2->GenerateKey();
        }
        Byte EncryptString(System::String* stringToEncrypt)[]
        {
            MemoryStream __gc* ms = __gc new MemoryStream();
            CryptoStream __gc* encStream;
            Byte buffer[];
            __try
            {
                int byteCount= Encoding::UTF8->GetByteCount(stringToEncrypt);
                buffer = new Byte[byteCount];
                Encoding::UTF8->GetBytes(stringToEncrypt,0,
                                stringToEncrypt->Length,buffer,0);
                encStream = __gc new CryptoStream(ms,
                                rc2->CreateEncryptor(rc2->Key,rc2->IV),
                                CryptoStreamMode::Write);
                encStream->Write(buffer,0,byteCount);
                encStream->Close();
                return ms->ToArray();
            }
            __finally
            {
                ms->Close();
            }
        }
        System::String* DecryptString(Byte buffer[])
        {
            MemoryStream __gc* ms = __gc new MemoryStream();
            CryptoStream __gc* decStream;
            __try
            {
                decStream = __gc new CryptoStream(ms, 
                                rc2->CreateDecryptor(rc2->Key,rc2->IV),
                                CryptoStreamMode::Write);
                decStream->Write(buffer,0,buffer->Count);
                decStream->Close();
                return Encoding::UTF8->GetString(ms->ToArray());
            }
            __finally
            {
                ms->Close();
            }
        }
    };
}
J#
package CryptographyServicesJS;
 
import System.*;
import System.IO.*;
import System.Text.*;
import System.Security.Cryptography.*;
 
public class RC2Cipher
{
    private RC2CryptoServiceProvider rc2 = new RC2CryptoServiceProvider(); 
    public RC2Cipher()
    {
        rc2.GenerateIV();
        rc2.GenerateKey();
    }
    public ubyte[] EncryptString(String stringToEncrypt)
    {
        MemoryStream ms = new MemoryStream();
        CryptoStream encStream;
        try
        {
            ubyte[] buffer = Encoding.get_UTF8().GetBytes(stringToEncrypt);
            encStream = new CryptoStream(ms,
                        rc2.CreateEncryptor(rc2.get_Key(),
                        rc2.get_IV()),CryptoStreamMode.Write);
            encStream.Write(buffer,0,buffer.length);
            encStream.Close();
            return ms.ToArray();
        }
        finally
        {
            ms.Close();
        }
    }
    public String DecryptString(ubyte[] buffer)
    {
        MemoryStream ms = new MemoryStream();
        CryptoStream decStream;
        try
        {
            decStream = new CryptoStream(ms,
                        rc2.CreateDecryptor(rc2.get_Key(),
                        rc2.get_IV()),CryptoStreamMode.Write);
            decStream.Write(buffer,0,buffer.length);
            decStream.Close();
            return Encoding.get_UTF8().GetString(ms.ToArray());
        }
        finally
        {
            ms.Close();
        }
    }
}
Son Söz:
Algoritmasına detaylı olarak değinmediğimiz RC2 ile şifreleme yapabilmeniz için bu makaleyi okumanız yeterli olacaktır. İnce detaylarla uğraşmak yerine uygulamaya yukarıdan kuşbakışı bakabilmek önemlidir. Bir sonraki makalemizde görüşünceye kadar güvende kalın...

Hiç yorum yok:

Yorum Gönder

isterseniz anonim seçeneginden kayıtsız gönderebilirsiniz iyi günler