Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何解密在Unix/Solaris上使用AES-128加密的C#文件_C#_Unix_Encryption_Cryptography_Solaris - Fatal编程技术网

如何解密在Unix/Solaris上使用AES-128加密的C#文件

如何解密在Unix/Solaris上使用AES-128加密的C#文件,c#,unix,encryption,cryptography,solaris,C#,Unix,Encryption,Cryptography,Solaris,我收到了一个在Unix Solaris 10/SunOS 5.10计算机上使用$encrypt方法加密的文件。我相信这是使用aes算法完成的 我需要在windows计算机上使用C#解密此文件。我已经被提供了一个16字节的对称密钥,但我不确定如何继续 我发现的几个代码示例提到了IV、块大小、填充、密码模式等。不幸的是,我不知道这些是什么,而且我对标准Unix加密方法的研究也没有得到任何有用的结果。我相信我已经获得了在Unix上解密此文件所需的一切(尽管我没有测试的手段),但在Windows上使用C

我收到了一个在Unix Solaris 10/SunOS 5.10计算机上使用$encrypt方法加密的文件。我相信这是使用aes算法完成的

我需要在windows计算机上使用C#解密此文件。我已经被提供了一个16字节的对称密钥,但我不确定如何继续

我发现的几个代码示例提到了IV、块大小、填充、密码模式等。不幸的是,我不知道这些是什么,而且我对标准Unix加密方法的研究也没有得到任何有用的结果。我相信我已经获得了在Unix上解密此文件所需的一切(尽管我没有测试的手段),但在Windows上使用C#时需要此文件

文件将定期提供(使用相同的密钥),所以我需要一个解决方案,将持续工作

任何帮助都将不胜感激

谢谢

更新:

感谢@Maarten(见评论),我现在有了一个有效的解决方案:

RijndaelManaged objAlgorithm = new RijndaelManaged();
//set the mode, padding and block size
objAlgorithm.Padding = PaddingMode.PKCS7;
objAlgorithm.Mode = CipherMode.CBC;
objAlgorithm.KeySize = 128;
objAlgorithm.BlockSize = 128;

byte[] key = File.ReadAllBytes(@"PATH_TO_KEY_FILE");
byte[] inputBytes = File.ReadAllBytes(@"PATH_TO_INPUT");

byte[] format = new byte[4];
byte[] iterations = new byte[4];
byte[] IV = new byte[objAlgorithm.BlockSize / 8];
byte[] salt = new byte[16];
byte[] cipherText = new byte[inputBytes.Length - format.Length - iterations.Length - IV.Length - salt.Length];

// Split the input array
Array.Copy(inputBytes, 0, format, 0, format.Length);
Array.Copy(inputBytes, format.Length, iterations, 0, iterations.Length);
Array.Copy(inputBytes, (format.Length + iterations.Length), IV, 0, IV.Length);
Array.Copy(inputBytes, (format.Length + iterations.Length + IV.Length), salt, 0, salt.Length);
Array.Copy(inputBytes, (format.Length + iterations.Length + IV.Length + salt.Length), cipherText, 0, cipherText.Length);

Byte[] outputBytes = cipherText;
string plaintext = string.Empty;

using (MemoryStream memoryStream = new MemoryStream(outputBytes))
{
    using (CryptoStream cryptoStream = new CryptoStream(memoryStream, objAlgorithm.CreateDecryptor(key, IV), CryptoStreamMode.Read))
    {
        using (StreamReader srDecrypt = new StreamReader(cryptoStream))
        {
            try
            {
                int iReadBytes = cryptoStream.Read(outputBytes, 0, outputBytes.Length);
                //plaintext = Encoding.UTF8.GetString(outputBytes,0,outputBytes.Length);

                byte[] finalBytes = new byte[iReadBytes];
                Array.Copy(outputBytes, 0, finalBytes, 0, iReadBytes);

                File.WriteAllBytes(DirectoryPath + strOriginalFileName.Replace(".out", ".xml"), finalBytes);
            }
            catch (Exception ex)
            {
                //Handle Error
            }
        }
    }
}

