我有问题,围绕着如何扭转我的转位加密过程我的头。基本上是想解密它。在我的头脑中,我相信,为了解密它,我需要接收加密的文本消息,然后替换它在换位数组中的位置。
例如,如果我使用转位表,{2 4 0 1 3}我将首先在加密文本中扫描到输入数组,将加密文本赋值为0-4。因此,例如,基于{2 4 0 1 3}的转位表的"Jacks“将被加密为"csJak”。但是,如果我在"csJak“中扫描到一个数组,其中c是输入的,s是input1等等。
这样,从加密消息中扫描进来的第一个字母将对应于转储槽中的第三个插槽,这将是应该打印出来的位置。然而,我不知道如何将我的想法转化为代码。
当前转位加密密码:
#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;
}非常基本的换位解密程序
假设文件“Declttrans1.txt”中只有单词“Jack”:
#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;
}发布于 2014-04-20 03:41:51
你的换位表告诉你角色的结局。因此,当您查看加扰代码和加密数组时,您可以解密如下(使用您的示例)。
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..如果从这里开始你就可以完成。
Note认为,当您开始解码时,当上面的代码在编码字符串中“跳过”时,就会读取整个加密的字符串。如果你不能这样做,你需要找到加密字符串的“转置”。这意味着您必须在原始字符串中找到与加密字符串中的第一、第二等位置相对应的索引。你用
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我希望这能消除混乱。
https://stackoverflow.com/questions/23178113
复制相似问题