2016-03-22 20 views
2

Çok sayıda farklı C# şifreleme örneğine bakıyordum. Çoğu örnekte, Şifreleme Anahtarı ve Başlangıç ​​Vektörü (IV) şifreleme/şifre çözme yöntemlerine bir bayt dizisi olarak geçirilir.Şifreleme anahtarını ve IV'ü dizeleri olarak Kaydetme/Dönüştürme

Anahtar ve IV dizeleri olarak saklamak istiyorum. Donanım Güvenliği Modülünde Anahtar ve SQL Server veritabanındaki bir nvarchar olarak IV.

Anahtar ve IV'ün dize olarak nasıl düzgün bir şekilde dönüştürülebileceğiyle ilgili olarak podyuma koşuyorum. Bazı örnekler Base64 Kodlaması'nı kullanırken diğer örnekler Encoding.UTF8'u kullanır. Ben şifreleme yönteminin içine IV'ün bu dize temsilini geçmek ve daha sonra geri dönüştürmek zaman İşte

... Ancak

using (var aesProvider = new AesCryptoServiceProvider()) 
{ 
    aesProvider.GenerateIV(); 
    var ivBase64 = Convert.ToBase64String(aesProvider.IV); 
    return ivBase64; 
} 

bir IV üretir ve bir Base64 dizeye dönüştürür bir örnektir Bir bayt dizisi aşağıdaki kod IV uygun boyut değil diyerek başarısız olur.

byte[] initVectorBytes = Encoding.UTF8.GetBytes(initializationVector);` 
// intermediate code excluded for brevity 
ICryptoTransform encryptor = symmetricKey.CreateEncryptor(keyBytes, initVectorBytes); 

bir bayt dizisi ve dize gösterimi arasında ileri ve geri bir şifreleme anahtarı ve IV dönüştürülmesi standart bir yolu var mı?

+2

[Bu şifreleme en iyi cevaptır] (http://stackoverflow.com/a/10366194/542251) buldum. Ben sadece bu kodu şimdi kullanıyorum. Bir string BTW – Liam

+0

@ Lii kabul eder - Harika örnek için teşekkürler! Kod örneğinden hangisini kullanıyorsunuz? Listelenen bir grup var. – webworm

+0

Bu bağlıdır! Son zamanlarda SimpleDecryptWithPassword kullanmıştım, güvenlik konusunda endişelenmemiştim, esasen bazı verileri gizlemek istemiştim. Kullandığınız yöntem, – Liam

cevap

4

İkili verileri UTF-8'e ve tekrar geri dönüştürebilirsiniz. Bazı ikili diziler geçerli UTF-8 karakterleri değildir ve verilerin kaybolduğu UTF-8'e dönüştürüldüğünde. Bu, bazı karakterlerin eşdeğerine denk geliyor mu? kodlamalar arasında dönüştürme yaparken.

Bunun yerine, ikili veri taban64 kodlamasını metne kullanabilir ve sonra orijinal ikili dosyayı geri almak için base64 kodunu çözebilirsiniz.

Bunu UTF-8'e dönüştürmeyi deneyin, örneğin: "\ x00? \ Xdc \ x80" (bu dört bayttır: 0, 63, 220, 128). UTF-8'e kodlanmaz - geçerli değil.

standart yol Baz-64 kodlaması kullanıyor - How do I encode and decode a base64 string?

+1

Awesome örneğinin ne kadar güvenli olmasını istediğinize bağlı olacaktır. Sanırım kafam karışıyordu çünkü Şifreleme/Şifre Çözme yöntemleri kullandığım UTF8 kodlamasını kullandı .. 'byte [] plainTextBytes = Encoding.UTF8.GetBytes (plainText);' – webworm