2015-08-19 6 views
7

Sistemimizde bir çok paylaşımlı işlevsellik ile çalışmak ve PCL kitaplıklarına taşımak için çalışıyoruz. PCLCrypto kullanarak bir sorun yaşıyorum. Veritabanımızda mevcut bazı verileri alıyorum ve aynı algoritma ile şifresini çözmeye çalışıyorum. Değeri geri aldım, ama sonunda sadece çöp olan 16 tane ekstra bayt var.System.Security.Cryptography vs PCLCrypto

bakınız Kod aşağıda: Eski Algoritma eski sürümünü kullanarak PCLCrypto

public static string SymmetricDecrypt(this string cipherText, string key, SymmetricAlgorithm algorithm) { 
    byte[] keyBuffer = Convert.FromBase64String(key.Hash(HashAlgorithm.MD5)); 
    byte[] cipherTextBuffer = Convert.FromBase64String(cipherText); 

    ISymmetricKeyAlgorithmProvider symmetricAlgorithm = WinRTCrypto.SymmetricKeyAlgorithmProvider.OpenAlgorithm(PCLCrypto.SymmetricAlgorithm.AesEcb); 

    var symmetricKey = symmetricAlgorithm.CreateSymmetricKey(keyBuffer); 
    var decryptor = WinRTCrypto.CryptographicEngine.CreateDecryptor(symmetricKey); 
    byte[] plainTextBuffer = decryptor.TransformFinalBlock(cipherTextBuffer, 0, cipherTextBuffer.Length); 
    return UTF8Encoding.UTF8.GetString(plainTextBuffer, 0, plainTextBuffer.Length); 
} 

kullanılarak

public static string SymmetricEncrypt(this string plaintext, string key, SymmetricAlgorithm algorithm) 
{ 
    byte[] keyBuffer = Convert.FromBase64String(key.Hash(HashAlgorithm.MD5)); 
    byte[] plainTextBuffer = Encoding.UTF8.GetBytes(plaintext); 

    var symmetricAlgorithm = new AesCryptoServiceProvider(); 
    symmetricAlgorithm.Key = keyBuffer; 
    symmetricAlgorithm.Mode = CipherMode.ECB; 

    var encryptor = symmetricAlgorithm.CreateEncryptor(); 
    byte[] cipherBuffer = encryptor.TransformFinalBlock(plainTextBuffer, 0, plainTextBuffer.Length); 
    symmetricAlgorithm.Clear(); 

    return Convert.ToBase64String(cipherBuffer); 
} 


public static string SymmetricDecrypt(this string cipherText, string key, SymmetricAlgorithm algorithm) 
    { 
     byte[] keyBuffer = Convert.FromBase64String(key.Hash(HashAlgorithm.MD5)); 
     byte[] cipherTextBuffer = Convert.FromBase64String(cipherText); 
     var symmetricAlgorithm = new AesCryptoServiceProvider(); 
     symmetricAlgorithm.Key = keyBuffer; 
     symmetricAlgorithm.Mode = CipherMode.ECB; 

     var decryptor = symmetricAlgorithm.CreateDecryptor(); 
     byte[] plainTextBuffer = decryptor.TransformFinalBlock(cipherTextBuffer, 0, cipherTextBuffer.Length); 
     symmetricAlgorithm.Clear(); 

     return Encoding.Default.GetString(plainTextBuffer); 
    } 

Şifre çözme System.Security.Cryptography kullanarak: plainTextBuffer 16 byte, yeni versiyonu 32 bayt.

Yardım!

+1

Etkin bir GitHub projesidir, böylece yazarlarına ulaşmak için bir sorunu bildirmeniz gerekir. –

+0

Gönderdiğiniz kodun en alt satırında, plainTextBuffer yazmanız gerektiği anlamına gelir. Buradaki zorluk, GitHub projesinin sadece diğer API'lere erişmesi ve kendi AES'lerini gerçekleştirmemesidir. Ama bunu söylediğimde, bu davranış için ne depoda ne de kodunuzda bir neden bulamıyorum. Garip, siz düzlemselTextBuffer'ı, algoritmanın gerçek blok boyutundan daha büyük bir zamanda geri döndürmediğimi düşündüğüm bir işlev olan TransformFinalBlock çağrısında bildiriyorsunuz, ancak bu ekstra baytlarınız var. Stumped olduğumu söylediğim için üzgünüm. – WDS

cevap

4

Bu, bir dolgu sorunu gibi görünüyor.

AesCryptoServiceProvider'ın temel olan .NET'teki SymmetricAlgorithm taban sınıfının kaynağına bakarak, varsayılan dolgu PaddingMode.PKCS7'dir. Bir dolgu modunu tanımlamış görünmüyorsanız, varsayılanın hala geçerli olduğunu varsayıyorum.

PCLCrypto kütüphanesini daha önce kullanmamışken, github'a hızlıca baktığınızda birkaç AesEbb algoritması vardır: AesEcb ve AesEcbPkcs7. AesEcb isminden bir dolgu modunun yokluğu, paddingMode.None .NET kitaplıklarına eşdeğer olan bir dolguya sahip olmadığına (ve dolayısıyla herhangi bir dolgu kaldırılmadığına) işaret eder.

PCLCrypto'daki PCLCrypto.SymmetricAlgorithm.AesEcbPkcs7 algoritmasını kullanmayı deneyin ve bunun, çıktının sonunda gördüğünüz dolguyu kaldırıp kaldırmayacağını görün.

Güncelleme

Sadece bu test ettik ve doğru şekilde çalışmak ve görüyor olacağını dolguyu kaldırmak için görünür:

public static string SymmetricDecrypt(this string cipherText, string key, SymmetricAlgorithm algorithm) { 
    byte[] keyBuffer = Convert.FromBase64String(key.Hash(HashAlgorithm.MD5)); 
    byte[] cipherTextBuffer = Convert.FromBase64String(cipherText); 

    ISymmetricKeyAlgorithmProvider symmetricAlgorithm = WinRTCrypto.SymmetricKeyAlgorithmProvider.OpenAlgorithm(PCLCrypto.SymmetricAlgorithm.AesEcbPkcs7); 

    var symmetricKey = symmetricAlgorithm.CreateSymmetricKey(keyBuffer); 
    var decryptor = WinRTCrypto.CryptographicEngine.CreateDecryptor(symmetricKey); 
    byte[] plainTextBuffer = decryptor.TransformFinalBlock(cipherTextBuffer, 0, cipherTextBuffer.Length); 
    return UTF8Encoding.UTF8.GetString(plainTextBuffer, 0, plainTextBuffer.Length); 
}

tek değişiklik dan algoritmasını değişiyordu PCLCrypto.SymmetricAlgorithm.AesEcb to PCLCrypto.SymmetricAlgorithm.AesEcbPkcs7

+0

Sen benim kahramanımsın. Çok teşekkür ederim. –

İlgili konular