【C】實現字符串解密加密+凱撒密碼

一、源碼

/*
 * @Author: jjk 
 * @Date: 2019-05-25 21:43:41 
 * @Last Modified by: jjk
 * @Last Modified time: 2019-05-25 22:05:28
 *  程序功能:
 *          字符串的加密和解密
 */

/*

思路:
    1、while無線循環,聲明兩個字符數組:保存明文和密文
    2、首次用戶輸入字符串,進行明文加密成密文操作
    3、之後用戶輸入命令字符實現判斷:輸入:“1”加密新的明文,輸入:“2”對剛加密的密文進行解密,輸入:“3”退出
*/

#include <stdio.h>
#include <string.h>

int main(int argc, char const *argv[])
{

    int count = 0;
    int result = 1;
    int i;
    char Text[128] = {'\0'};       // 定義一個明文字符數組
    char crytograph[128] = {'\0'}; // 定義一個密文字符數組
    while (1)
    {
        /* code */
        if (result == 1)
        {
            /* code */
            printf("請輸入要加密的明文:");
            scanf("%s", &Text);
            count = strlen(Text);
            for (i = 0; i < count; i++) // 遍歷明文
            {
                /* code */
                crytograph[i] = Text[i] + i + 5; //設置加密字符
            }
            crytograph[i] = '\0'; // 設置字符串結束標記
            /*輸出密文信息*/
            printf("加密後的密文是:%s\n", crytograph);
        }
        else if (result == 2) // 如果是解密字符串
        {
            count = strlen(Text);
            for (i = 0; i < count; i++) // 遍歷密文字符串
            {
                /* code */
                Text[i] = crytograph[i] - i - 5; // 設置解密字符
            }
            Text[i] = '\0';
            /*輸出明文信息*/
            printf("解密後的明文是:%s\n", Text);
        }
        else if (result == 3)
        {
            break; // 跳出循環
        }
        else
        {
            printf("請輸入命令符:"); // 輸出字符串
        }

        /*輸出字符串*/
        printf("輸入1加密新的明文,輸入2對剛加密的密文進行解密,輸入3退出系統:\n");
        printf("請輸入命令符:\n");
        scanf("%d", &result);
    }

    return 0;
}

二、結果

在這裏插入圖片描述

三、凱撒密碼之源碼

/*
 * @Author: jjk
 * @Date: 2019-06-03 21:31:04
 * @Last Modified by: jjk
 * @Last Modified time: 2019-06-10 16:05:42
 * 程序功能:
*       字符串的加密和解密:
*       愷撒密碼是古羅馬愷撒大帝用來對軍事情報進行加解密的算法,
        它採用了替換方法對信息中的每一個英文字符循環替換爲字母表序列中該字符後面的第三個字符,
*       即,字母表的對應關係如下:
         原文:A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
         密文:D E F G H I J K L M N O P Q R S T U V W X Y Z A B C
         對於原文字符P,其密文字符C滿足如下條件:C=(P+3) mod 26
         上述是凱撒密碼的加密方法,解密方法反之,即:P=(C-3) mod 26
         假設用戶可能使用的輸入包含大小寫字母a~zA~Z、空格和特殊符號,
         請編寫一個程序,對輸入字符串進行愷撒密碼加密,直接輸出結果,其中空格不用進行加密處理。使用input()獲得輸入。
 *
 * 思路:
    1、while無線循環,聲明兩個字符數組:保存明文和密文
    2、首次用戶輸入字符串,進行明文加密成密文操作
    3、之後用戶輸入命令字符實現判斷:輸入:“1”加密新的明文,輸入:“2”對“明文”反向解密,輸入:“3” 退出
 *
 *
 *
 *
 *
 */
#include <stdio.h>


// A=65,Z=90,a=97,z=122
// 加密
void CaesarEncrypt(char *pstrBff, int nKey) // nKry:偏移量
{
  int count;
  for (count = 0; pstrBff[count] != '\0'; count++)
  {
    if ((pstrBff[count] >= 'A' && pstrBff[count] <= 'Z') || (pstrBff[count] >= 'a' && pstrBff[count] <= 'z'))
    {
      pstrBff[count] += nKey;
      if (pstrBff[count] > 'Z' && pstrBff[count] < 'a')
        pstrBff[count] -= 26; // -26
      else if (pstrBff[count] > 'z')
        pstrBff[count] -= 26;
    }
  }
}

// 解密
void CaesarDecrypt(char *pstrBff, int nKey)
{
  int count;
  for (count = 0; pstrBff[count] != '\0'; count++)
  {
    if ((pstrBff[count] >= 'A' && pstrBff[count] <= 'Z') || (pstrBff[count] >= 'a' && pstrBff[count] <= 'z'))
    {
      pstrBff[count] -= nKey;
      if (pstrBff[count] < 'A')
        pstrBff[count] += 26;
      else if (pstrBff[count] > 'Z' && pstrBff[count] < 'a')
        pstrBff[count] += 26;
    }
  }
}



int main(void)
{

  char strBff[100]; // 原文
  int bExit = 0;    // 標識符
  unsigned int nSel, nKey = 0;
  printf("“1”加密新的明文,輸入:“2”對剛加密的密文進行解密,輸入:“3”退出");

  while (!bExit)
  {
    printf("\n**************************\n");
    printf("請輸入指令:");
    scanf("%d", &nSel);
    while (getchar() != '\n')
      ;
    switch (nSel)
    {
    case 1:
      printf("請輸入要加密的明文:");
      gets(strBff);
      printf("請輸入偏移量:");
      scanf("%d", &nKey);  // 偏移量
      while (getchar() != '\n')
        ;
      CaesarEncrypt(strBff, nKey); // 加密
      printf("加密後的密文是: %s\n", strBff);
      break;
    case 2:
      printf("請輸入需要解密的明文:");
      gets(strBff);
      printf("請輸入偏移量:");
      scanf("%d", &nKey); // 偏移量
      while (getchar() != '\n')
        ;
      CaesarDecrypt(strBff, nKey);  //解碼
      printf("解碼後的明文:%s\n", strBff);
      break;
    case 3:
      return 1;
    default:
      printf(".\n");
    }
  }
  return 0;
}

四、結果

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章