2014-09-05 1 views
1

그래서 C#을 사용하여 Blowfish를 사용하여 암호화 된 16 진수 바이트로 표현 된 문자열을 해독 할 수 있음을 증명하는 과제가 주어졌습니다. 진수 바이트에C#에서 복어를 사용하여 16 진수 문자열을 해독하는 방법은 무엇입니까?

  • 암호화 된 문자열을 표현 :

    여기가 무슨.

  • 암호화 키를 문자열로 사용합니다.

아마도 나는 조금 순진하지만이 과정은 간단 할 것이라고 생각했습니다.

즉 인터넷에서 Blowfish 구현을 가져온 다음 암호화 키와 암호화 된 텍스트를 간단히 연결하면 문자열을 읽을 수있는 형식으로 출력합니다.

불행히도 이러한 경우는 아닙니다. 지난 몇 시간 동안 저는 두 개의 다른 라이브러리를 시도했지만 BouncyCastle이 가장 인기있는 것으로 보였습니다. 그러나 많은 문서 (다른 질문과 다른 사이트에서 언급)가 없기 때문에이 작업을 수행하는 방법에 대한 단서가 없습니다.

여기에 내가 가진 무엇 : 내가 BouncyCastle와 함께 제공되는 테스트 클래스에서이 적응하기 위해 노력했습니다

using Org.BouncyCastle.Crypto.Engines; 
using Org.BouncyCastle.Crypto.Parameters; 
using Org.BouncyCastle.Utilities.Encoders; 
using Org.BouncyCastle.Crypto; 


public class CryptTest 
{ 
    public void Decrypt() 
    {   
     var engine = new BlowfishEngine(); 
     var param = new KeyParameter(System.Text.Encoding.ASCII.GetBytes("sdjerwioukjiefdjewiujewiunjeuwer")); 
     var input = Hex.Decode("db247cceae61fddbcbb62d00281e0446"); 

     BufferedBlockCipher cipher = new BufferedBlockCipher(engine); 

     cipher.Init(false, param); 

     byte[] outBytes = new byte[input.Length]; 

     int len1 = cipher.ProcessBytes(input, 0, input.Length, outBytes, 0); 

     cipher.DoFinal(outBytes, len1); 

     Console.WriteLine(System.Text.Encoding.ASCII.GetString(outBytes)); 
    } 

} 

. 누군가 내가하고 싶은 것을하는 좋은 모범의 방향으로 나를 가리킬 수 있습니까?

적어도 내가 겪고있는 문제 중 하나는 키와 관련이 있다고 생각합니다. 16 진수 형식 인 것처럼 보이지 않지만 어떻게해야 할 지 모르겠습니다.

UPDATE : 그것은 내가 원하는 것을 가까이보기 때문에

는 또한 here에서 다른 라이브러리를 시도했습니다.

BlowFish b = new BlowFish(System.Text.Encoding.ASCII.GetBytes("sdjerwioukjiefdjewiujewiunjeuwer")); 

var result1 = b.Decrypt_CBC("db247cceae61fddbcbb62d00281e0446"); 
var result2 = b.Decrypt_ECB("db247cceae61fddbcbb62d00281e0446"); 

Console.WriteLine(result1 + "\n" + result2); 

하지만 여전히지고있어 횡설수설이 돌아왔다.

업데이트 2 :

는 당분간 간단 뭔가가는 종료. Bouncy Castle에 대한 문서가 (명백하게) 부족하기 때문에 암호화의 경험/이해력이 제한적인 사람들은이를 올바르게 사용하기가 매우 어렵습니다. 그러나 앞으로는이 일을 진행하기를 원할 것입니다. 그래서 누군가가 저에게 올바른 방향을 제시 할 수 있다면 여전히 관심이 있습니다.

+0

어떤 문제가 있습니까? – SLaks

+0

기본적으로 문자열의 암호를 해독하지 않으므로 이유를 파악하기 시작해야합니다. –

+0

그래서 ** 어떻게됩니까? 폭발 하는가? – SLaks

답변

0

첫 번째 청크의 암호 해독을 무시하고 있습니다 (ProcessBytes()).

대신 직접 암호 객체를 사용하여, 당신은 CryptoStream를 사용해야합니다 : 당신이 자신을 부르는 각각의 결과를 연결할 필요가 있으므로

using (var reader = new StreamReader(new CryptoStream(new MemoryStream(input), cipher, CrytoStreamMode.Read)) 
    Console.WriteLine(reader.ReadToEnd()); 

BouncyCastle은 ICryptoTransform를 구현하지 않습니다.