共有回帖数 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 回复
Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号
意见反馈 |
关于直线 |
版权声明 |
会员须知