解密密码

时间:2014-04-20 03:28:43

标签: c encryption

我在解决如何扭转换位加密过程方面遇到了问题。这基本上是试图解密它。在我的脑海中,我相信为了解密它,我需要接收加密的文本消息,然后将其替换为转置数组中的位置。

例如,如果我使用转置表,{2 4 0 1 3}我将首先将加密文本扫描到输入数组中,将加密文本指定为0-4。例如," Jacks"基于{2 4 0 1 3}的转置表将被加密到" 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;
}

非常基本的转置解密程序

假设文件&#34; decrypttrans1.txt&#34;只有#34; Jacks&#34;在其中:

#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;
}

1 个答案:

答案 0 :(得分:2)

您的换位表会告诉您角色的最终位置。因此,当您查看加扰代码和加密数组时,可以按如下方式解密(使用您的示例)。

transposition "cypher"  =  {  2,  4,  0,  1,  3 }'

original string =             J   a   c   k   s

encrypted string =            c   k   J   s   a

现在解密,你只需看一下加密字符串:

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

看到这个有效:

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..

你可以从这里完成。

注意这假设您在开始解码时读入了整个加密字符串,因为上面的代码在编码字符串中“跳转”。如果你不能这样做,你需要找到加密字符串的“转置”。这意味着您必须在原始字符串中找到与加密字符串中第一个,第二个等位置对应的索引。你用

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

这会将以下值放入解密数组中:

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

新的我们通过将字符串放回正确的位置来解密字符串:

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

我希望这可以解决这个困惑。