C,大写和小写的凯撒密码

时间:2016-11-21 10:39:09

标签: c algorithm cryptography ascii caesar-cipher

我必须生成Caesar密码解码器 - 无论是大写还是大写,但我无法想到一个简单的解决方案(或者目前即使是一个)。

目前我有这个循环来通过给定的转移i来解密代码:

char* s1 = "qrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnop";
int s1s = strlen(s1);
int i = 16;
char tmp[s1s+1];
for (int j = 0; j < s1s; ++j) {
    char tmp_s = (char) ((int) s1[j]-i);
    if(tmp_s<65){
        tmp_s+=58;
    }
    tmp[j]=tmp_s;
}
tmp[s1s]='\0';

输出应为abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,目前为abcdefghijklmnopqrstuvwxyzABCDEFGHIJQRSTUVWXYZ[\]^_

我尝试了一些条件,但无法找到合适的条件。

1 个答案:

答案 0 :(得分:1)

您的测试尚未完成。考虑&#34; ASCII空间&#34;:

\0 ... 'A' ... 'Z' ... 'a' ... 'z' ...

您有5个区域:

  1. 之前的字符&#39; A&#39;。
  2. &#39; A&#39;之间的字符和&#39; Z&#39;。
  3. &#39; Z&#39;之间的字符和&#39; a&#39;。
  4. &#39; a&#39;之间的字符和&#39; z&#39;。
  5. &#39; z&#39;之后的字符。
  6. 您需要的是在移动后处理区域1和区域3中的字符(因为您只执行减法,区域5将永远不会到达)。

    为了便于阅读,您还应该在条件中使用字符而不是数值。尝试:

    char* s1 = "qrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnop";
    int s1s = strlen(s1);
    int i = 16;
    char tmp[s1s+1];
    for (int j = 0; j < s1s; ++j) {
        char tmp_s = (char) ((int) s1[j]-i);
        if(tmp_s < 'A'){ /* "area 1" */
            tmp_s += 'z'-'A' + 1; /* shift between 'a' and 'z' */
        }
        else if(tmp_s < 'a' && s1[j] >= 'a'){ /* "area 3" */
            tmp_s += 'Z'-'a' + 1; /* shift between 'A' and 'Z' */
        }
        tmp[j]=tmp_s;
    }
    tmp[s1s]='\0';
    

    如果您允许i足够高以及跳过&#34;代码可能需要进一步调整。不止一个地区。