OpenSSL加密无法解密C#

OpenSSL加密无法解密C#,c#,unix,encryption,openssl,aes,C#,Unix,Encryption,Openssl,Aes,我一直在努力解密一些在Unix机器上通过SSL加密的数据,我不断收到填充错误,不确定我遗漏了什么 加密文件是一个简单的文本文件,只是说“Hello World” unix中使用的加密命令是: openssl enc-base64-aes-256-cbc-k 123456789012-in test.txt-out cbc64.txt 我有两种解密方法: private static CipherMode sCipherMode=CipherMode.CBC; 私有静态PaddingMode s

我一直在努力解密一些在Unix机器上通过SSL加密的数据,我不断收到填充错误,不确定我遗漏了什么

加密文件是一个简单的文本文件,只是说“Hello World”

unix中使用的加密命令是:

openssl enc-base64-aes-256-cbc-k 123456789012-in test.txt-out cbc64.txt
我有两种解密方法:

private static CipherMode sCipherMode=CipherMode.CBC;
私有静态PaddingMode spadingmode=PaddingMode.PKCS7;
私有常数int-HigKeyLen=32;
私有常量int-HigKeySiz=256;
公共静态字符串解密(字符串文本,//要解密的文本
int-cipherindex//原始加密的强度
)
{
字节[]明文=空;
尝试
{
字符串TENTEXT=Regex.Replace(文本@“\n”和“”);
//从cipherindex获取密码强度
CipherKey=CipherKey.getCipherKey(cipherindex);
//构建并初始化解密程序
RijndaelManaged rijndaelCipher=新的RijndaelManaged();
rijndaelCipher.Mode=sCipherMode;
rijndaelCipher.Padding=sPaddingMode;
rijndaelCipher.KeySize=Key.Size;
rijndaelCipher.BlockSize=Key.Size;
字节[]encryptedData=Convert.FromBase64String(试探文本);
byte[]pwdBytes=System.Text.Encoding.UTF8.GetBytes(pass);
byte[]keyBytes=新字节[Key.Len];
int len=pwdBytes.Length;
if(len>keyBytes.Length)
{
len=keyBytes.Length;
}
复制(pwdBytes,keyBytes,len);
rijndaelCipher.Key=keyBytes;
rijndaelCipher.IV=keyBytes;
ICryptoTransform transform=rijndaelCipher.CreateDecryptor();
明文=transform.TransformFinalBlock(encryptedData,0,encryptedData.Length);
}
捕获(例外e)
{
//测试代码,什么都不做
}
返回System.Text.Encoding.UTF8.GetString(纯文本);
}
这将返回以下错误:填充无效,无法删除

第二种方法:

public静态字符串解密程序(string TextToDecrypt)
{
byte[]EncryptedBytes=Convert.FromBase64String(Regex.Replace(TextToDecrypt,@“\n”,”);
//设置AES提供程序以进行解密。
AESCryptServiceProvider aesProvider=新的AESCryptServiceProvider();
//aesProvider.Key=System.Text.Encoding.ASCII.GetBytes(strKey);
//aesProvider.IV=System.Text.Encoding.ASCII.GetBytes(strIV);
aesProvider.BlockSize=128;
aesProvider.KeySize=256;
//我在openssl中使用的密钥和iv
aesProvider.Key=System.Text.Encoding.UTF8.GetBytes(pass);
aesProvider.IV=System.Text.Encoding.UTF8.GetBytes(pass);
aesProvider.Padding=PaddingMode.PKCS7;
aesProvider.Mode=CipherMode.CBC;
ICryptoTransform cryptoTransform=aesProvider.CreateDecryptor(aesProvider.Key,aesProvider.IV);
byte[]DecryptedBytes=cryptoTransform.TransformFinalBlock(EncryptedBytes,0,EncryptedBytes.Length);
返回System.Text.Encoding.ASCII.GetString(DecryptedBytes);
}
第二种方法会出现问题,因为密码的长度与blocksize不符


我做错了什么?

您的openssl命令是错误的,我认为应该是:
openssl enc-base64-aes-256-cbc-k 123456789012-in test.txt-out cbc64.txt

在阅读代码时,我发现您做出了一些错误的假设:

  • 您正在使用密码作为密钥和IV(从哪里获得的?) 密码不是密钥
  • 假设输出是纯密文
尝试将
-p
参数添加到openssl enc命令中,它将显示salt和派生密钥以及iv

因此,让我们来解决这个问题:

  • OpenSSL生成随机的8个字节
  • OpenSSL使用其“神奇”函数EVP_BytesToKey从PassSwarm和salt中派生密钥和IV
  • OpenSSL输出看起来像:base64(Salted_{salt}{ciphertext})

  • 请修复openssl命令(“-”不是有效参数..它应该是-k吗?其他什么?)这是正确的,我将其更新为正确的,感谢您指出它通常是问题之一,等等。谢谢你,我会在几个小时内尝试一下,然后再回复你,IV和密码匹配的原因是因为使用了-k,我的理解是(-k)将其应用于IV和pass,而-k仅将其作为密钥应用。