为了账号安全,请及时绑定邮箱和手机立即绑定

算法上可以考虑用二维数组下标来解决问题?

算法上可以考虑用二维数组下标来解决问题?

慕尼黑5688855 2022-08-05 10:06:13
函数功能对传入的数据使用固定的Polybius方格进行三分加密,其算法参见下一页的附录。函数原型int Three_Parties(char* data, int data_length);参数data 待加密数据,其长度由参数data_length指定。返回时,此数组中应该是加密后的数据。data_length 数据长度(字节数)。返回值0 操作成功1 data中包含有非字母的字符说明Polybius方格采用附录中举例那个。如果data中含有小写字符,则需要转换为大写处理。加密后的data全部为大写或者可能包含Polybius方格中的那个符号。提示在功能函数中,用一个二维数组来存储Polybius方格。
查看完整描述

2 回答

?
慕工程0101907

TA贡献1887条经验 获得超5个赞

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

int Three_Parties(char* data, int data_length)
{
typedef unsigned char UCHAR;
int i, index;
char* dict;
UCHAR* polybius_index;

//检查讯息的合法性
for(i = 0; i < data_length; i++)
{
if(data[i] >= 'a' && data[i] <= 'z')
{
//小写转化为大写
data[i] &= 0xDF; //小写字母第5位置为0即变为大写
//data[i] -= 'a' - 'A'; //这种写法也可以,但没有上一种效率高
}
else if(data[i] < 'A' || data[i] > 'Z')
{
//包含非字母的字符
return 1;
}
}
dict = "LEOCBFQSTNARGHJUWXDVIKMPYZ/";
polybius_index = (UCHAR*)malloc(3 * data_length);
for(i = 0; i < data_length; i++)
{
index = strchr(dict, data[i]) - dict;
polybius_index[i] = index / 9;
index %= 9;
polybius_index[i + data_length] = index / 3;
polybius_index[i + 2 * data_length] = index % 3;
}

for(i = 0; i < 3 * data_length; i += 3)
{
index = polybius_index[i]*9 + polybius_index[i+1]*3 + polybius_index[i+2];
data[i/3] = dict[index];
}

free(polybius_index);

return 0;
}

int main(int argc, char* argv[])
{
char data[] = "helloworld";
if(Three_Parties(data, strlen(data)) == 0)
{
printf("%s", data);
}
else
{
printf("input error");
}
return 0;
}

//加密部分还可以改成建索引表,那样效率会更高,但代码稍微复杂些。
希望对你能有所帮助。


查看完整回答
反对 回复 2022-08-08
?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

int Three_Parties(char* data, int data_length)
{
typedef unsigned char UCHAR;
int i, index;
char* dict;
UCHAR* polybius_index;

//检查讯息的合法性
for(i = 0; i < data_length; i++)
{
if(data[i] >= 'a' && data[i] <= 'z')
{
//小写转化为大写
data[i] &= 0xDF; //小写字母第5位置为0即变为大写
//data[i] -= 'a' - 'A'; //这种写法也可以,但没有上一种效率高
}
else if(data[i] < 'A' || data[i] > 'Z')
{
//包含非字母的字符
return 1;
}
}
dict = "LEOCBFQSTNARGHJUWXDVIKMPYZ/";
polybius_index = (UCHAR*)malloc(3 * data_length);
for(i = 0; i < data_length; i++)
{
index = strchr(dict, data[i]) - dict;
polybius_index[i] = index / 9;
index %= 9;
polybius_index[i + data_length] = index / 3;
polybius_index[i + 2 * data_length] = index % 3;
}

for(i = 0; i < 3 * data_length; i += 3)
{
index = polybius_index[i]*9 + polybius_index[i+1]*3 + polybius_index[i+2];
data[i/3] = dict[index];
}

free(polybius_index);

return 0;
}

int main(int argc, char* argv[])
{
char data[] = "helloworld";
if(Three_Parties(data, strlen(data)) == 0)
{
printf("%s", data);
}
else
{
printf("input error");
}
return 0;
}

//加密部分还可以改成建索引表,那样效率会更高,但代码稍微复杂些。


查看完整回答
反对 回复 2022-08-08
  • 2 回答
  • 0 关注
  • 122 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信