最近老师让写一个学生成绩管理系统,其中账号密码用二叉树加密保存,试着写了下,但写完感觉有各种bug,在此贴出代码和原理,作为知识积累。
二叉树加密原理:首先将明文转化成二进制字符,然后构建一个二叉树,这颗二叉树就相当于秘钥,解密和加密都要通过它。规定这颗二叉树根结点指向左子结点的分支记为0, 指向右子结点的分支记为1,明文中的每个字符在这颗二叉树中都可以找到,将获得的二进制字符通过这颗二叉树,得到密文,然后保存起来。一棵二叉树可以由中序序列和先序序列(或者是后序序列组成),可以通过将这颗二叉树的中序序列和先序序列分开保存来提高安全系数。这里是把秘钥分成三份保存,想要将秘钥分成多分保存可以用虚拟二叉树:先将中序序列保存起来,然后用先序序列构造一颗虚拟二叉树,保存这颗虚拟二叉树的中序序列和后序序列,即可分成多份,用同样的方法可分成自己想要的份数。
解密:解密就是逆向过程,根据密文和二叉树秘钥,或得二进制字符,再讲二进制字符转换成明文即可。
贴出最后实现的程序,有点繁琐,但起码最后实现功能了:
加密:
unsigned char * PS_Encryption(char *buffer,bitree *root) //加密buffer是明文,root是加密二叉树
{
int flag = 0;
int i = 0;
int j = 0;
char str0[20];
char str1[20];
char *tmp_buf = buffer;
bitree *tmp_root;
bitree *tmp_root1;
int num = 0;
tmp_root = root;
tmp_root1 = root;
unsigned char *psEn;
psEn = (char *)malloc(strlen(str1)+1); //申请动态内存,要想返回字符传地址,要把它放在安全的地方,即动态内存中,库函数都是在静态内存中,使用完后会全部撤回。
memset(str0,0,20); //初始化数组
memset(str1,0,20)
num = atoi(tmp_buf