2016-04-10 148 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