Varolan .NET sınıflarımızın şifresini çözebilecekleri metni şifreleyecek bir Python modülü yazmaya çalışıyorum. Anlayabildiğim kadarıyla kod satırlarım yukarı ancak şifresini çözmüyor (C# tarafındaki 'Geçersiz bir dolgu uzunluğu' hatası alıyorum). Pkcs7 kodum iyi görünüyor, ancak araştırma geçersiz anahtarların aynı soruna neden olabileceğini gösteriyor.PBKDF2 Python anahtarları vs .NET Rfc2898
Bu iki kurulum arasında ne fark var? Python:
derived_key = PBKDF2(crm_key, salt, 256/8, iterations)
iv = PBKDF2(crm_key, salt, 128/8, iterations)
encoder = pkcs7.PKCS7Encoder()
cipher = AES.new(derived_key, AES.MODE_CBC, iv)
decoded = cipher.decrypt(encoded_secret)
#encode - just stepped so i could debug.
padded_secret = encoder.encode(secret) # 1
encodedtext = cipher.encrypt(padded_secret) # 2
based_secret = base64.b64encode(encodedtext) # 3
O based_secret C# kadar geçmiş olsun diye düşündüm ve orada deşifre. Ama başarısız oluyor. Aynı şifreleyerek C# kodu: Ben kullanıyorum
var rfc = new Rfc2898DeriveBytes(key, saltBytes);
// create provider & encryptor
using (var cryptoProvider = new AesManaged())
{
// Set cryptoProvider parameters
cryptoProvider.BlockSize = cryptoProvider.LegalBlockSizes[0].MaxSize;
cryptoProvider.KeySize = cryptoProvider.LegalKeySizes[0].MaxSize;
cryptoProvider.Key = rfc.GetBytes(cryptoProvider.KeySize/8);
cryptoProvider.IV = rfc.GetBytes(cryptoProvider.BlockSize/8);
using (var encryptor = cryptoProvider.CreateEncryptor())
{
// Create a MemoryStream.
using (var memoryStream = new MemoryStream())
{
// Create a CryptoStream using the MemoryStream and the encryptor.
using (var cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write))
{
// Convert the passed string to a byte array.
var valueBytes = Encoding.UTF8.GetBytes(plainValue);
// Write the byte array to the crypto stream and flush it.
cryptoStream.Write(valueBytes, 0, valueBytes.Length);
cryptoStream.FlushFinalBlock();
// Get an array of bytes from the
// MemoryStream that holds the
// encrypted data.
var encryptBytes = memoryStream.ToArray();
// Close the streams.
cryptoStream.Close();
memoryStream.Close();
// Return the encrypted buffer.
return Convert.ToBase64String(encryptBytes);
}
}
}
Python pkcs7 uygulamasıdır: https://gist.github.com/chrix2/4171336
denemek istiyorum ilk şey oluşturulan anahtar C# ve Python aynı olup olmadığını kontrol etmektir. – NullUserException
C# anahtar çıktısı bir bayt dizisi ve Python'daki bir UTF-8 dizesidir. Bunları doğru bir şekilde karşılaştırmak için, .ToBase64 (csharpKey) ve base64.encode (pythonkey) 'ı Dönüştürebilir miyim? Bu bana benzer öğeleri almalı mı? – shelbydz
Bir ton araştırma yaptıktan sonra yardımcı olan birkaç şey buldum: Rfc2898DeriveBytes.GetBytes'in ilk örneği ve PBKDF2'ye yapılan çağrı aynı anahtarı üretiyor. Ancak, MSDN'ye göre, GetBytes yeni bir anahtar oluşturmak için çağrıları birleştiriyor. GetBytes (IV) almak için ikinci kez, çıktı tamamen farklı. – shelbydz