C# c语言中的加密和c语言中的解密#
我在服务器端代码中使用了Rijndael(加密算法),这是用C语言编写的。但是我的客户机是用C编写的,C提供了自己的Rijndael类来加密和解密 在客户端,我使用相同的密码生成密钥,但客户端应用程序无法对其解密。我想用C加密一个文件,然后用.NET(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
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..我在两个方面都使用了相同的十六进制字符串作为密码..所以密码在两个方面都是相同的@但我认为它们(客户端和服务器)使用相同的密码生成不同的密钥,这是因为您使用不同的技术从密码生成密钥,正如我提到的。如果你能使这一点相同,它应该会起作用。我也不确定你使用的是相同的模式,上面的答案已修改。问题尚未解决…如果有人知道答案,请帮助