2012-08-08 4 views
1

C 언어로 된 서버 측 코드에서 Rijndael (암호화 알고리즘)을 사용했습니다. 하지만 내 클라이언트는 C#으로 작성되었고 C#은 자체 Rijndael 클래스를 제공하여 암호화하고 해독합니다.암호화. C에서 암호 해독 #

클라이언트 측에서는 키 생성에 동일한 암호를 사용하고 있지만 클라이언트 응용 프로그램에서 암호를 해독 할 수 없습니다. C에서 파일을 암호화하고 .NET에서 파일을 해독하려고합니다 (C#).

서버 코드 : http://www.efgh.com/software/rijndael.txt

클라이언트 코드 :

당신의 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

Welcome to StackOverflow. 먼저 관련 코드 세부 정보를 제공하고 시도한 내용과 실패한 내용을 설명해야합니다. 둘째로, "회신을 부탁합니다"는 무례하고주의를 끌기위한 것으로 간주 될 수 있습니다. StackOverflow는 * 커뮤니티 *의 사이트입니다. 먼저 자신을 위해 두 번째로 : 질문이 잘 연구되고 재미 있으면 사람들이 대답하고 그렇지 않으면 대답하지 않을 것입니다. –

+3

당신이 사용하는 언어에 관한 것이 아니라 알고리즘과 그 구현에 관한 것입니다. –

+0

@ RenéKolařík 이러한 종류의 알고리즘은 비트 단위 연산자를 사용하여 C로 작성 되었기 때문에 언어는 매우 적합합니다. 다른 언어에서는 사용할 수 없습니다. – Lundin

답변

2

이 실제로 해싱 된 후드 (256 비트 키에 암호 문자열을 변환하는 Rfc2898DeriveBytes를 사용하고 SHA-1을 사용하는 패스워드), C 코드에서는 키를 직접 사용하고있다. 키를 직접 사용하도록 C# 코드를 수정하려고합니다 (ASCII 암호가 아닌 256 비트 키처럼 보입니다).

다음은 충분합니다 :

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 코드는 ECB를 사용하는 반면 C# 코드는 CBC를 사용하고 있다고 생각합니다. 암호로 생성 된 C# 코드에는 iv가 있지만 암호는 C 코드에 없습니다.

또한 C 및 C#에서 사용할 수있는 라이브러리를 찾아 대신 사용할 수도 있습니다 (예 : openssl).

+0

안녕하세요 jleahy..i 양쪽에서 암호와 같은 16 진수 문자열을 사용했습니다 .. 그래서 암호가 같은 @ 양쪽에 ...하지만 그들은 (클라이언트 및 서버) 같은 암호를 사용하여 다른 키를 생성 할 것 같아 –

+0

그건 당신이 ' 앞서 언급했듯이 다른 기술을 사용하여 암호에서 키를 생성합니다. 이 비트를 동일하게 만들 수 있다면 작동 할 것입니다.나는 또한 당신이 같은 모드를 사용하고 있는지 확신하지 못하고있다. – jleahy

+0

문제가 아직 해결되지 않았습니다 ... 누군가가 대답을 알고 있다면 도움을주십시오. –