2016-06-08 2 views
0

C#에서 모든 것을 다시 만들어야합니다. 나는 진짜로 암호화 또는 무언가 같이 것을 결코 취급해야하지 않은 사촌을하기 위하여 무엇을 알지 않는다. C#에서DES C#에서 PHP 로의 암호화가 예상대로 작동하지 않습니다.

나는이있어 :

public static byte[] decrypt(byte[] data, byte[] key) 
    { 
     DESCryptoServiceProvider des = new DESCryptoServiceProvider(); 

     des.Key = key; 
     des.Mode = CipherMode.ECB; 
     des.Padding = PaddingMode.None; 

     return des.CreateDecryptor().TransformFinalBlock(data, 0, data.Length); 
    } 

public static byte[] encrypt(byte[] data, byte[] key) 
    { 
     DESCryptoServiceProvider des = new DESCryptoServiceProvider(); 

     des.Key = key; 
     des.Mode = CipherMode.ECB; 
     des.Padding = PaddingMode.None; 

     return des.CreateEncryptor().TransformFinalBlock(data, 0, data.Length); 
    } 

public static byte[] get8byte(string input) 
    { 
     byte[] ByteArray = new byte[8]; 
     string tmp = string.Empty; 
     int j = 0; 
     for (int i = 0; i < 16; i++) 
     { 
      tmp = "" + input[i]; 
      tmp = tmp + input[i + 1]; 
      ByteArray[j] = byte.Parse(tmp, System.Globalization.NumberStyles.HexNumber); 
      j++; 
      i++; 
     } 
     return ByteArray; 
    } 

와 내가 사용해야하는 키와 같은 암호화 된 사항은 다음과 같습니다 "버퍼"파일이있는 USB 드라이브에서 오는

var Buffer = new char[16]; 
var cMasterKey = new byte[8]; 
byte[] Key = { 
     (byte) '1', (byte) '2', (byte) '3', (byte) '4', (byte) '5', 
     (byte) '6', (byte) '7', (byte) '8' 
}; 
cMasterKey = DESUtils.get8byte(new string(Buffer)); 
MasterKey = DESUtils.decrypt(cMasterKey, Key); 

을 그것에는 16 자의 Masterkey가 포함되어 있습니다. 저는 PHP로 그것을 어떻게 실현하는지 정말로 모르겠습니다. 나는 pack ('C *', $ var)과 같은 것들을 많이 시도했지만 같은 결과를 얻지는 못했습니다. 처리 방법을 알고있는 사람이 있습니까? 내가 올바른 방법에있어 나도 잘 모릅니다하지만이 같은 것들을 시도 : C#에서

$key = pack('C*', 1, 2, 3, 4, 5, 6, 7, 8); 
$masterbyte = pack('C*', $buffer); 
$decmasterkey = mcrypt_decrypt(MCRYPT_DES, $key, $masterbyte, MCRYPT_MODE_ECB); 
+0

도움이되는 대답을 수락하는 것이 좋습니다. 답변을 수락하는 가장 좋은 답변 옆의 빈 체크 표시를 클릭하면 명성이 올라가고 더 많은 기능이 허용됩니다. [reputation faq] (http://stackoverflow.com/faq#reputation) 참고 [ 이 페이지] (http://meta.stackoverflow.com/questions/5234/how-does-accepting-an-answer-work)를 참조하십시오. – zaph

답변

1

'1' 리터럴 문자입니다. 문자는 기본 ASCII 가정하에 바이트로 직접 형변환 될 수 있습니다. 따라서 '1'은 실제로 PHP에서와 같이 0x31 바이트가 아니라 0x31 바이트입니다. $buffer의 디코딩이 올바른지

$key = "12345678"; 

여부

는 그 내용에 따라 달라집니다 당신이 그것을 어떻게 읽어

당신은 "싶다".


일부 노트 :

  • 요즘 DES를 사용하지 마십시오. 정말 불안합니다. AES가 더 나은 대안입니다.

  • ECB mode을 사용하지 마십시오. 결정 론적이며 따라서 의미 론적으로 안전하지 않습니다. 최소한 CBC 또는 CTR과 같은 무작위 모드를 사용해야합니다. padding oracle attack과 같은 공격이 불가능하도록 암호문을 인증하는 것이 좋습니다. 이는 GCM 또는 EAX와 같은 인증 된 모드 또는 encrypt-then-MAC 구성표를 사용하여 수행 할 수 있습니다.

+0

처음에. 귀하의 회신에 감사드립니다. 나는 DES가 안전하지 못하다는 것을 알고 있지만, 그것을 생산 시스템에서 사용하기 때문에 그것을 바꿀 수는 없다. ECB도 마찬가지입니다. 그래서 $ key = "12345678"은 C#의 "bytething"과 같은 질문입니다. – Goneja

+0

@Goneja 그래서 보안은 우선 순위가 아니며, 오늘날과 마찬가지로 흥미 롭습니다. 보안이 취약하다는 사실을 사용자에게 알리시기 바랍니다. – zaph

+0

야, 조금 더 뒤에 다음 조금 PHP 스크립트에서 1 암호화 방법을 변경 theres. – Goneja

관련 문제