首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解密密码

问解密密码
EN

Stack Overflow用户
提问于 2014-04-20 03:28:42
回答 1查看 601关注 0票数 0

我有问题,围绕着如何扭转我的转位加密过程我的头。基本上是想解密它。在我的头脑中,我相信,为了解密它,我需要接收加密的文本消息,然后替换它在换位数组中的位置。

例如,如果我使用转位表,{2 4 0 1 3}我将首先在加密文本中扫描到输入数组,将加密文本赋值为0-4。因此,例如,基于{2 4 0 1 3}的转位表的"Jacks“将被加密为"csJak”。但是,如果我在"csJak“中扫描到一个数组,其中c是输入的,s是input1等等。

这样,从加密消息中扫描进来的第一个字母将对应于转储槽中的第三个插槽,这将是应该打印出来的位置。然而,我不知道如何将我的想法转化为代码。

当前转位加密密码:

代码语言:javascript
复制
#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”:

代码语言:javascript
复制
#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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-20 03:41:51

你的换位表告诉你角色的结局。因此,当您查看加扰代码和加密数组时,您可以解密如下(使用您的示例)。

代码语言:javascript
复制
transposition "cypher"  =  {  2,  4,  0,  1,  3 }'

original string =             J   a   c   k   s

encrypted string =            c   k   J   s   a

现在要解密,只需查看加密字符串:

代码语言:javascript
复制
for(ii = 0; ii < 5; ii++) {
  plainText[ii] = encrypted[cypher[ii]];
}

确保这样做有效:

代码语言:javascript
复制
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认为,当您开始解码时,当上面的代码在编码字符串中“跳过”时,就会读取整个加密的字符串。如果你不能这样做,你需要找到加密字符串的“转置”。这意味着您必须在原始字符串中找到与加密字符串中的第一、第二等位置相对应的索引。你用

代码语言:javascript
复制
int encrypt[]= {2,4,0,1,3};
int decrypt[5];
for(ii=0; ii<5, ii++) {
  decrypts[encrypt[ii]]=ii;
}

这将在解密数组中放置以下值:

代码语言:javascript
复制
decrypt[2]=0;
decrypt[4]=1;
decrypt[0]=2;
decrypt[1]=3;
decrypt[3]=4;

新的,我们在字符串进来时解密,把它放回正确的位置:

代码语言:javascript
复制
decrypt[] = {2, 3, 0, 4, 1}; // after the above loop we have the "inverse transposition cypher"
encrypted = "ckJsa";

转换为明文:

代码语言:javascript
复制
c -> 2   ..c..
k -> 3   ..ck.
J -> 0   J.ck.
s -> 4   J.cks
a -> 1   Jacks

我希望这能消除混乱。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23178113

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档