• 置换加密算法


      1 #include "stdio.h"
      2 #include "stdlib.h"
      3 #define column 3
      4 typedef char DataType;
      5 
      6 
      7 /************************************************************************/
      8 /* 置换加密算法。
      9 content为需要加密的内容,index为置换的密匙                                                                     */
     10 /************************************************************************/
     11 char * secertIn(DataType * content, int * index)
     12 {    
     13     int getLength(DataType *);
     14     char * returnChar = NULL,**putIn = NULL;
     15     int count = 0,getIndex = 0,i = 0,j = 0,length = 0,row = 0; //将内容分割后的行数
     16     length = getLength(content);
     17     // printf("明文内容长度: %d\n", length);
     18     //计算切割内容后的行数
     19     row = length / column;
     20     i = length % column;
     21     if(i > 0)
     22         row = row + 1;
     23     // printf("明文行数为:%d\n", row);
     24 
     25     //分配二维数组存放切割后的内容
     26     putIn = (char **) malloc(sizeof(char *) * row);
     27     for(i = 0; i < row; i++)
     28     {
     29         putIn[i] = (char * )malloc(sizeof(char) * column);
     30     }
     31 
     32     returnChar = (char *) malloc(sizeof(char) * row * column + 1);
     33     
     34     //将需要加密的内容存放进二维数组里
     35     for(i = 0; i < row; i++)
     36     {
     37         for(j = 0; j < column; j++)
     38         {
     39             if(i * column + j < length)
     40                 putIn[i][j] = content[i * column + j];
     41             else
     42                 putIn[i][j] = ' ';
     43         }
     44     }
     45     
     46     //对内容进行加密
     47     for(i = 0; i <column; i++)
     48     {
     49         getIndex = index[i];
     50         for(j = 0; j < row; j++)
     51         {
     52             returnChar[count] = putIn[j][getIndex];
     53             count++;
     54         }
     55     }
     56     returnChar[count] = '\0';
     57     
     58     return returnChar;
     59 }
     60 
     61 /************************************************************************/
     62 /* 置换加密算法的解密方法
     63 content为需要解密密的内容,index为置换的密匙                                                                     */
     64 /************************************************************************/
     65 char * secretOut(DataType * content, int * index)
     66 {
     67     int getLength(DataType *);
     68     char * returnChar = NULL,**putIn = NULL,**buffer =NULL;
     69     int count = 0,getIndex = 0,i = 0,j = 0,length = 0,row = 0; //将内容分割后的行数
     70     length = getLength(content);
     71     // printf("密文内容长度: %d\n", length);
     72     //计算切割内容后的行数
     73     row = length / column;
     74     i = length % column;
     75     if(i > 0)
     76         row = row + 1;
     77     // printf("密文文行数为:%d\n", row);
     78 
     79     //分配二维数组存放切割后的内容
     80     putIn = (char **) malloc(sizeof(char *) * row);
     81     for(i = 0; i < row; i++)
     82     {
     83         putIn[i] = (char * )malloc(sizeof(char) * column);
     84     }
     85     
     86     returnChar = (char *) malloc(sizeof(char) * row * column + 1);
     87 
     88     //分配二维数组空间,用来存放解密后的内容
     89     buffer = (char **) malloc(sizeof(char *) * row);
     90     for(i = 0; i < row; i++)
     91     {
     92         buffer[i] = (char * )malloc(sizeof(char) * column);
     93     }
     94     
     95     //将需要解密的内容存放进二维数组里
     96     for(i = 0; i < row; i++)
     97     {
     98         for(j = 0; j < column; j++)
     99         {
    100             if(i * column + j < length)
    101                 putIn[i][j] = content[i * column + j];
    102             else
    103                 putIn[i][j] = ' ';
    104         }
    105     }
    106 
    107     //将加密的内容按照密匙对行重新排列
    108     for(i = 0; i < row; i++)
    109     {
    110         getIndex = index[i];
    111         buffer[getIndex] = putIn[i];
    112     }
    113     for(i = 0; i < column; i++)
    114     {
    115         for(j = 0; j < row; j++)
    116         {
    117             returnChar[count] = buffer[j][i];
    118             count++;
    119         }
    120     }
    121     
    122     returnChar[count] = '\0';
    123 
    124     return returnChar;
    125 }
    126 
    127 
    128 /************************************************************************/
    129 /* 计算数组长度                                                                     */
    130 /************************************************************************/
    131 int getLength(DataType * content)
    132 {
    133     int count = 0;
    134     while(*content != '\0')
    135     {
    136         content++;
    137         count++;
    138     }
    139     return count;
    140 }
    141 
    142 int main()
    143 {
    144 
    145     char *a = "abcdefghi"; //明文
    146     char *get;
    147     int index[] = {2,1,0}; //密匙,长度和列数相同
    148     
    149     printf("明文:%s\n", a);
    150     get = secertIn(a, index); //加密
    151     printf("密文 :%s\n", get);
    152     get = secretOut(get, index); //将上面加密后的密文进行解密
    153     printf("解密后的得到明文: %s\n\n", get);
    154     
    155 }
    一颗平常心,踏踏实实,平静对待一切
  • 相关阅读:
    Editor REST Client
    log配置
    spring-boot-configuration-processor
    http请求
    做项目用到的一些正则表达式,贴出来共享
    批量插入的实现
    sql执行顺序对比
    Java常用的并发工具类:CountDownLatch、CyclicBarrier、Semaphore、Exchanger
    spring中bean的生命周期
    多属性的对象列表的两种排序方法
  • 原文地址:https://www.cnblogs.com/hanyuan/p/2695813.html
Copyright © 2020-2023  润新知