2016-04-10 21 views
1

Bir dizeyi şifrelemek için OpenSSL kullanmaya çalışıyorum ve daha sonra bu basit dizeyi şifresini çözmek için bir C# uygulamasına geçiriyorum. Sorun, özel anahtarların aynı üretilmemesi nedeniyle paylaşılan özel "düz metin" şifresini kullanamıyorum. Eğer C# anahtarım anahtarını -K hex anahtarı olarak kullanırsam, o zaman şifreyi çözer.OpenSSL simetrik anahtar vs .NET simetrik anahtar - eşleşmiyor

Parola'nın C# CryptDeriveKey ve OpenSSL PKCS#5 padding arasındaki anahtarla aynı olmadığına inanıyorum.

Yine, on hex anahtarını OpenSSL-K içinde C# 'dan kullanırsam, doğru şekilde şifreler ve doğru şekilde şifresini çözer.

İnsanların C# içindeki OpenSSL kitaplıklarını kullandığı örnekleri gördüm. .NET System.Security.Cryptography, OpenSSL ile tamamen uyumlu değil mi? 3IFZ8w6kLa0 =

// ** code simplified so its compacted (wont build)... 
var tdes = new TripleDESCryptoServiceProvider(); 
tdes.IV = new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 }; 
tdes.Mode = "ECB"; 
tdes.Padding = "PKCS7"; 
var pdb = new PasswordDeriveBytes("MyTestKey", null); 
tdes.Key = pdb.CryptDeriveKey("TripleDES", "SHA1", 192, 0); 

anahtarı:

C:\OpenSSL-Win32\bin>echo test|openssl enc -des-ede3 -e -nosalt -md 
sha1 -base64 -pass pass:MyTestKey -iv 0 -p 

anahtar = E76B45CFD69213824DC968FCC31E39285BAA8A11DD8395DE
şifrelenmiş B5E67ADF58435DBA0D67CDC49410E6BA2004DA2F97432F76
şifrelenmiş: i + fxaM3/gag =

+1

* "Ben Parola kilit C# CryptDeriveKey ve OpenSSL PKCS # arasındaki aynı dönüştürülmüş olmadığını hissetmek 5 doldurma ... "* - Doğru. Yığın Taşması'nda arama yapmalı veya adam sayfalarına girmeli ve 'pass pass: MyTestKey' ve ['EVP_BytesToKey'] hakkında bilgi almalısınız (https://www.openssl.org/docs/manmaster/crypto/EVP_BytesToKey.html) . 'EVP_BytesToKey',' enc' ve 'dec' gibi OpenSSL yardımcı programlarında yaygın olarak kullanılmaktadır. Diğer kütüphaneler OpenSSL ile inter-oping için bu fonksiyonu tekrarlar. Bakınız, örneğin, Crypto ++ ve [OPENSSL_EVP_BytesToKey] (http://www.cryptopp.com/wiki/OPENSSL_EVP_BytesToKey). – jww

+0

Teşekkürler. Zaten belirttiğiniz gibi OpenSSL nesneleri kullanarak C# uygulamaları gördüm, ama geçerli C# mantığı ile uyumlu olması için OpenSSL tarafında bir çözüm arıyordum. Mümkün değil – kenyu73

cevap

1

openssl, pass üzerinde bir fantezi anahtar türetme işlevi kullanmaz, yalnızca girdinin SHA1 karmasını hesaplar.

, C# eşdeğer yapmak anahtarı üzerinde ComputeHash() bir SHA1 CSP kullanmak için:

SHA1CryptoServiceProvider SHA1 = new SHA1CryptoServiceProvider(); 
tdes.Key = SHA1.ComputeHash(System.Text.Encoding.ASCII.GetBytes("MyTestKey")); 
+0

Bu yüzden benim mevcut C# uygulama ile aldığım aynı hex Calc açmak için OpenSSL almak için bir yol olmadığını varsayarak varsayalım? Varolan C# kodunu kullanmam gerekiyor, bu yüzden OpenSSL kullanıcıları için tek çözümüm hex anahtarını oluşturmak ve bunları -K ile düz metin parola yerine -K yerine kullanmalarıdır. – kenyu73

İlgili konular