2012-01-14 3 views
2

PDF 파일을 .xxx 파일로 암호화하는 PHP 프로그램이 있습니다.이 출력은이 .xxx 파일을 PDF 파일로 다시 해독하는 C# 프로그램에서 읽습니다.출력이 잘못되었습니다

내 문제는 C#으로 해독 된 파일을 열면 PDF 판독기가 파일이 손상되었다고 알립니다. PHP에서 일반 텍스트를 암호화하고 C#에서 해독하면 암호화 된 파일이 생깁니다. 문제가 PDF 파일에만 나타나거나 다른 말로 표현하면 BINARY 파일

모든 제안 사항이 표시됩니다.

참고 : PHP에서

  1. 내가 (패딩은 수동으로 이루어집니다) C#에서
  2. 내가 데이터

를 암호화하고 해독하는 것은 RijndaelManaged 클래스를 사용 Mcrypt 라이브러리 확장 Rijndael을 알고리즘 CBC PKCS7 패딩을 사용 편집 :

다음은 PHP에서 사용하는 암호화 방법입니다.

,
function encrypt($key, $iv, $text) { 
     ini_set ('memory_limit', '-1'); 
     $mcrypt_cipher = MCRYPT_RIJNDAEL_256; 
     $mcrypt_mode = MCRYPT_MODE_CBC; 
     $text=addpadding($text,mcrypt_get_block_size($mcrypt_cipher,'cbc')); 
     $encrypted = rtrim (mcrypt_encrypt ($mcrypt_cipher, $key, $text, $mcrypt_mode, $iv), "\0"); 
     $encrypted = base64_encode ($encrypted); 
     return $encrypted; 
    } 

그리고 여기에는 암호 해독 C#에서 방법 :

public static string DecryptString(string message, string KeyString, string IVString) 
    { 
     byte[] Key = Encoding.UTF8.GetBytes(KeyString); 
     byte[] IV = Encoding.UTF8.GetBytes(IVString); 

     string decrypted = null; 
     RijndaelManaged rj = new RijndaelManaged(); 
     rj.BlockSize = 256; 
     rj.Key = Key; 
     rj.IV = IV; 
     rj.Mode = CipherMode.CBC; 
     rj.Padding = PaddingMode.PKCS7; 
     try 
     { 
      MemoryStream ms = new MemoryStream(); 
      //Encoding enc = new UTF8Encoding(); 
      byte[] messageBytes = Convert.FromBase64String(message); 
      using (CryptoStream cs = new CryptoStream(ms, rj.CreateDecryptor(Key, IV), CryptoStreamMode.Write)) 
      { 
       //byte[] messageBytes = enc.GetBytes(message); 

       cs.Write(messageBytes, 0, messageBytes.Length); 
       cs.Close(); 
      } 
      byte[] encoded = ms.ToArray(); 
      decrypted = Encoding.UTF8.GetString(encoded); 

      ms.Close(); 
     } 
     catch (Exception e) 
     { 
      MessageBox.Show("An error occurred:"+ e.Message); 
     } 
     finally 
     { 
      rj.Clear(); 
     } 

     return decrypted; 
    } 

여기에 내가 C 번호에 해독을 호출하는 방법 내가 출력 작성하는 방법 :

   string Key = cryptography.MD5("X-Ware" + cryptography.MD5("123")); 
       string IV = cryptography.MD5("XWare"); 
       string decrypted = cryptography.DecryptString(contents, Key, IV); 
       string outputFilename = cryptography.MD5(OFD.FileName) + ".tmp"; 

       StreamWriter sw = new StreamWriter("C:\\Windows\\Temp\\" + outputFilename, false, Encoding.UTF8); 
       BinaryWriter bw = new BinaryWriter(sw.BaseStream, Encoding.UTF8); 
       //sw.Write(decrypted); 
       bw.Write(decrypted); 
       sw.Close(); 
       bw.Close(); 
+1

당신이 인코딩/디코딩을 어떻게 붙여 넣을 수 있습니다 사용 ? – greut

+0

해독 된 파일의 파일 크기가 원래 파일 크기와 같습니까? –

+0

Windows에서 나는 추정합니까? –

답변

5

을 나는 문제가 생각 바이너리 PDF 데이터를 PHP 및 C# 측 모두의 텍스트로 취급한다는 점에 유의하십시오.

decrypted = Encoding.UTF8.GetString(encoded); 

은 이진 데이터를 나타내는 경우 의미가 없습니다. encoded은 이진 데이터를 나타냅니다. 이 단계를 건너 뛰고 DecryptString()byte[]으로 반환하도록 정의해야합니다. 그리고 이름도 바꿉니다. 당신은 당신이 ASCII 또는 ANSI 인코딩으로 더 좋은 행운이있을 수 있습니다 문자열로 그것을 원하지 않으면

:

decrypted = Encoding.ASCII.GetString(encoded); 

하지만 오류가 이미 PHP 측에서 발생 될 수 있습니다, 나는 말할 수 없다.

추가는, 난 그냥주의 :

StreamWriter sw = new StreamWriter("C:\\Windows\\Temp\\" + outputFilename, 
      false, Encoding.UTF8); 
    BinaryWriter bw = new BinaryWriter(sw.BaseStream, Encoding.UTF8); 

이는 BinaryWriter를 만들 수있는 매우 지나치게 복잡한 방법입니다. 인코딩은 사용되지 않습니다. 그리고

이것은 길이 접두사가있는 문자열을 작성하므로 PDF가 유효하지 않게됩니다.당신이 string로 해독의 반환을 계속하면

,

File.WriteAllText("C:\\Windows\\Temp\\" + outputFilename, decrypted); 

를 사용하고 byte[] (권장)로 돌아 왔을 때,

File.WriteAllBytes("C:\\Windows\\Temp\\" + outputFilename, decrypted); 
+0

또한, 비록 내가 방법에 대한 모든 문서를 읽지 않고 이것에 대해 확신 할 수는 없지만, 데이터가 PHP로 패딩 된 것처럼 보이지만 C#에서는 "패딩되지 않음"을 결코 보일 수 없습니다. –

+1

@ Joachim : OP는 프로세스가 텍스트 데이터에 대해 작동한다고 말하면 기본 패딩 설정이 OK라고 생각합니다. –

+0

네, 확실히 문제인지는 모르겠습니다 만, 파일이 동일한 크기 였는지 마지막에보아야 할 것이 있습니다 :) –