首页 目录页 热情软件屋 问专家

李海文选

读取WPS文件的密码

李海

本文发表在《计算机世界报》94年2月2日5期

  WPS文字处理系统是目前用户较多的软件,它以良好的用户界面。强大的打印功能而受到大家的喜爱。许多用户喜欢使用其文件的加密功能,但也常看到有些用户因为忘记密码而焦急万分,为此我用C语言编了一个程序来读取密码。WPS的文件密码被存在文件的733-740字节中,在存盘前对密码做了简单的处理:将其8位二进制ASCII(功能键fl-fl0的ASCII码按0算,小写字母转换为大写)的高四位与低四位交换然后取反,这样做的一个优点是加解密的算法一致。下面的程序对于与WPS兼容的CWS、王码480等软件所产生的文件也适用。该程序已在Borland C++2.0下编译通过。

    PASSWORD.C
    #include<stdio.h>
    #include<process.h>
    main(int  argc,char  *argv[])
    {
    FILE  *fp;
    int  i,j,a[8],b[8];
    printf("读取WPS密码程序  V1.0\n");
    printf("作者:李海  Copyright  (C)  1993 热情软件屋\n\n\n");
    if  (argc!=2)  {
      printf("Usage:Password  文件名\n");
      exit(-1);
    }
    if  ((fp=fopen(argv[1],"r"))==NULL){
      printf("Can't  open  %s\n",argv[1]);
      exit(-1);
    }
    fseek(fp,733L,SEEK-SET);
    if((a[0]=fgetc(fp))==0){
        printf("没有密码!\n");
        exit(-1);
    }
    else  print("内码:%2x",a[0]);
    i=1;
    while  (i<8){
      if((a[i]=fgetc(fp))==0)  break;
      printf("%02x",a[i]);
      i++;
      }
      putchar('\n');
      fclose(fp);
      printf("密码:");
      for  (j=0;j<i;j++){
      b[i]=(a[j]<<4  |  a[j]>>4)  &  255;
      if  (b[j]==0)printf("功能键");
      else  if  (b[j]==8)  printf("Bs");
      else  if  (b[j]=='\t')printf("Tab");
      else  if  (b[j]==27)  printf("Esc");
      else  if  (b[j]=='  ')  printf("空格");
      else  if  (b[j]>='!' &&  b[j]<='-')  printf("%c",b[j]);
      }
      putchar('\n');
      exit  (-1);
      }

回到《李海文选》目录

如果您有任何建议,请给我发电子邮件:
版权所有 李海,热情软件屋 1997-2006



WU Banner from WebUnion Chinese Network