?? sign.c
字號:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
char a;
void perr(char *);
int *sign();
char filename[100];
char newfile[100];
char skfile[100];
static char x[20];
int cmp();
int *tz();
int *sub();
int *multi();
int *chu();
int *mn();
FILE *fp;
FILE *nfp;
FILE *kfp;
char n[20];
unsigned long k;
main(argc,argv)
int argc; char **argv;
{unsigned long block=0;
int *x;
char x2[20];
long num=0,p,i=0;
char a,ch;
int r,j;
printf("Do you like to sign your file ?(Y/N):");
gets(&a);
if (a=='N'||a=='n') exit(1);
if(argc>3||argc==2) perr("Usage: signing [filename] [skfile]");
if(argc==3) {strcpy(filename,argv[1]);strcpy(skfile,argv[2]);}
else
{
printf("\nEnter the filename needing signing: ");gets(filename);
printf("\nEnter your skfile: ");gets(skfile);
}
strcpy(newfile,filename);
while(newfile[i]!='\0')
{i=i+1;}
ch=newfile[i-1];
newfile[i-1]='#';
if((fp=fopen(filename,"r"))==NULL) perr("Can't open file!");
if((kfp=fopen(skfile,"r"))==NULL) perr("Can't open file!");
if((nfp=fopen(newfile,"w+"))==NULL) perr("Can't creat new file!");
fscanf(kfp,"%s\n%u",n,&k);
printf("n=%s\nsk=%u",n,k);
fclose(kfp);
fputc(ch,nfp);
while((fgetc(fp))!=EOF)
{num++;}printf("mum=%u",num);
fprintf(nfp,"%u ",num);
rewind(fp);
r=num%3;
p=(num-r)/3;
i=0;
while(i<p)
{i=i+1;block=0;
fread(&block,3,1,fp);printf("\nblock=%u",block);
x=sign(block);for (j=0;j<20;j++)x2[j]=x[j]+48;
x2[20]='\0';
fwrite(x2,20,1,nfp);
}
if (r!=0)
{block=0;
fread(&block,r,1,fp);printf("\nblock=%u",block);
x=sign(block);for (i=0;i<20;i++)x2[i]=x[i]+48;
x2[20]='\0';
fwrite(x2,20,1,nfp);}
fclose(fp);
fclose(nfp);
}
void perr(s)
char *s;
{
printf("\n%s",s); exit(1);
}
int *mn(int c[40],int a[40])
{int i;
unsigned long d=0;
int m[40];
int x[40],y[40];
for(i=0;i<20;i++)
{x[i]=n[i]-48;
y[i]=n[i]-48;
}
x[10]++;
for(i=20;i<40;i++){x[i]=0;y[i]=0;}
for(i=17;i>=10;i--){d=x[i]+d*10;}
multi(c,a);
while(cmp(c,x)){
for(i=10;i<40;i++)m[i-10]=c[i];
for(i=30;i<40;i++)m[i]=0;
chu(m,d);
multi(m,y);
sub(c,m);
}
while(cmp(c,y))
{sub(c,y);}
return(c);
}
int *multi(int n2[40],int n1[40]) /*乘法++*/
{int i;
int mul[40];
int a,b;
for(i=0;i<40;i++)mul[i]=0;
for(a=0;a<20;a++)
{
for(b=0;b<20;b++)
{
mul[a+b]=mul[a+b]+n2[b]*n1[a];
}
}
tz(mul);
for(a=0;a<40;a++)
{n2[a]=mul[a];}
return(n2);}
int *tz(int *mut) /*調整數組++*/
{
int a,b,bi,i;
for(a=0;a<40;a++)
{
i=0;
b=mut[a];
mut[a]=mut[a]%10;
while(b)
{
i++;
b=b/10;
bi=b%10;
mut[a+i]+=bi;
}
}return(mut);
}
int cmp(int *n1,int *m) /*比較 */
{
int i=39;
while(n1[i]==m[i])
{
i--;
}
if(i<0){return 0;}
else if(n1[i]>m[i])
return 1 ;
else
return 0 ;
}
int *chu(int *m,unsigned long d ) /*除法*/
{unsigned long w1=0;
int i,a;
int u[40];for(i=0;i<40;i++)
u[i]=0;
for(a=29;a>=0;a--)
{w1=w1*10+m[a];
u[a]=w1/d;
w1=w1%d;
}
for(a=29;a>=0;a--)
m[a]=u[a];
return(m);
}
int *sub(int c[40],int q[40]) /*減法++*/
{
int i,t;
for(i=0;i<40;i=i++)
{if(c[i]>=q[i])
c[i]=c[i]-q[i];
else
{
c[i]=c[i]+10-q[i];
t=1;
while(c[i+t]==0){
c[i+t]=9; t++;}
c[i+t]--;}
}
return(c); }
int *sign(unsigned long blo)
{int i;
static int u[40];
int a[40];
int c[40];
unsigned long d=k;
for(i=0;i<20;i++)
{ a[i]=blo%10;
blo=blo/10;}
for(i=20;i<40;i++)
{a[i]=0; }
for(i=1;i<40;i++){c[i]=0;}
c[0]=1;
while(d)
{
while (d%2==0)
{
d=d/2;
mn(a,a); }
d--;
mn(c,a);
}
printf("c=");
for(i=19;i>=0;i--)
{ printf("%d",c[i]);}
return (c);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -