OpenSSL 中的 TripleDES 加密和使用 C# 的解密
TripleDES encryption in OpenSSL and decryption using C#
我使用以下命令在 Openssl 中加密了一个包含 "Hola mundo" 的文件。然后,我想用C#解密这个文件。
enc -des-ede -nosalt -in ArchivoNormal.txt -pass file:MiCertificado.cer -out ArchivoEncryptadoTDEOpenSSL.txt
1) 为了从MiCertificado.cer
得到public键
private byte[] GenerateKey()
{
X509Certificate2 cer = new X509Certificate2();
cer.Import("D:\MiCertificado.cer");
TripleDESCryptoServiceProvider desCrypto = (TripleDESCryptoServiceProvider)TripleDESCryptoServiceProvider.Create();
byte[] results = cer.GetPublicKey();
MD5 md5 = MD5.Create();
int preKeyLength = results.Length;
byte[] prekey = null;
prekey = new byte[preKeyLength];
Buffer.BlockCopy(results, 0, prekey, 0, results.Length);
byte[] key = md5.ComputeHash(prekey);
md5.Clear();
md5 = null;
return key;
}
2) 为了解密加密文件
private void DecryptFile(string source, string destination, byte[] bkey )
{
TripleDESCryptoServiceProvider TDES = new TripleDESCryptoServiceProvider();
TDES.Mode = CipherMode.ECB;
TDES.Padding = PaddingMode.PKCS7;
TDES.KeySize = 192;
TDES.BlockSize = 64;
TDES.Key = bkey;
FileStream fsread = new FileStream(source, FileMode.Open, FileAccess.Read);
ICryptoTransform desdecrypt = TDES.CreateDecryptor();
CryptoStream cryptostreamDecr = new CryptoStream(fsread, desdecrypt, CryptoStreamMode.Read);
StreamWriter fsDecrypted = new StreamWriter(destination);
fsDecrypted.Write(new StreamReader(cryptostreamDecr).ReadToEnd());
fsDecrypted.Flush();
fsDecrypted.Close();
}
它returns一个错误"Datos Incorrectos"
OpenSSL 在您的示例中没有使用证书作为证书,它只是使用文件的内容作为密码。然后它使用 EVP_BytesToKey 将该密码转换为适合您的 3DES 操作的 key/IV,因为您没有指定 MD5 作为摘要。
因为它只是以字节形式读取文件,将其从 DER 编码更改为 PEM 编码,或者带有额外空格的 PEM 编码将更改您的加密输出。
如果您希望在此处使用证书的 public 密钥时执行某些操作,那么您的 openssl 命令不正确。
我使用以下命令在 Openssl 中加密了一个包含 "Hola mundo" 的文件。然后,我想用C#解密这个文件。
enc -des-ede -nosalt -in ArchivoNormal.txt -pass file:MiCertificado.cer -out ArchivoEncryptadoTDEOpenSSL.txt
1) 为了从MiCertificado.cer
得到public键private byte[] GenerateKey()
{
X509Certificate2 cer = new X509Certificate2();
cer.Import("D:\MiCertificado.cer");
TripleDESCryptoServiceProvider desCrypto = (TripleDESCryptoServiceProvider)TripleDESCryptoServiceProvider.Create();
byte[] results = cer.GetPublicKey();
MD5 md5 = MD5.Create();
int preKeyLength = results.Length;
byte[] prekey = null;
prekey = new byte[preKeyLength];
Buffer.BlockCopy(results, 0, prekey, 0, results.Length);
byte[] key = md5.ComputeHash(prekey);
md5.Clear();
md5 = null;
return key;
}
2) 为了解密加密文件
private void DecryptFile(string source, string destination, byte[] bkey )
{
TripleDESCryptoServiceProvider TDES = new TripleDESCryptoServiceProvider();
TDES.Mode = CipherMode.ECB;
TDES.Padding = PaddingMode.PKCS7;
TDES.KeySize = 192;
TDES.BlockSize = 64;
TDES.Key = bkey;
FileStream fsread = new FileStream(source, FileMode.Open, FileAccess.Read);
ICryptoTransform desdecrypt = TDES.CreateDecryptor();
CryptoStream cryptostreamDecr = new CryptoStream(fsread, desdecrypt, CryptoStreamMode.Read);
StreamWriter fsDecrypted = new StreamWriter(destination);
fsDecrypted.Write(new StreamReader(cryptostreamDecr).ReadToEnd());
fsDecrypted.Flush();
fsDecrypted.Close();
}
它returns一个错误"Datos Incorrectos"
OpenSSL 在您的示例中没有使用证书作为证书,它只是使用文件的内容作为密码。然后它使用 EVP_BytesToKey 将该密码转换为适合您的 3DES 操作的 key/IV,因为您没有指定 MD5 作为摘要。
因为它只是以字节形式读取文件,将其从 DER 编码更改为 PEM 编码,或者带有额外空格的 PEM 编码将更改您的加密输出。
如果您希望在此处使用证书的 public 密钥时执行某些操作,那么您的 openssl 命令不正确。