我在解决如何扭转换位加密过程方面遇到了问题。这基本上是试图解密它。在我的脑海中,我相信为了解密它,我需要接收加密的文本消息,然后将其替换为转置数组中的位置。
例如,如果我使用转置表,{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;
}
答案 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
我希望这可以解决这个困惑。