C# c语言中的加密和c语言中的解密#

C# c语言中的加密和c语言中的解密#,c#,c,encryption-symmetric,C#,C,Encryption Symmetric,我在服务器端代码中使用了Rijndael(加密算法),这是用C语言编写的。但是我的客户机是用C编写的,C提供了自己的Rijndael类来加密和解密 在客户端,我使用相同的密码生成密钥,但客户端应用程序无法对其解密。我想用C加密一个文件,然后用.NET(C#)解密该文件 服务器代码: 客户端代码: public static void Encrypt() { string password = @"4c696e6775614e6578742431302a4c6f6

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

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

服务器代码:

客户端代码:

    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, ...};
我也不确定您是否使用相同的模式()。我认为C代码可能使用CBC,而C代码使用ECB。我建议这样做,因为C代码(由密码生成)中有一个iv,但C代码中没有


您还可以尝试从C和C中找到一个可以使用的库,并改用它,例如openssl。

欢迎使用StackOverflow。首先,您应该给出一些相关的代码细节,并描述您尝试了什么以及如何失败。第二,“请回答”可能会被一些人认为是粗鲁和寻求注意。StackOverflow是一个首先面向社区,然后才面向你自己的网站:如果你的问题经过充分研究且有趣,人们会回答,如果不是,他们不会回答。这不是关于你使用的语言,而是关于算法及其实现。@Rene Kolařík语言非常相关,由于许多此类算法都是用C语言编写的,使用的是位运算符,这在其他语言中可能不可用。我可以用Obj-C和C#做同样的事情。所以,你一定能做到。只需提供您使用的代码的两个方面,我相信这里会有人为您解答。我想知道是否有任何方法或算法支持这两种语言Shi jleahy..我在两个方面都使用了相同的十六进制字符串作为密码..所以密码在两个方面都是相同的@但我认为它们(客户端和服务器)使用相同的密码生成不同的密钥,这是因为您使用不同的技术从密码生成密钥,正如我提到的。如果你能使这一点相同,它应该会起作用。我也不确定你使用的是相同的模式,上面的答案已修改。问题尚未解决…如果有人知道答案,请帮助