签到

05月11日
尚未签到

共有回帖数 0

    做月子

    等级:
    加密程序:
    #include "stdio.h"
    #include "string.h"
    #define MAX 8  

    char string[10];
    int  wei[10] = { 1 , 2 , 4 , 8 , 16 , 32 , 64 , 128 ,256 } ;
    int  A[MAX][MAX] ;                                       //  加密矩阵
    int  B[MAX][MAX] ;                                       //  被加密文件
    int  C[MAX][MAX] ;                                       //  加密后文件

    void  MULT_Matrix(int a[8][8] , int b[8][8] , int result[8][8] )  // 矩阵乘法
    {
       int i , j ,k  ;
    int sum ;  
    for(k =0 ; k   MAX ; k ++ )
    {
    for(i =0 ;i   MAX ;i ++ )
    {
    result[k] = 0 ;  
    for(j =0 ; j  MAX ; j ++ )
    if(b[j]) result[k] +=  a[k][j] ;
    }
    }
    return ;  
    }

    int main()
    {
    FILE *p , *q ;  
    int i , j ;
    bool finish  = false;  
    char file_in[100] , file_out[100] = "加密_" ;

    printf("请输入加密文件名称!n");
    scanf("%s",file_in) ;
    if( ( p = fopen(file_in,"rb") ) == NULL )
    {
    printf("cannot open!n") ;
    return 0;
    }
       
    strcat(file_out,file_in);

    q = fopen(file_out , "w" )  ;  

    printf("请输入加密矩阵!n");
    for( i =0 ; i  MAX ; i++ )
    for( j =0 ; j  MAX ;j ++ )
    scanf("%d", &A[j] ) ;
     
    while(!finish)
    {
    for( i =0 ; i  MAX   ; i ++)
    if( fscanf(p,"%c", &string) == EOF ) break ;
    string = '' ;

    if(i  MAX ) finish = true ;

           int length = strlen(string) ;
    while( length  MAX ) string[length ++ ] = 0 ;  // 如果不足8个字节,补充0


           for(i = 0 ;i  MAX ; i ++ )
    for( j = 0 ; j  MAX ; j ++ )
    B[j] = ( string & wei[j] )  0 ? 1 : 0  ;
       

           MULT_Matrix( A , B , C) ;  

    for(i = 0 ; i  MAX ; i ++ )
    for( j =0 ; j  MAX ; j ++)
    {
               // 如果为10 (既LF) ,我们转换为 250。  因为如果为10 , 在解密的时候,读入的数据
    // 时这里会被读成 13 10 两个 ,而现在我也没有想到一个更好解决的办法
    // 为了避免这种情况发生,所以我将它转为 250 (因为在转换中 最多用到 30 * 8 = 240 )。
    if( C[j] == 10 )  C[j] = 250 ;                                  

    fprintf(q,"%c", C[j]) ;
    }
    }
       
    fclose(p) ;  
    fclose(q) ;
    printf("nn加密成功!n") ;
    getchar();getchar();

    return 0 ;  
    }
    ----------------------------------------------------------
    解密程序:
    #include "stdio.h"
    #include "string.h"
    #define MAX 8  

    char string[10]={0};
    int  wei[10] = { 1 , 2 , 4 , 8 , 16 , 32 , 64 , 128 , 256 } ;
    int  A[MAX][MAX] ;                                                  //  解密矩阵
    int  B[MAX][MAX] ;                                                  //  解密后文件
    int  C[MAX][MAX] ={0};                                              //   被解密文件

    void  MULT_Matrix(int a[8][8] , int b[8][8] , int result[8][8] )     // 矩阵乘法


    {
       int i , j ,k  ;
    for(k =0 ; k   MAX ; k ++ )
    {
    for(i =0 ;i   MAX ;i ++ )
    {
    result[k] = 0 ;  
    for(j =0 ; j  MAX ; j ++ )
    result[k] +=  a[k][j] * b[j] ;  
    }
    }
    return ;  
    }

    int main()
    {
    FILE *p , *q ;  
    int i , j , k  ;
    char c ;  
    char file_in[100] , file_out[100] = "解密_" ;

    printf("请输入解密文件名称!n");
    scanf("%s",file_in) ;

    if( ( p = fopen( file_in , "rb" ) ) == NULL )
    {
    printf("cannot open!n") ;
    return 0;
    }

    strcat(file_out,file_in) ;

    q = fopen(file_out,"w") ;

    printf("请输入解密矩阵!n");
    for( i =0 ; i  MAX ; i++ )
    for( j =0 ; j  MAX ;j ++ )
    scanf("%d", &A[j] ) ;

    while(fscanf( p , "%c",&c) != -1 )
    {
    memset(C,0,sizeof(C)) ;
    memset(string,0,sizeof(string)) ;

           for( i =0 ; i  MAX ; i ++ )
    for(j =0 ; j  MAX ;  j ++)
    {
    if( (i + j )  0 ) fscanf( p , "%c",&c) ;
       for( k =0 ; k  MAX ; k ++ )
          C[j] = C[j] | ( wei[k] & c ) ;

    if(C[j] == 250 ) C[j] = 10 ;              // 如果 为250 应该再转换为10  
    }

           MULT_Matrix( A , C , B) ;  
           
    for( i =0 ; i  MAX ;i ++ )
    for(j  =0 ; j  MAX ; j++ )
    string = string + ( B[j] * wei[j] ) ;

    string = '' ;
    fprintf(q,"%s",string) ;
     
    }
    printf("nn解密成功!n") ;
       fclose(p) ;  
    fclose(q) ;
    getchar(); getchar();
    return 0 ;  
    }

    哦,忘了贴密钥生成程序:
    ---------------------------------------------------------------
    #include "stdio.h"
    #include "time.h"
    #include "memory.h"
    #include "stdlib.h"
    #define MAX 8                     // 矩阵大小
    #define PT 10                     // 附矩阵 随机初始值的最大值
    #define bianhuan 400             // 由对角线矩阵生成满秩矩阵所需的行变化次数

    struct changs                    // 记录变化的过程, 以便逆过来求其逆矩阵
    {
         int temp1 ;  
       int temp2 ;
    } change[bianhuan + 1 ] ;  

    int Matrix[MAX][MAX] ;       // 满秩矩阵
    int R_matrix[MAX][MAX];      // 逆矩阵


    // ***** 生成 满秩矩阵 并求出该满秩矩阵的逆矩阵 ****************************//

    bool check()                            // 检测所生成矩阵的安全性(保证 每行和小于 250 ) ,并且尽可能的解密矩阵更复杂  
    {
     int i , j  ;
     int small = 1000 , big = -1000 ;    // 记录解密矩阵的最大值和最小值
     int num = 0 ;                       // 记录解密矩阵中0的个数  
     
     for(i =0 ;  i  MAX ; i ++ )
     {
       int sum = 0 ;  
       for(j =0 ;j  MAX ;j ++ )
       {
         if( R_matrix[j] == 0 ) num ++  ;  
         if(num  2 ) return false ;     // 如果解密矩阵包含 0大于 2个的话 , 认为这个解密矩阵不够复杂
         if( R_matrix[j]  small ) small = R_matrix[j]  ;  
         else if(R_matrix[j]  big ) big = R_matrix[j]  ;
               
         sum += Matrix[j] ;



    }
         if(sum = 250 )                     // 如果每行和大于250 的话为不安全加密矩阵
       {
    //      printf("%dn",sum) ;
         return false ;
       }
     }
     if(big - small  125 ) return false;    // 如果解密矩阵中最大值和最小值的差小于125,
                                             // 认为该解密矩阵不够复杂

     return true ;    // 如果加密矩阵安全,并且 解密矩阵包含 0个数不大于2个 以及
                      // 解密矩阵的最大值和最小值不小于125,那么我们认为这个密钥是“可靠”的。  
    }

    void creat()
    {
     int i  ,  k  ;  
     int flage = 0 ;  
       do
     {
          flage = 0 ;
         memset(Matrix,0,sizeof(Matrix));
         memset(R_matrix,0,sizeof(R_matrix));

         for(i = 0 ; i  MAX ; i ++ )                               // 生成主对角线矩阵
             Matrix = R_matrix = 1 ;

       int x1 , x2 ;  
           for(k = 0 , x1 = rand() % MAX ; k  bianhuan ; k ++, x1 ++ ) // 进行 行 随意变化生成满秩矩阵 , 并记录下变化过程
       {  
          if( x1  MAX ) x1 = rand() % MAX ;  
          change[k].temp1 = x1 ;

              x2 = rand() % MAX ;  
            while( x2  == x1 ) x2 = rand() % MAX ;

            change[k].temp2  = x2 ;



            for(i = 0 ; i  MAX ; i ++ )
              if( Matrix[x1] + Matrix[x2] = 100 ) break ;  

            if(i = MAX )  
          {
               for(i = 0 ; i  MAX ; i ++ )
                 Matrix[x1] += Matrix[x2] ;
          }
            else  k-- ,flage ++ ;
         
            if(flage  1000 ) { k++ ; break ; }  
       }

         for(k-- ; k = 0 ; k -- )                                   // 行逆变换, 求出其逆矩阵
       {
             for( i = 0 ;  i  MAX ; i ++ )
            R_matrix[ change[k].temp1 ] -= R_matrix[ change[k].temp2 ] ;

       }
     }while( check() == false) ;                        // 直到找到一个“可靠”矩阵为止

     return ;
    }

    int main()
    {
     int i , j ;
     srand(time(0)) ;

     creat() ;  

     printf("加密矩阵为:n") ;
       for(i =0 ; i  MAX ; i ++ )
     {
       for(j =0 ; j  MAX ; j ++)
         printf("%4d " , Matrix[j]) ;
       printf("n") ;
     }

     printf("n") ;
     printf("解密矩阵为:n") ;
     for( i = 0;  i  MAX ; i ++ )
     {
       for(j =0 ; j   MAX ; j ++ )
         printf("%4d ",R_matrix[j]) ;
       printf("n");
     }

     getchar();getchar();
     return 0 ;  
    }


    楼主 2016-01-23 10:24 回复

共有回帖数 0
  • 回 帖
  • 表情 图片 视频
  • 发表

登录直线网账号

Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号 意见反馈 | 关于直线 | 版权声明 | 会员须知