1

일반 텍스트 (일반적으로 요즘은 그렇지는 않음) 형식이 인 암호화 된 파일이 제공되었습니다. ~ 80000 bytes
수정 된 암호화 테이블이 포함 된 Vigenere 암호로 암호화되었습니다. 키의 1 바이트와 평문의 1 바이트는 암호문의 1 바이트에 매핑됩니다. 키 문자열에 특정 길이가 있으므로 암호화에 사용 된 키 문자가 키 문자열을 순환합니다.
키는 영숫자 문자 만 포함합니다.ASCII 이외의 형식으로 된 텍스트 파일의 암호 해독

지금까지는 암호문에서 반복되는 세 쌍의 시작 위치의 최소 공약수를 찾아서 키 길이가 30/60임을 확인했습니다. Vigenere를위한 꽤 표준.

이제 해독 된 바이트가 무엇인지 관찰하고 허용 범위를 벗어나는 경우 가능성을 제거하여 키의 가능한 문자를 추측 해 왔습니다 (32-126이 표시되고 16-31, 등)
이것은 작은 키를 가지고 있고 평문은 곧은 ASCII였습니다.

큰 파일과 "새로운 파일 형식"으로 시도하면 가능한 모든 문자가 거부됩니다.
ASCII 문자 세트를 사용하므로 ASCII, Ascii85, Base64, windows-1252, utf-7, QP 및 uuencode가 제거됩니다. 또한 모든 키를 거부 한 EBCDIC 및 ISO8859-1에 대한 필터를 만들었습니다. 010110111011110111110 또는 1111110으로 시작하는 키가 없기 때문에 Utf-8도 실패했습니다.

나머지 문자 인코딩 내가 의심 스럽지만 UTF-16,32, 1 나는 필터하는 방법을 잘 모르겠다.

내 질문은 :

  • 이 내가 잊고 다른 문자 인코딩입니까?
  • 너무 많이 필터링 할 수 있으며 범위를 벗어난 일부 문자는 슬라이드 할 수 있습니까?
  • 파일 형식이 문자 인코딩 이외의 것을 의미 할 수 있습니까? 그렇다면 ASCII 문자를 깨뜨리는 필터로 어떻게 조정할 수 있습니까?
  • 파일 형식이 압축 또는 아카이브 된 경우 어떻게됩니까?

내가 사용하는 필터링 코드는 다음과 같습니다. 필터는 내가 뭘 벗어나려고하는지에 따라 달라질 수 있습니다.

void guessCrypt(string fileName, int keyLength, int index) 
{ 
    byte[] file = cast(byte[])read(fileName); 
    foreach(key;ValidKeyChars) 
    { 
     bool work = true; 
     for(int x = index; x < file.length-10; x+=keyLength) 
     { 
      byte single = file[x]; 
      int res = sdecrypt(single,key); 
      if ((res < 32 && res > 15) || res > 126) //FILTER - this one ASCII 
      { 
       work = false; 
       break; 
      } 
     } 
     if (work == true) 
     { 
      writefln("\nwork: %s",key); 
     } 
    } 

} 

답변

3

나는 기존의 인코딩으로도 신경 쓰지 말 것을 제안합니다. 이를 대체 암호의 또 다른 계층으로 취급하고 문자 주파수에 기반하여 무엇이 무엇에 매핑되는지 연구하십시오. 문자가 사실 연속적이면 분석에 도움이됩니다. 그리고 일단 그들이 실제로 매핑되는 것을 알게되면, 거기에서 어떤 캐릭터 세트를 찾도록 할 수 있습니다. 사실입니다.

+1

keylength는 30이 아니지만 분해가 매우 가깝습니다 (급우로부터 비밀 유지). 그래서 나는 알려진 인코딩을 치는 것을 멈추게하는 결과로 나타나는 주파수 테이블에 많은 노이즈를 가지고있었습니다. 그것은 결국 ASCII였습니다 ... "공통 형식"은 문자 인코딩이 아닌 파일의 내부를 의미했습니다. 당신의 대답은 제가 실제로 요구 한 것에 대한 정확한 답변입니다, 감사합니다. –