2012-05-25 2 views
-1

C#에서 무언가를 암호화하는 데 어려움이 있습니다.C# DES ECB 암호화

나는 3 개의 변수가 있습니다. 우선 하나는 16 진수로하고, X의 값이 IE 0072701351979990 번째는 16 자리 16 진수 값을 불러올 수,

이 두 값은 키를 얻을 XOR 'ED해야 호출 Y IE 3008168011FFFFFF을 할 DES-ECB 암호화.

따라서 307a66934068666f가된다. 이제 암호화를위한 핵심 요소가되었습니다. 그럼 내가 암호화를위한 64 비트입니다 내 datablock이있다. 0E329232EA6D0D73

이제 암호화를 위해 다음 코드가있다. 암호화 결과를 다시 데이터 블록과 XOR해야하고 이 결과 64 비트 결과가됩니다. 그렇지 않다.

이 내가 뭘 잘못 암호화

$ public static string DESEncrypt(string keyBlock,string dataBlock){ 
     DES desEncrypt = new DESCryptoServiceProvider(); 
     byte[] keyBlockBytes = BitConverter.GetBytes(Convert.ToInt64(keyBlock, 16)); 
     byte[] dataBlockBytes = BitConverter.GetBytes(Convert.ToInt64(dataBlock, 16)); 
     desEncrypt.Mode = CipherMode.ECB; 
     desEncrypt.Key = keyBlockBytes; 
     ICryptoTransform transForm = desEncrypt.CreateEncryptor(); 
     MemoryStream enecryptedStream = new MemoryStream(); 
     CryptoStream cryptoStream = new CryptoStream(enecryptedStream, transForm, CryptoStreamMode.Write); 
     cryptoStream.Write(dataBlockBytes, 0, dataBlockBytes.Length); 
     cryptoStream.FlushFinalBlock(); 
     byte[] encryptedData = new byte[enecryptedStream.Length]; 
     enecryptedStream.Position = 0; 
     enecryptedStream.Read(encryptedData, 0, encryptedData.Length); 
     string enCryptedHex = BitConverter.ToString(encryptedData); 

     return enCryptedHex.Replace("-",""); 
    } 

내 코드는?

업데이트 된 질문은 나는 CodeInChaos에서 위의 솔루션을 테스트했습니다. 64 비트 결과를 돌려줍니다. 그러나 여전히 잘못된 것이 있습니다.

여기 내 업데이트 된 코드입니다.

키 블록 값은 ababababababab 이고 데이터 블록 값은 215135734068666F입니다.

결과 64 비트 결과는 데이터 블록과 다시 XOR됩니다.

최종 답변은 414945DD33C97C47인데, 288a08c01a57ed3d가 나옵니다.

왜 제대로 나오지 않습니까?

다음은 암호화에 대한 공급 업체 문서의 사양입니다.

암호화는 홀수 패리티를 가진 단일 64- 비트 DES 키를 사용하여 ECB 모드의 단일 DES 인 FIPS 46-3에 따라 DEA입니다.

$  public static string DESEncrypt(string keyBlock,string dataBlock){ 
     DES desEncrypt = new DESCryptoServiceProvider(); 
     byte[] keyBlockBytes = BitConverter.GetBytes(Convert.ToInt64(keyBlock, 16)); 
     byte[] dataBlockBytes = BitConverter.GetBytes(Convert.ToInt64(dataBlock, 16)); 
     desEncrypt.Mode = CipherMode.ECB; 
     desEncrypt.Key = keyBlockBytes; 
     desEncrypt.Padding = PaddingMode.None; 
     ICryptoTransform transForm = desEncrypt.CreateEncryptor(); 
     MemoryStream enecryptedStream = new MemoryStream(); 
     CryptoStream cryptoStream = new CryptoStream(enecryptedStream, transForm, CryptoStreamMode.Write); 
     cryptoStream.Write(dataBlockBytes, 0, dataBlockBytes.Length); 
     cryptoStream.FlushFinalBlock(); 
     byte[] encryptedData = enecryptedStream.ToArray(); 
     string enCryptedHex = BitConverter.ToString(encryptedData); 
     enCryptedHex = enCryptedHex.Replace("-", ""); 
     long iDeaEncrypt = Convert.ToInt64(enCryptedHex, 16); 
     long iDataBlock = Convert.ToInt64(dataBlock, 16); 
     long decoderKey = iDeaEncrypt^iDataBlock; 
     string decKeyHex = Convert.ToString(decoderKey, 16); 
     return decKeyHex; 
    } 
+0

"이제 암호화를 위해 다음과 같은 코드가 있습니다. 암호화 결과는 데이터 블록과 다시 XOR되어야하며 결과는 64 비트가되어야합니다. 그게 무슨 뜻 이니? – CodesInChaos

답변

0

난 당신이 PaddingMode.None에 패딩을 설정할 필요가 있다고 생각 :

desEncrypt.Padding = PaddingMode.None; 

하지만 DES 및 ECB 당신이 원하는 것을 정말 있다면 당신은 정말 열심히 생각해야한다.


b.tw

byte[] encryptedData = new byte[enecryptedStream.Length]; 
encryptedStream.Position = 0; 
encryptedStream.Read(encryptedData, 0, encryptedData.Length); 

의해 대체 될 수있다 :

encryptedData = encryptedStream.ToArray(); 
+0

안녕하세요! 고맙습니다. 이것은 100 % 일했습니다. 암호화의 결과는 이제 64 비트 결과입니다. DES와 ECB를 사용하겠다는 나의 결정이 아닙니다. 이 암호화를 사용하는 물건을 생성하는 하드웨어입니다. 그러나 일부 오래된 하드웨어에서만 가능합니다. 새로운 것들은 이것을 사용하지 않습니다. BTW를 가져 주셔서 감사합니다. – MariusvStraaten

+0

나는 모든 것을 테스트 한 후 결과 값과 비교하여 일치하지 않는다. 이들은 저에게 준 시험 값입니다. 데이터 블록은 215135734068666F이고 키 블록은 ababababababab입니다. 결과 암호화는 origanal 데이터 블록과 XOR됩니다. 내가 얻으려는 최종 결과는 414945DD33C97C47입니다. 하지만 나는 288a08c01a57ed3d를 얻는다. – MariusvStraaten

0

아마도은 DEA가 FIPS에서 지정 등 전치 테이블을 사용되도록 FIPS 46-3 표준을 사용하는 DES 공급자를 설정할 필요가 46- 삼.불행히도 나는이 같은 문제로 어려움을 겪고있다.