我被要求实施以下密码算法。加密有点模糊,但至少它有点意义,但我不知道解密是如何工作的!
正如它所说,对于解密,应该发生反向替换。正如您在此示例中看到的'白菜',如何知道b
重复了两次或a
之前已经发生过!也许有一些暗示我无法看到它或我在某处犯错误。
我从需求中拍摄了图像,所以我也可以向你展示这张桌子。感谢任何解释或算法。
答案 0 :(得分:3)
这看起来像是家庭作业,所以我只是添加一些提示,它是如何工作的,没有实际的完整代码......
1.substitution
删除之前使用的所有字母(2个嵌套循环将执行)
cabbage -> cabge // b,a removed
现在制作字母替换表
abcdefghijklmnopqrstuvwxyz // plain text alphabet(input unencrypted alphabet)
-------------------------
cabge // keyword
---d-f-hijklmnopqrstuvwxyz // unused letters
dfhijklmnopqrstuvwxyz // unused letters merged together
-------------------------
cabgedfhijklmnopqrstuvwxyz // output text alphabet (output encrypted alphabet)
2.encryption
这样的事情:
char enc[]="cabgedfhijklmnopqrstuvwxyz";
char in,out;
// loop for input text reading to in
out=enc[int(in-'a')];
// and writing back out
3.decryption
创建解密字母表
abcdefghijklmnopqrstuvwxyz // plain text alphabet
cabgedfhijklmnopqrstuvwxyz // enc table
// now find the letter for decryption in enc and write the plain text value at the same position
// a->b, b->c, c->a ... z->z also 2 nested loops will do it
abcdefghijklmnopqrstuvwxyz // plain text alphabet
bcafegdhijklmnopqrstuvwxyz // dec table
现在以与加密相同的方式解密,只使用dec表而不是enc
char dec[]="bcafegdhijklmnopqrstuvwxyz";
char in,out;
// loop for input text reading to in
out=dec[int(in-'a')];
// and writing back out
[注释]
答案 1 :(得分:2)
您的任务是使用简单的替换密码。要加密文本,请查找第一行中的每个字符,并替换为第二行中的字符,因此a-> c,b-> a,c-> b等。要解密文本,请查找每个字符第二行中的字符,并将其替换为第一行中的字符,因此a-> b,b-> c,c-> a等等。正如devnull指出要查找的命令是{{ 1}}。你的作业中的例子(?)可以通过
来实现tr
要构建表,您需要计算第二行(第一行始终是a-z)。至于我将解释任务你开始关键字并删除第一个字符,但第一个,所以tr abcdefghijklmnopqrstuvwxyz cabgedfhijklmnopqrstuvwxyz # encryption
tr cabgedfhijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz # decryption
变为abcadc
而abcd
变为rlxxdllllq
。这些字符构成表格第二行的开头。您现在按字母顺序填充字母表中的剩余字符。因此,您可以通过将单一化关键字与从rlxdq
... tr
中删除的单一化关键字字符的结果相连接来获得abcd
的第二个单词。由于xyz
还具有删除功能,因此这应该很简单。