2014-04-20 3 views
0

내 전치 암호화 과정을 역전시키는 방법에 대해 머리를 감싸는 데 문제가 있습니다. 기본적으로 해독하려고합니다. 내 머리 속에 나는 암호문을 해독하기 위해 암호화 된 문자 메시지를 받아 들여야하며, 그 다음에 그것을 중계 배열의 위치로 대체해야한다고 생각한다.암호 해독

예를 들어, 전치 테이블을 사용하면 {2 4 0 1 3} i는 암호화 된 텍스트를 입력 배열로 스캔하여 암호화 된 텍스트를 0-4로 지정합니다. 예를 들어, {2 4 0 1 3}의 전치 테이블을 기반으로 한 "Jacks"는 "csJak"으로 암호화됩니다. 그러나 만약 내가 "csJak"에서 c가 입력 [0] 인 배열로 스캔한다면, s는 입력 [1]입니다.

그런 식으로 암호화 된 메시지에서 스캔 된 첫 번째 글자는 인쇄 될 것으로 가정되는 전치 슬롯의 세 번째 슬롯에 해당합니다. 그러나 내 생각을 코드에 삽입하는 방법을 모르겠다.

현재 조바꿈 암호화 암호 코드 :

#include <stdio.h> 

int main(int argc, char *argv[]){ 

char input3[256]; 

char ch; 
int i, j, k, npos; 

FILE *file1=fopen(argv[1], "r"); 
FILE *file2=fopen(argv[2], "w"); 

sscanf(argv[3], "%d", &npos); 
char transposition[npos]; 
for(i=0;i<npos;++i){ 
sscanf(argv[4+i], "%d", &k); 
transposition[i] = k; 
} 

int len= sizeof(transposition); 
char temp[len]; 

while(fgets(input3,sizeof(input3),file1)!=NULL){ 
i=0; 
do { 
for(j=0;j<len;j++){ 
    ch = input3[i]; 
    if(ch != '\n' && ch != '\0'){ 
     temp[j] = ch; 
     ++i; 
    } else { 
     temp[j] = ' '; 
    } 
} 
if(temp[0] != '.') 
    for(k=0;k<len;k++){ 
     fprintf(file2,"%c", temp[transposition[k]]); 
    } 
} 
while(ch != '\n' && ch != '\0'); 
fprintf(file2,"\n"); 
} 
return 0; 
} 

아주 기본적인 전치 암호 해독 프로그램

파일 "decrypttrans1.txt"만에 단어 "잭"을 가지고 가정 :

#include <stdio.h> 

int main(int argc, char *argv[]){ 

char input[5], decrypted[256]; 
int i, j, k, ii; 
int transposition[5]={'2','4','0','1','3'}; 
char plainText[5]; 

FILE *file1=fopen("decrypttrans1.txt", "r"); 

for(ii=0; ii<5;ii++) { 
     decrypt[encrypt[ii]]=ii; 
    } 


for(ii=0;ii<5;ii++){ 
    plainText[ii]=input[decrypt[ii]]; 
    printf("%c", plainText[ii]); 
} 

} 
return 0; 
} 
+0

질문에 답변이 있으면 파기해서는 안됩니다. –

답변

2

전치 테이블은 문자가 어디서 끝 났는지 알려줍니다. 스크램블 드 코드와 암호화 배열을 볼 때 다음과 같이 해독 할 수 있습니다 (예제를 사용하여).

for(ii = 0; ii < 5; ii++) { 
    plainText[ii] = encrypted[cypher[ii]]; 
} 

이 작동하는지 참조 :
transposition "cypher" = { 2, 4, 0, 1, 3 }' 

original string =    J a c k s 

encrypted string =   c k J s a 

지금 당신은 암호화 문자열 보면, 해독

ii = 0:  cypher[0] = 2, put 'J' into position '0' J.... 
ii = 1:  cypher[1] = 4, put 'a' into position '1' Ja... 
ii = 2:  cypher[2] = 0, put 'c' into position '2' Jac.. 

을 당신은 여기에서 경우에 완료 할 수 있습니다.

참고 위 코드는 인코딩 된 문자열에서 "jumps around"로 디코딩을 시작할 때 전체 암호화 된 문자열을 읽은 것으로 간주합니다. 그렇게 할 수 없다면 암호화 문자열의 "조 변경"을 찾아야합니다. 즉, 암호화 된 문자열의 첫 번째, 두 번째 등 위치에 해당하는 원래 문자열에서 색인을 찾아야합니다. 그것은 바로 이곳에 다시 넣어에서 온다

decrypt[2]=0; 
decrypt[4]=1; 
decrypt[0]=2; 
decrypt[1]=3; 
decrypt[3]=4; 

을 그리고 새로운 우리가 문자열을 해독 : 당신이 암호 해독 배열에 다음 값을 넣어 것입니다

int encrypt[]= {2,4,0,1,3}; 
int decrypt[5]; 
for(ii=0; ii<5, ii++) { 
    decrypts[encrypt[ii]]=ii; 
} 

으로이 생성

decrypt[] = {2, 3, 0, 4, 1}; // after the above loop we have the "inverse transposition cypher" 
encrypted = "ckJsa"; 

평문으로 변환 :

c -> 2 ..c.. 
k -> 3 ..ck. 
J -> 0 J.ck. 
s -> 4 J.cks 
a -> 1 Jacks 

혼란이 없기를 바랍니다.

+0

자세한 솔루션을 주셔서 감사합니다,하지만 여전히 조금 혼란 스러워요. 현재 프로그램에 구현해야합니다. 잠시 동안 내 머리를 감싸려고 노력하고 있습니다 ... – user3473994

+0

그래서 나는 당신의 아이디어를 취하려고했습니다. 그리고 논리를 통해 작업, 나는 당신의 아이디어를 사용하려고하는 방법을 보여주기 위해 위의 코드에 간단한 암호 해독 프로그램을 추가했다. 코드와 로직이 작동하지만 아무 것도 전혀 인쇄하지 않는다. – user3473994

+0

I 새로운 전치 테이블이 {2,3,0,4,1}이되어야하는 이유를 이해하십시오. 그러나 여전히 내 코드에서 작동하도록 문제가 있습니다. – user3473994