c lang中的加密。 和c#中的解密

我在我的服务器端代码中使用了Rijndael(加密算法),这是用C语言编写的。 但我的客户端是用C#编写的,C#提供了自己的Rijndael类来加密和解密。

在客户端,我使用相同的密码进行密钥生成,但客户端应用程序无法对其进行解密。 我想用C加密文件并用.NET(C#)解密该文件。

服务器代码: http : //www.efgh.com/software/rijndael.txt

客户代码:

public static void Encrypt() { string password = @"4c696e6775614e6578742431302a4c6f63616c697a6174696f6e2a3949505f3030372a"; // Your Key Here /*UnicodeEncoding UE = new UnicodeEncoding(); byte[] key = UE.GetBytes(password);*/ Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes (password, new byte[] { 0x26, 0xdc, 0xff, 0x00, 0xad, 0xed, 0x7a, 0xee, 0xc5, 0xfe, 0x07, 0xaf, 0x4d, 0x08, 0x22, 0x3c }); string cryptFile = @"F:\Encoding and Decoding\ReadMe_Encrypted.txt"; FileStream fsCrypt = new FileStream(cryptFile, FileMode.Create); RijndaelManaged RMCrypto = new RijndaelManaged(); RMCrypto.KeySize = 256; RMCrypto.BlockSize = 256; byte[] key = pdb.GetBytes(RMCrypto.KeySize / 8); byte[] iv = pdb.GetBytes(RMCrypto.BlockSize / 8); CryptoStream cs = new CryptoStream(fsCrypt, RMCrypto.CreateEncryptor(key, iv), CryptoStreamMode.Write); FileStream fsIn = new FileStream(@"F:\Encoding and Decoding\ReadMe.txt", FileMode.Open); int data; while ((data = fsIn.ReadByte()) != -1) cs.WriteByte((byte)data); fsIn.Close(); cs.Close(); fsCrypt.Close(); } public static void Decrypt() { string password = @"4c696e6775614e6578742431302a4c6f63616c697a6174696f6e2a3949505f3030372a"; // Your Key Here /* UnicodeEncoding UE = new UnicodeEncoding(); byte[] key = UE.GetBytes(password);*/ // PasswordDeriveBytes pdb = new PasswordDeriveBytes(password, new byte[] { 0x26, 0xdc, 0xff, 0x00, 0xad, 0xed, 0x7a, 0xee, 0xc5, 0xfe, 0x07, 0xaf, 0x4d, 0x08, 0x22, 0x3c }); Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(password, new byte[] { 0x26, 0xdc, 0xff, 0x00, 0xad, 0xed, 0x7a, 0xee, 0xc5, 0xfe, 0x07, 0xaf, 0x4d, 0x08, 0x22, 0x3c }); FileStream fsCrypt = new FileStream(@"F:\Encoding and Decoding\ReadMe_Encrypted.txt", FileMode.Open); RijndaelManaged RMCrypto = new RijndaelManaged(); RMCrypto.KeySize = 256; RMCrypto.BlockSize = 256; byte[] key = pdb.GetBytes(RMCrypto.KeySize / 8); byte[] iv = pdb.GetBytes(RMCrypto.BlockSize /8); CryptoStream cs = new CryptoStream(fsCrypt, RMCrypto.CreateDecryptor(key, iv), CryptoStreamMode.Read); // CryptoStream cs = new CryptoStream(fsCrypt, RMCrypto.CreateDecryptor(), CryptoStreamMode.Read); FileStream fsOut = new FileStream(@"F:\Encoding and Decoding\ReadMe_Decrypted.txt", FileMode.Create); int data; while ((data = cs.ReadByte()) != -1) fsOut.WriteByte((byte)data); fsOut.Close(); cs.Close(); fsCrypt.Close(); } 

在您的C#代码中,您使用Rfc2898DeriveBytes将您的密码字符串转换为256位密钥(在引擎盖下,这实际上是使用SHA-1哈希密码),而在C代码中,您直接使用密钥。 您可能希望修改C#代码以直接使用密钥(对我来说它看起来像是256位密钥,而不是ASCII密码)。

以下内容应足够:

 byte[] key = {0x4c, 0x69, 0x6e, 0x67, ...}; 

您还需要修改C程序以使用正确的二进制密钥,而不是在命令行中使用一个。 您可以使用以下内容:

 unsigned char key[KEYLENGTH(KEYBITS)] = {0x4c, 0x69, 0x6e, 0x67, ...}; 

我也不确定你是否使用相同的模式( http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation )。 我认为C#代码可能正在使用CBC而C代码正在使用ECB。 我建议这样做,因为C#代码中有一个iv(从密码生成),但C代码中没有。

您还可以尝试查找可以在C和C#中使用的库,并使用它来代替,例如openssl。