首先,与提供加密文件的人交谈,并从他们那里获得更多详细信息

如果做不到这一点,请做出一些假设,并尝试一些事情,看看会发生什么

你可能会假设IV是在密码文本的前面。您可能会假设使用了CBC模式,或者可能是GCM模式。首先假设PKCS7填充。使用
NoPadding
set进行解密将让您看到如果PKCS7不工作,将使用什么填充


请非常小心,不要使用任何系统默认值,因为源计算机上的默认值可能与您的不同。明确指定所有内容,包括文本的行尾编码,因为Unix与Microsoft不同。即使是很小的细节也会干扰解密。

首先,与提供加密文件的人交谈,并从他们那里获得更多细节

如果做不到这一点,请做出一些假设,并尝试一些事情,看看会发生什么

你可能会假设IV是在密码文本的前面。您可能会假设使用了CBC模式,或者可能是GCM模式。首先假设PKCS7填充。使用
NoPadding
set进行解密将让您看到如果PKCS7不工作,将使用什么填充


请非常小心,不要使用任何系统默认值,因为源计算机上的默认值可能与您的不同。明确指定所有内容,包括文本的行尾编码,因为Unix与Microsoft不同。即使很小的细节也会干扰解密。

您必须将AES与CBC填充和PKCS#7填充一起使用:

算法

支持的算法在
-l
选项中显示其最小和最大密钥大小。这些算法由密码框架提供。每个受支持的算法都是PKCS#11机制的别名,PKCS#11机制是特定算法类型最常用、限制最少的版本。例如,des是
CKM\u des\u CBC\u PAD
的别名,arcfour是
CKM\u RC4
的别名。不支持不带填充或ECB的算法变体

这告诉您,AES也需要CBC和PKCS#7填充

此外,您还必须解析
encrypt
输出的密文结构(它被定义为一个稳定的接口,这意味着它不应在
encrypt
的版本之间更改):

加密的输出文件和解密的输入文件包含以下信息:

  • 输出格式版本号,网络字节顺序为4字节。当前版本为1

  • 密钥生成函数中使用的迭代次数,按网络字节顺序为4字节

  • IV(ivlen字节)[1]。IV数据由等于一个块大小的随机字节生成

  • 密钥生成中使用的Salt数据(16字节)

  • 密文数据

由于使用密钥文件解密不需要迭代和salt,我希望它们要么不存在,要么归零


这应该足以在您控制的任何环境中解密。

您必须将AES与CBC填充和PKCS#7填充一起使用:

算法

受支持的算法在
-l
选项中显示其最小和最大密钥大小。这些算法由加密框架提供。每个受支持的算法都是PKCS#11机制的别名,PKCS#11机制是特定算法类型最常用和限制最少的版本。例如,des is是
CKM_DES_CBC_PAD
的别名,arcfour是
CKM_RC4
的别名。不支持不带填充或ECB的算法变体

这告诉您,AES也需要CBC和PKCS#7填充

此外,您还必须解析
encrypt
输出的密文结构(它被定义为一个稳定的接口,这意味着它不应在
encrypt
的版本之间更改):

加密的输出文件和解密的输入文件包含以下信息:

  • 输出格式版本号,网络字节顺序为4字节。当前版本为1

  • 密钥生成函数中使用的迭代次数,按网络字节顺序为4字节

  • IV(ivlen字节)[1]。IV数据由等于一个块大小的随机字节生成

  • 密钥生成中使用的Salt数据(16字节)

  • 密文数据

由于使用密钥文件解密不需要迭代和salt,我希望它们要么不存在,要么归零


这应该是足够的信息,可以在您控制的任何环境中解密。

您尝试过什么?这个问题是离题的,不需要尝试解决问题。四、块大小等都可以通过快速谷歌搜索来理解。我相信这是使用aes alg完成的