2016-04-10 206 views
1

我試圖使用OpenSSL加密字符串,然後將該簡單字符串傳遞給C#應用程序來解密它。問題是我不能使用共享的私人「明文」密碼,因爲私鑰不會生成相同。如果我使用我生成的c#密鑰作爲-K十六進制密鑰,那麼它解密就好了。OpenSSL對稱密鑰與.NET對稱密鑰 - 不匹配

我覺得密碼不會轉換爲c#CryptDeriveKey和OpenSSL PKCS#5 padding之間的密鑰。再次,如果我在OpenSSL-K中使用c#中的十六進制密鑰,它會正確加密並正確解密。

我見過人們在C#中使用OpenSSL庫的例子。 .NET System.Security.Cryptography與OpenSSL不完全兼容?

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

鍵= E76B45CFD69213824DC968FCC31E39285BAA8A11DD8395DE
加密: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); 

鍵:B5E67ADF58435DBA0D67CDC49410E6BA2004DA2F97432F76
加密:ⅰ+ fxaM3/KAG =

+1

*「我覺得,密碼不被轉換到一個關鍵的C#CryptDeriveKey和OpenSSL PKCS#之間的同5填充......「* - 正確。您需要搜索堆棧溢出,或進入手冊頁並閱讀關於'-pass pass:MyTestKey'和['EVP_BytesToKey'](https://www.openssl.org/docs/manmaster/crypto/EVP_BytesToKey.html) 。 'EVP_BytesToKey'廣泛用於OpenSSL實用程序,如'enc'和'dec'。其他庫甚至複製了與OpenSSL進行交互操作的函數。例如,請參閱Crypto ++和[OPENSSL_EVP_BytesToKey](http://www.cryptopp.com/wiki/OPENSSL_EVP_BytesToKey)。 – jww

+0

謝謝。我已經看到了使用OpenSSL對象的c#實現,因爲您已經注意到了,但我正在尋找OpenSSL方面的解決方案,以與我當前的c#邏輯兼容。似乎不可能 – kenyu73

回答

1

openssl不使用pass上的高級密鑰導出函數,它只是計算輸入的SHA1哈希。

要做到在C#中的等價物,在重點使用SHA1 CSP到ComputeHash()

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

因此,我假設沒有辦法讓OpenSSL來計算與我當前的c#實現相同的十六進制?我必須使用現有的c#代碼,所以我對OpenSSL用戶唯一的解決方法是生成十六進制密鑰,並讓它們使用-K代替明文密碼短語與-k。 – kenyu73