2012-08-08 68 views
1

我已經在我的服務器端代碼,它是在C語言中使用Rijndael(加密算法)。但是我的客戶端是用C#編寫的,C#提供了它自己的Rijndael類來加密和解密。c lang加密。並在c#解密#

在客戶端,我爲密鑰生成使用相同的密碼,但客戶端應用程序無法對其解密。我想用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(); 
    } 
+7

歡迎來到StackOverflow。首先,您應該提供一些相關的代碼細節,並描述您嘗試過的以及您失敗的方式。其次,「請回復」可能被一些人視爲粗魯和注意力尋求。 StackOverflow首先是*社區*的網站,並且僅限於第二個網站:如果您的問題經過充分研究和有趣,人們會回答它,如果不是,他們不會。 – 2012-08-08 05:59:41

+3

這不是關於您使用的語言,而是關於算法及其實現。 – 2012-08-08 06:02:34

+0

@RenéKolařík該語言非常相關,因爲許多這類算法都是使用按位運算符以C編寫的,這在其他語言中可能不適用。 – Lundin 2012-08-08 06:09:25

回答

2

在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。

+0

hi jleahy..i在兩側都使用了相同的十六進制字符串作爲密碼..因此,密碼是相同的@兩邊......但我認爲他們(客戶端和服務器)通過使用相同的密碼生成不同的密鑰 – 2012-08-08 08:07:34

+0

這是因爲,正如我所提到的,使用不同的技術從密碼生成密鑰。如果你可以使這一點相同,它應該工作。我也不確定你是否使用了相同的模式,回答如上。 – jleahy 2012-08-08 13:22:26

+0

問題還沒解決......如果有人知道答案請幫忙 – 2012-08-10 07:44:37