⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 idea_cmd.c

📁 IDEA加密算法(PGP中使用的加密算法)
💻 C
📖 第 1 页 / 共 2 页
字号:
    CopyHeadOfRasFile();    if (optEncrypt) /* encrypt rasterfile */      while ((len = GetData(data)) == Idea_dataSize) {        EncryptData(data);         PutData(data, Idea_dataSize);       }     else /* decrypt rasterfile */      while ((len = GetData(data)) == Idea_dataSize) {        DecryptData(data);         PutData(data, Idea_dataSize);       }     if (len) PutData(data, len);    CloseOutput();  }  else if (optEncrypt) { /* encrypt data */    while ((len = GetData(data)) == Idea_dataSize) {      EncryptData(data);       PutData(data, Idea_dataSize);     }    if (len) { EncryptData(data); PutData(data, Idea_dataSize); }    PlainLenToData(inputLen, data);    EncryptData(data);    PutData(data, Idea_dataSize);    CloseOutput();  }  else if (optDecrypt) { /* decrypt data */    if ((len = GetData(dat[0])) != Idea_dataSize) {      if (len) Error(2, "input is not a valid cryptogram");      else Error(3, "there are no data to decrypt");    }    DecryptData(dat[0]);    if ((len = GetData(dat[1])) != Idea_dataSize) {      if (len) Error(4, "input is not a valid cryptogram");      DataToPlainLen(dat[0], &len);      if (len) Error(5, "input is not a valid cryptogram");    }    else {      DecryptData(dat[1]);      t = 2;      while ((len = GetData(dat[t])) == Idea_dataSize) {        DecryptData(dat[t]);        PutData(dat[(t + 2) & 3], Idea_dataSize);        t = (t + 1) & 3;      }      if (len) Error(6, "input is not a valid cryptogram");      DataToPlainLen(dat[(t + 3) & 3], &len);      len += 2 * Idea_dataSize;      if (inputLen < len && len <= inputLen + Idea_dataSize) {        len -= inputLen;        PutData(dat[(t + 2) & 3], len);      }      else Error(7, "input is not a valid cryptogram");    }    CloseOutput();  }  else { /* compute hash value */    for (i = Idea_dataLen - 1; i >= 0; i--) {      hashHigh[i] = userKey[i];      hashLow[i] = userKey[i + Idea_dataLen];    }    if (optCopyHash) {       while ((len = GetData(data)) == Idea_dataSize) {        HashData(data);         PutData(data, Idea_dataSize);       }      if (len) { HashData(data); PutData(data, len); }      PlainLenToData(inputLen, data);      HashData(data);      CloseOutput();    }    else { /* optHash */      while ((len = GetData(data)) == Idea_dataSize) HashData(data);       if (len) HashData(data);      PlainLenToData(inputLen, data);      HashData(data);    }    WriteHashValue();  }} /* CryptData *//******************************************************************************//* measure the time to encrypt 'nofTestData' data-blocks                      */#ifdef ANSI_C  void TimeTest(void)#else  TimeTest()#endif{#ifdef TIME  clock_t startTime, endTime;  float size, duration;  Idea_Data data;  Idea_Key key;  int i;  for (i = 0; i < Idea_dataLen; i++) data[i] = 7 * Idea_dataLen - i;  for (i = 0; i < Idea_keyLen; i++) key[i] = 2 * Idea_keyLen - i;  for (i = Idea_keyLen - Idea_dataLen; i >= 0; i -= Idea_dataLen)    Idea_Crypt(&key[i], &key[i], key);  if ((startTime = clock()) == -1) PError("start timer");  for (i = nofTestData; i != 0; i--) Idea_Crypt(data, data, key);  if ((endTime = clock()) == -1) PError("stop timer");  size = (float)nofTestData * (float)Idea_dataSize / 131072.0;  duration = (float)(endTime - startTime) / (float)CLK_TCK;  fprintf(stderr,     "time needed to encrypt %4.1f MBit of data was %4.1f seconds (%6.3f Mb/s)\n"    , size, duration, size / duration);#endif} /* TimeTest *//******************************************************************************//*                          I N I T I A L I Z A T I O N                       *//******************************************************************************//* set option to TRUE                                                         */#ifdef ANSI_C  void SetOption(int *option)#else  SetOption(option)  int *option;#endif{ if (*option) UsageError(10);  *option = TRUE;} /* SetOption *//******************************************************************************//* set encryption / decryption mode                                           */#ifdef ANSI_C  void SetMode(int newMode, char **str)#else  SetMode(newMode, str)  int newMode;  char **str;#endif{ if (mode != nomode) UsageError(11);  mode = newMode;  (*str)++; (*str)++;  if (newMode == cbc || newMode == cfb || newMode == ofb) {    if ('0' <= **str && **str <= '9') {      interleave = 0;      do {        interleave = 10 * interleave + (**str - '0');        if (interleave >= maxInterleave)          Error(12, "interleave factor is too large");        (*str)++;      } while ('0' <= **str && **str <= '9');      if (interleave == 0) Error(13, "interleave factor is zero");    }    else interleave = 1;  }} /* SetMode *//******************************************************************************//* read options from string 'str'                                             */#ifdef ANSI_C  void ReadOptions(char *str, int *readKeyString, int *readKeyHexString)#else  ReadOptions(str, readKeyString, readKeyHexString)  char *str;  int *readKeyString;  int *readKeyHexString;#endif{ char ch;  str++;  *readKeyString = *readKeyHexString = FALSE;  while((ch = *str++) != '\0') {    switch (ch) {      case 'a':        if (str[0] == 'b' && str[1] == 'r') SetMode(abr, &str);        else UsageError(14);        break;      case 'c':        if (str[0] == 'b' && str[1] == 'c') SetMode(cbc, &str);        else if (str[0] == 'f' && str[1] == 'b') SetMode(cfb, &str);        else UsageError(15);        break;      case 'd': SetOption(&optDecrypt); break;      case 'e':         if (str[0] == 'c' && str[1] == 'b') SetMode(ecb, &str);        else SetOption(&optEncrypt);        break;      case 'h': SetOption(&optHash); break;      case 'H': SetOption(&optCopyHash); break;      case 'o':        if (str[0] == 'f' && str[1] == 'b') SetMode(ofb, &str);        else UsageError(16);        break;      case 'k': SetOption(&optKeyString); *readKeyString = TRUE; break;      case 'K': SetOption(&optKeyHexString); *readKeyHexString = TRUE; break;      case 't':        if (str[0] == 'a' && str[1] == 'n') SetMode(tan, &str);        else UsageError(17);        break;#ifdef TIME      case 'T': SetOption(&optTime); break;#endif#ifdef RASTERFILE      case 'r': SetOption(&optRas); break;#endif      default: UsageError(18); break;    }  }} /* ReadOptions *//******************************************************************************//* check if options are unique and set default options                        */#ifdef ANSI_C  void AdjustOptions(void)#else  AdjustOptions()#endif{ if (optTime) {    if (optDecrypt || optEncrypt || optHash || optCopyHash || optKeyString ||        optKeyHexString || optRas || mode != nomode) UsageError(20);  }  else {    if (optDecrypt && optEncrypt) UsageError(21);    if (optHash && optCopyHash) UsageError(22);    if (optKeyString && optKeyHexString) UsageError(23);    if (!optDecrypt && !optEncrypt && !optHash && !optCopyHash)      if (mode == tan || mode == abr) SetOption(&optHash);      else SetOption(&optEncrypt);    if (optHash || optCopyHash) {      if (optDecrypt || optEncrypt) UsageError(24);      if (optRas) UsageError(25);      if (mode == nomode) mode = tan;      else if (mode != tan && mode != abr) UsageError(26);    }    else {      if (mode == nomode) { mode = cbc; interleave = 1; }      else if (mode != ecb && mode != cbc && mode != cfb && mode != ofb)        UsageError(27);      if (!optKeyString && !optKeyHexString) UsageError(28);    }    time_0 = interleave;    time_N = 0;  }} /* AdjustOptions *//******************************************************************************//* convert a hex-digit into an integer                                        */#ifdef ANSI_C  u_int32 HexToInt(char ch)#else  u_int32 HexToInt(ch)  char ch;#endif{ if ('0' <= ch && ch <= '9') return ch - '0';  else if ('a' <= ch  && ch <= 'f') return 10 + (ch - 'a');  else if ('A' <= ch && ch <= 'F') return 10 + (ch - 'A');  else if (ch == ':') return colon;  else if (ch == '\0') return eol;  else return error;} /* HexToInt *//******************************************************************************//* convert a character into an integer                                        */#ifdef ANSI_C  u_int32 CharToInt(char ch)#else  u_int32 CharToInt(ch)  char ch;#endif{ if ('!' <= ch && ch <= '~') return ch - '!';  else if (ch == '\0') return eol;  else return error;} /* CharToInt *//******************************************************************************//* initializes key and initial values                                         */#ifdef ANSI_C  void ReadKeyHexString(char *str)#else  ReadKeyHexString(str)  char *str;#endif{ int pos, i;  u_int32 val;  while ((val = HexToInt(*str++)) < eol) {    for (i = Idea_userKeyLen - 1; i >= 0; i--) {      val |= (u_int32)userKey[i] << 4;      userKey[i] = (u_int16)(val & 0xFFFF);      val >>= 16;    }    if (val) Error(29, "key value is too large");  }  for (pos = 0; val == colon && pos < maxInterleave; pos++) {    while ((val = HexToInt(*str++)) < eol) {      for (i = Idea_dataLen - 1; i >= 0; i--) {        val |= (u_int32)state[pos][i] << 4;        state[pos][i] = (u_int16)(val & 0xFFFF);        val >>= 16;      }      if (val) Error(30, "initial value is too large");    }  }  if (val == colon) Error(31, "too many initial values specified");  if (val != eol) Error(32, "wrong character in initialization string");} /* ReadKeyHexString *//******************************************************************************//* initialize key and initial values                                          */#ifdef ANSI_C  void ReadKeyString(char *str)#else  ReadKeyString(str)  char *str;#endif{ int i;  u_int32 val;  while ((val = CharToInt(*str++)) < eol) {    for (i = Idea_userKeyLen - 1; i >= 0; i--) {      val += (u_int32)userKey[i] * nofChar;      userKey[i] = (u_int16)(val & 0xFFFF);      val >>= 16;    }  }  if (val != eol) Error(32, "wrong character in key string");} /* ReadKeyString *//******************************************************************************//* show current state informations                                            */#ifdef ANSI_C  void ShowState(void)#else  ShowState()#endif{ int i, j;  fprintf(stderr, "Mode = {");  switch (mode) {    case ecb: fprintf(stderr, "ecb"); break;    case cbc: fprintf(stderr, "cbc"); break;    case cfb: fprintf(stderr, "cfb"); break;    case ofb: fprintf(stderr, "ofb"); break;    case tan: fprintf(stderr, "tan"); break;    case abr: fprintf(stderr, "abr"); break;    case nomode: fprintf(stderr, "nomode"); break;    default: fprintf(stderr, "!!!wrong mode!!!"); break;  }  if (interleave > 0) fprintf(stderr, "%d", interleave);  if (optEncrypt) fprintf(stderr, ", encrypt");  if (optDecrypt) fprintf(stderr, ", decrypt");  if (optHash) fprintf(stderr, ", hash");  if (optCopyHash) fprintf(stderr, ", copy and hash");  if (optKeyString) fprintf(stderr, ", key string");  if (optKeyHexString) fprintf(stderr, ", key hex string");  if (optRas) fprintf(stderr, ", raster file");  if (optTime) fprintf(stderr, ", time test");  fprintf(stderr, "}\n\nKey:\n");  for (i = 0; i < Idea_keyLen; i++) {    fprintf(stderr, "%7u<%4x>", key[i], key[i]);    if ((i % 6) == 5) fprintf(stderr, "\n");  }  fprintf(stderr, "\n\nInitial values:");  for (i = 0; i < interleave; i++) {    fprintf(stderr, "\n  x[N -%2d] =", i + 1);    for (j = 0; j < Idea_dataLen; j++)      fprintf(stderr, "%7u<%4x>", state[i][j], state[i][j]);  }  fprintf(stderr, "\n");} /* ShowState *//******************************************************************************//*                          M A I N - P R O C E D U R E                       *//******************************************************************************/#ifdef ANSI_C  int main(int argc, char *argv[])#else  int main(argc, argv)  int argc;  char *argv[];#endif{ int readKeyString, readKeyHexString;  Init();  argv++; argc--;  while (argc > 0 && argv[0][0] == '-' && argv[0][1] != '\0') {    ReadOptions(*argv++, &readKeyString, &readKeyHexString); argc--;    if (readKeyString || readKeyHexString) {      if (argc <= 0)  Error(36, "missing key on command line");      else if (readKeyString) { ReadKeyString(*argv++); argc--; }      else { ReadKeyHexString(*argv++); argc--; }    }  }  AdjustOptions();  if (optTime && argc > 0 || optCopyHash && argc > 3 ||       !optCopyHash && argc > 2) Error(37, "too many parameters");  if (optTime)    TimeTest();  else {    if (argc > 1 && strcmp(argv[0], argv[1]) == 0)      Error(38, "source and destination are identical");    if (argc > 2 && strcmp(argv[0], argv[2]) == 0)      Error(39, "source and destination are identical");    if (argc > 2 && strcmp(argv[1], argv[2]) == 0)      Error(40, "destinations are identical");    inFile = stdin;    outFile = hashFile = stdout;    if (argc > 0) {      if (strcmp(*argv, "-") == 0) { argv++; argc--; }      else {        inFile = fopen(*argv++, "rb"); argc--;        if (inFile == NULL) PError(*--argv);      }    }    if (optCopyHash) {      if (argc > 1) {        outFile = fopen(*argv++, "wb"); argc--;        if (outFile == NULL) PError(*--argv);      }      if (argc > 0) {        hashFile = fopen(*argv++, "wb"); argc--;        if (hashFile == NULL) PError(*--argv);      }      else hashFile = stderr;    }    else if (optHash) {      if (argc > 0) {        hashFile = fopen(*argv++, "wb"); argc--;        if (hashFile == NULL) PError(*--argv);      }    }    else {      if (argc > 0) {        outFile = fopen(*argv++, "wb"); argc--;        if (outFile == NULL) PError(*--argv);      }    }    if (argc > 0) Error(41, "too many parameters");    Idea_ExpandUserKey(userKey, key);    if (optDecrypt && (mode == ecb || mode == cbc)) Idea_InvertKey(key, key);#ifdef DEBUG    ShowState();#else    CryptData();#endif  }  return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -