#include<stdio.h>
void bytetobit(int ch,int bit[8]){
int i;
bit[7]=ch&0x01;
for(i=1;i<8;i++)
{
ch=ch>>1;
bit[7-i]=ch&0x01;
}
/*for(i=0;i<8;i++)
{
printf("%d",bit[i]);
}*/
printf("\n");
}
void showfile(FILE *fp)
{
char c;
fseek(fp,0,SEEK_SET);
printf("文件内容如下:\n");
while(!feof(fp)){
fread(&c,1,1,fp);
putchar(c);
}
}
//对文件进行预处理,使其长度为4字节的整倍数
long get_file_size( FILE *fp )
{
//char ch[3]={' ',' ',' '};
long flen;
if (fp==NULL) return -1;
fseek( fp, 0L, SEEK_END );
flen=ftell(fp);
/*switch (flen%4)
{
case 1: fwrite(ch,1,3,fp);break;
case 2: fwrite(ch,1,2,fp);break;
case 3: fwrite(ch,1,1,fp);break;
default: ;
}
return ftell(fp);*/
}
void encryption(){
//给定一个超递增序列B及两个整数W,N,作为密钥
int B[8]={17,53,101,223,503,1009,5857,15641},A[8],W=599,N=53783,S=0,i,j;
int M[8];
long flen;
char ch;
FILE *fp,*fp1;
//求其公钥A并输出
printf("公钥为:");
for(i=0;i<8;i++)
{
A[i]=B[i]*W%N;
printf("%9d",A[i]);
}
if(!(fp=fopen("abc.txt","ab+")))
{
printf("打开文件失败!");
return;
}
showfile(fp);
//printf("\n%ld",flen);
if(!(fp1=fopen("abs.txt","wb")))
{
printf("打开abs失败");
return;
}
flen=get_file_size(fp);
fseek(fp,0L,SEEK_SET);
for(i=1;i<=flen;i++)
{
S=0;
fread(&ch,sizeof(char),1,fp);
bytetobit((int)ch,M);
for(j=0;j<8;j++)
{
S+=M[j]*A[j];
}
printf("%9d",S);
fwrite(&S,sizeof(int),1,fp1);
}
fclose(fp);fclose(fp1);
}
void main()
{
encryption();
}