码迷,mamicode.com
首页 > 其他好文 > 详细

序列加密

时间:2015-09-04 21:04:56      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:

现在字符序列 char buf[] = “hello everyone”;

技术分享

按行读的话,肯定可以读出数据,如果按列来读话,则会出再乱码的现像。正是这种现
像可作为一种加密手段,称为序列加密。

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <stdlib.h>
  4 char *encode(char *str, int column);//加密函数
  5 char **get2DMem(int row, int column);//获得二维空间
  6 char *decode(char* str, int column);//解密函数
  7 int main(void)
  8 {
  9     char *str="hello world!!";
 10     int column=5;
 11     char *secret=encode(str,column);
 12     printf("encode=%s\n",secret);
 13     str=decode(secret,column);
 14     printf("decode=%s\n",str);
 15     return 0;
 16 }
 17 //加密函数
 18 char *encode(char *str, int column)
 19 {
 20     int len=strlen(str);//原始长度
 21     int secretLen=0;//由于是二维序列加密,是吧一个字符串按行存储到一个二维空间中,
 22     if(len%column!=0)//后按列读取就是密文,如果最后一行字符串填不满,则自己拿什么字符补齐
 23         secretLen=len+(column-len%column);//计算经过处理后的字符串长度
 24     else
 25         secretLen=len;
 26     char *temp=(char *)calloc(secretLen+1, sizeof(char));
 27     strcpy(temp,str);
 28     int i=0;
 29     for(i=len;i<secretLen;i++)//将原本字符串长度和新长度之间的本程序用*填充
 30     {
 31         temp[i]=*;
 32  
 33     }
 34     temp[i]=\0;
 35     //到此处已经得到补全长度的字符串,为temp,
 36     //接下来处理这个可以填充到二维空间的字符串,填入二维空间
 37     //申请并返回二维空间
 38     char *ttemp=temp;//用ttemp记录下temp的开头
 39     int row=secretLen/column;//计算得到二维空间的行数
 40     char **secret=get2DMem(row, column);
 41     int j=0;
 42     for(i=0;i<row;i++)      //将补全后的字符串按行存储到二维空间中
 43         for(j=0;j<column;j++)
 44         {
 45             secret[i][j]=*(temp++);
 46         }
 47     //到此处已经将字符串按照行序存储到二维空间中了
 48     //下面将二维空间中的内容按照列序读入到目标字符串中
 49     char *result=(char *)calloc(secretLen+1, sizeof(char));
 50     char *tresult=result;//用tresult记录结果字符串的开头
 51     for(i=0;i<column;i++){
 52         for(j=0;j<row;j++)
 53         {
 54             *result=secret[j][i];
 55             result++;
 56         }
 57     }
 58     *result=0;
 59     //加密完成
 60     return tresult;
 61 }
 62 //解密程序
 63 char *decode(char* str, int column)
 64 {
 65     int secretLen=strlen(str);
 66     int row=secretLen/column;
 67     char **secret=get2DMem(row,column);//申请同样行列数的二维空间
 68     int i=0,j=0;
 69     for(i=0;i<column;i++)//将字符串按列存储顺序存储到二维空间中
 70         for(j=0;j<row;j++)
 71         {
 72             secret[j][i]=*str++;
 73         }
 74     char *tresult=(char *)calloc(secretLen+1,sizeof(char));
 75     char *result=tresult;
 76     for(i=0;i<row;i++)//将二维空间中的字符按行读取出来就是
 77         for(j=0;j<column;j++)
 78         {
 79             //printf("%c",secret[i][j]);
 80             *tresult++=secret[i][j];
 81         }
 82     *tresult=0;
 83     while(*(--tresult)==*)
 84         ;
 85     tresult++;
 86     *tresult=0;
 87 //    printf("decode=%s\n",result);
 88     return result;
 89 }
 90 //申请二维空间函数
 91 char **get2DMem(int row, int column)
 92 {
 93     char **p=(char **)calloc(row,sizeof(char *));
 94     int i=0;
 95     for(i=0;i<row;i++)
 96     {
 97         p[i]=(char *)calloc(column, sizeof(char));
 98     }
 99     return p;
100 }

切记用字符指针访问字符串的时候,一定是*p,而不能犯迷糊搞成p之类的,这样访问必然出问题

序列加密

标签:

原文地址:http://www.cnblogs.com/luojialin/p/4782313.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!