Şifreleme anahtarları

Bu makalede anahtarları türetmek için standart anahtar türetme işlevlerinin nasıl kullanılacağı ve simetrik ve asimetrik anahtarları kullanarak içeriğin nasıl şifrelenmesi gösterilmektedir.

Simetrik anahtarlar

Gizli anahtar şifrelemesi olarak da adlandırılan simetrik anahtar şifrelemesi, şifreleme için kullanılan anahtarın şifre çözme için de kullanılmasını gerektirir. Simetrik algoritma belirtmek ve bir anahtar oluşturmak veya içeri aktarmak için SymmetricKeyAlgorithmProvider sınıfını kullanabilirsiniz. Algoritmayı ve anahtarı kullanarak verileri şifrelemek ve şifresini çözmek için CryptographicEngine sınıfında statik yöntemler kullanabilirsiniz.

Simetrik anahtar şifrelemesi genellikle blok şifreleme ve blok şifreleme modlarını kullanır. Blok şifrelemesi, sabit boyutlu bloklar üzerinde çalışan bir simetrik şifreleme işlevidir. Şifrelemek istediğiniz ileti blok uzunluğundan uzunsa, blok şifreleme modunu kullanmanız gerekir. Blok şifreleme modu, blok şifrelemesi kullanılarak oluşturulan bir simetrik şifreleme işlevidir. Düz metni bir dizi sabit boyutlu blok olarak şifreler. Uygulamalar için aşağıdaki modlar desteklenir:

  • ECB (elektronik kod defteri) modu, iletinin her bloğunu ayrı ayrı şifreler. Bu, güvenli bir şifreleme modu olarak kabul edilmez.
  • CBC (şifreleme bloğu zincirleme) modu, geçerli bloğu karartmak için önceki şifreleme metni bloğunu kullanır. İlk blok için kullanılacak değeri belirlemeniz gerekir. Bu değer başlatma vektör (IV) olarak adlandırılır.
  • CCM (CBC-MAC ile sayaç) modu, CBC blok şifreleme modunu ileti kimlik doğrulama kodu (MAC) ile kombine eder.
  • GCM (Galois sayaç modu) modu, sayaç şifreleme modunu Galois kimlik doğrulama moduyla birleştirir.

CBC gibi bazı modlar, ilk şifre metni bloğu için bir başlatma vektör (IV) kullanmanızı gerektirir. Yaygın başlatma vektörleri aşağıdadır. CryptographicEngine.Encrypt çağrılırken IV değerini belirtirsiniz. Çoğu durumda IV'nin hiçbir zaman aynı anahtarla yeniden kullanılamamış olması önemlidir.

  • Sabit, şifrelenecek tüm iletiler için aynı IV'yi kullanır. Bu bilgi sızdırılır ve kullanımı önerilmez.
  • Sayaç, her blok için IV'yi artırır.
  • Rastgele bir pseudorandom IV oluşturur. IV'yi oluşturmak için CryptographicBuffer.GenerateRandom kullanabilirsiniz.
  • Nonce-Generated, şifrelenecek her ileti için benzersiz bir sayı kullanır. Genellikle, nonce değiştirilmiş bir ileti veya işlem tanımlayıcısıdır. Nonce gizli tutulması gerekmez, ancak hiçbir zaman aynı şifreleme anahtarı ile yeniden kullanılması hiçbir şekilde uygun değildir.

Çoğu mod düz metin uzunluğunun blok boyutunun tam katı olmasını gerektirir. Bu genellikle uygun uzunluğu elde etmek için düz metni doldurmanızı gerektirir.

Blok şifrelemeleri sabit boyutlu veri bloklarını şifrelese de, akış şifreleri düz metin bitlerini sahte bir bit akışıyla (anahtar akışı olarak adlandırılır) birleştiren simetrik şifreleme işlevleridir. Çıkış geri bildirim modu (OTF) ve sayaç modu (CTR) gibi bazı blok şifreleme modları, blok şifrelemesini etkili bir şekilde akış şifrelemesine çevirir. Ancak RC4 gibi gerçek akış şifreleri genellikle blok şifreleme modlarının başaradığından daha yüksek hızlarda çalışır.

Aşağıdaki örnekte simetrik anahtar oluşturmak için SymmetricKeyAlgorithmProvider sınıfının nasıl kullanılacağı ve verileri şifrelemek ve şifresini çözmek için nasıl kullanılacağı gösterilmektedir.

Asimetrik anahtarlar

Ortak anahtar şifrelemesi olarak da adlandırılan asimetrik anahtar şifrelemesi, şifreleme ve şifre çözme işlemlerini gerçekleştirmek için ortak anahtar ve özel anahtar kullanır. Anahtarlar farklıdır ancak matematiksel olarak ilişkilidir. Genellikle özel anahtar gizli tutulur ve ortak anahtar ilgili taraflara dağıtılırken verilerin şifresini çözmek için kullanılır ve verileri şifrelemek için kullanılır. Asimetrik şifreleme verileri imzalamak için de yararlıdır.

Asimetrik şifreleme simetrik şifrelemeden çok daha yavaş olduğundan, büyük miktarda veriyi doğrudan şifrelemek için nadiren kullanılır. Bunun yerine, genellikle anahtarları şifrelemek için aşağıdaki şekilde kullanılır.

  • Alice, Bob'un ona yalnızca şifrelenmiş iletiler göndermesini gerektirir.
  • Alice bir özel ve genel anahtar çifti oluşturur, özel anahtarını gizli tutar ve genel anahtarını yayımlar.
  • Bob'un Alice'e göndermek istediği bir mesaj var.
  • Bob bir simetrik anahtar oluşturur.
  • Bob, Alice'e olan iletisini şifrelemek için yeni simetrik anahtarını kullanır.
  • Bob, simetrik anahtarını şifrelemek için Alice'in ortak anahtarını kullanır.
  • Bob, şifrelenmiş iletiyi ve zarf içinde şifrelenmiş simetrik anahtarı Alice'e gönderir.
  • Alice, Bob'ın simetrik anahtarının şifresini çözmek için özel anahtarını (özel/genel çiftten) kullanır.
  • Alice, iletinin şifresini çözmek için Bob'un simetrik anahtarını kullanır.

Asimetrik bir algoritma veya imzalama algoritması belirtmek, kısa ömürlü anahtar çifti oluşturmak veya içeri aktarmak ya da anahtar çiftinin ortak anahtar bölümünü içeri aktarmak için AsimetrikKeyAlgorithmProvider nesnesi kullanabilirsiniz.

Anahtarların Türetimi

Genellikle paylaşılan bir gizli anahtardan ek anahtarlar türetmek gerekir. Anahtar türetmek için KeyDerivationAlgorithmProvider sınıfını ve KeyDerivationParameters sınıfında aşağıdaki özel yöntemlerden birini kullanabilirsiniz.

Nesne Açıklama
BuildForPbkdf2 Parola tabanlı anahtar türetme işlevi 2'de (PBKDF2) kullanmak üzere bir KeyDerivationParameters nesnesi oluşturur.
BuildForSP800108 Bir sayma modunda, karma tabanlı ileti kimlik doğrulama kodu (HMAC) anahtar türetme işlevinde kullanılmak üzere bir KeyDerivationParameters nesnesi oluşturur.
BuildForSP80056a SP800-56A anahtar türetme işlevinde kullanılmak üzere bir KeyDerivationParameters nesnesi oluşturur.