基于二叉树的加密和解密

最近老师让写一个学生成绩管理系统,其中账号密码用二叉树加密保存,试着写了下,但写完感觉有各种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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值