最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言實現維吉尼亞密碼的示例代碼

 更新時間:2022年11月16日 15:23:59   作者:特立獨行的小明  
維吉尼亞密碼(又譯維熱納爾密碼)是使用一系列凱撒密碼組成密碼字母表的加密算法,屬于多表密碼的一種簡單形式。本文將用C語言實現維吉尼亞密碼,需要的可以參考一下

前言    

作業(yè)要求:明文中的空格在密文中也有對應空格,明文中的大小寫在密文中也有對應大小寫。

一、維吉尼亞(Vigenère)密碼原理及介紹

在一個凱撒密碼中,字母表中的每一字母都會作一定的偏移,例如偏移量為3時,A就轉換為了D、B轉換為了E……而維吉尼亞密碼則是由一些偏移量不同的愷撒密碼組成。

在生成密碼的時候,可以通過查表的方式(維吉尼亞密碼表),通過密鑰,來確定明文所對應的密文。

這一表格包括了26行字母表,每一行都由前一行向左偏移一位得到。

例如,假設明文為:

GOODSTUDY

密鑰為:

HNUN

由于密鑰比明文短,因此需要重復密鑰,直至密鑰和明文一樣長。對于密鑰來說,每個字母代表的偏移量為該字母在字母表中的位置

對于第一個字母G,對應密鑰第一個字母H,那么由表格中的G行H列加密得到字母N,以此類推,可以得到:

明文:GOODSTUDY    密鑰:HNUN    密文:NBIQZGOQF

二、加密/解密算法介紹

1.加密算法

主要思路:通過ASCII碼來計算偏移量

附ASCII碼對照表:

代碼如下:

int Encryption(char* Plaintext, char* key) //加密算法
{
	int i = 0, j = strlen(key), k = strlen(Plaintext),m=0;
	char result[MAXSIZE] = {0};
	for (i = 0; i < k; i++)
	{
		if (Plaintext[i] != ' '&& Plaintext[i] >= 'a' && Plaintext[i] <= 'z')//明文是小寫字母
		{
			if (key[m % j] >= 'a' && key[m % j] <= 'z')//密鑰為小寫字母
			{
				result[i] = (Plaintext[i] + key[m % j] - 2 * 'a') % 26 + 'a';
			}
			else if (key[m % j] >= 'A' && key[m % j] <= 'Z')//密鑰為大寫字母
			{
				result[i] = (Plaintext[i] + key[m % j] - 'A'-'a') % 26 + 'a';
			}
			m++;
		}
		else if (Plaintext[i] != ' ' && Plaintext[i] >= 'A' && Plaintext[i] <= 'Z')//明文是大寫字母
		{
			if (key[m % j] >= 'a' && key[m % j] <= 'z')//密鑰為小寫字母
			{
				result[i] = (Plaintext[i] + key[m % j] - 'a' - 'A') % 26 + 'A';
			}
			else if (key[m % j] >= 'A' && key[m % j] <= 'Z')//密鑰為大寫字母
			{
				result[i] = (Plaintext[i] + key[m % j] - 'A' - 'A') % 26 + 'A';
			}
			m++;
		}
		else
			result[i] = ' ';
	}
	printf("加密后的密文為:%s\n",result);
	return 0;
}

思路介紹:由于要求<明文中的空格在密文中也有對應空格,明文中的大小寫在密文中也有對應大小寫>,所以需要判斷輸入的明文是否有空格符和密鑰中字母的大小寫。

key[m%j]是為了確保在明文/密文比密鑰長時重復密鑰。

2.解密算法

主要思路:加密算法的逆過程

代碼如下(示例):

int Decrypt(char* Ciphertext, char* key)//解密算法
{
	int i = 0, j = strlen(key), k = strlen(Ciphertext),m=0; 
	char result[MAXSIZE] = { 0 };
	for (i = 0; i < k; i++)
	{
		if (Ciphertext[i] != ' ' && Ciphertext[i] >= 'a' && Ciphertext[i] <= 'z')//明文是小寫字母
		{
			if (key[m % j] >= 'a' && key[m % j] <= 'z')//密鑰為小寫字母
			{
				result[i] = (Ciphertext[i] + 26 - (key[m % j] - 'a') - 'a') % 26 + 'a';
			}
			else if (key[m % j] >= 'A' && key[m % j] <= 'Z')//密鑰為大寫字母
			{
				result[i] = (Ciphertext[i] + 26 - (key[m % j] - 'A') - 'a') % 26 + 'a';
			}
			m++;
		}
		else if (Ciphertext[i] != ' ' && Ciphertext[i] >= 'A' && Ciphertext[i] <= 'Z')//明文是大寫字母
		{
			if (key[m % j] >= 'a' && key[m % j] <= 'z')//密鑰為小寫字母
			{
				result[i] = (Ciphertext[i] + 26 - (key[m % j] - 'a') - 'A') % 26 + 'A';
			}
			else if (key[m % j] >= 'A' && key[m % j] <= 'Z')//密鑰為大寫字母
			{
				result[i] = (Ciphertext[i] + 26 - (key[m % j] - 'A') - 'A') % 26 + 'A';
			}
			m++;
		}
		else
			result[i] = ' ';
	}
	printf("解密后的明文為:%s\n", result);
	return 0;
}

三、完整代碼展示

#include <stdio.h>
#include <string.h>
#define MAXSIZE 100
#define KEY 50
 
int Encryption(char* Plaintext, char* key) //加密算法
{
	int i = 0, j = strlen(key), k = strlen(Plaintext),m=0;
	char result[MAXSIZE] = {0};
	for (i = 0; i < k; i++)
	{
		if (Plaintext[i] != ' '&& Plaintext[i] >= 'a' && Plaintext[i] <= 'z')//明文是小寫字母
		{
			if (key[m % j] >= 'a' && key[m % j] <= 'z')//密鑰為小寫字母
			{
				result[i] = (Plaintext[i] + key[m % j] - 2 * 'a') % 26 + 'a';
			}
			else if (key[m % j] >= 'A' && key[m % j] <= 'Z')//密鑰為大寫字母
			{
				result[i] = (Plaintext[i] + key[m % j] - 'A'-'a') % 26 + 'a';
			}
			m++;
		}
		else if (Plaintext[i] != ' ' && Plaintext[i] >= 'A' && Plaintext[i] <= 'Z')//明文是大寫字母
		{
			if (key[m % j] >= 'a' && key[m % j] <= 'z')//密鑰為小寫字母
			{
				result[i] = (Plaintext[i] + key[m % j] - 'a' - 'A') % 26 + 'A';
			}
			else if (key[m % j] >= 'A' && key[m % j] <= 'Z')//密鑰為大寫字母
			{
				result[i] = (Plaintext[i] + key[m % j] - 'A' - 'A') % 26 + 'A';
			}
			m++;
		}
		else
			result[i] = ' ';
	}
	printf("加密后的密文為:%s\n",result);
	return 0;
}
 
int Decrypt(char* Ciphertext, char* key)//解密算法
{
	int i = 0, j = strlen(key), k = strlen(Ciphertext),m=0; 
	char result[MAXSIZE] = { 0 };
	for (i = 0; i < k; i++)
	{
		if (Ciphertext[i] != ' ' && Ciphertext[i] >= 'a' && Ciphertext[i] <= 'z')//明文是小寫字母
		{
			if (key[m % j] >= 'a' && key[m % j] <= 'z')//密鑰為小寫字母
			{
				result[i] = (Ciphertext[i] + 26 - (key[m % j] - 'a') - 'a') % 26 + 'a';
			}
			else if (key[m % j] >= 'A' && key[m % j] <= 'Z')//密鑰為大寫字母
			{
				result[i] = (Ciphertext[i] + 26 - (key[m % j] - 'A') - 'a') % 26 + 'a';
			}
			m++;
		}
		else if (Ciphertext[i] != ' ' && Ciphertext[i] >= 'A' && Ciphertext[i] <= 'Z')//明文是大寫字母
		{
			if (key[m % j] >= 'a' && key[m % j] <= 'z')//密鑰為小寫字母
			{
				result[i] = (Ciphertext[i] + 26 - (key[m % j] - 'a') - 'A') % 26 + 'A';
			}
			else if (key[m % j] >= 'A' && key[m % j] <= 'Z')//密鑰為大寫字母
			{
				result[i] = (Ciphertext[i] + 26 - (key[m % j] - 'A') - 'A') % 26 + 'A';
			}
			m++;
		}
		else
			result[i] = ' ';
	}
	printf("解密后的明文為:%s\n", result);
	return 0;
}
int main()
{
	int n;
	char Plaintext[MAXSIZE] = {0};
	char Ciphertext[MAXSIZE] = {0};
	char key[KEY] = {0};
	while (1)
	{
		printf("===============\n");
		printf("   1.加密\n");
		printf("   2.解密\n");
		printf("   0.退出\n");
		printf("===============\n");
		printf("請輸入要執(zhí)行的操作:");
		scanf_s("%d",&n);
		getchar();
		switch (n)
		{
		case 1:
			printf("請輸入明文:");
			scanf_s("%[^\n]", Plaintext, MAXSIZE);
			getchar();
			printf("請輸入密鑰:");
			scanf_s("%[^\n]", key, KEY);
			Encryption(Plaintext, key);
			break;
		case 2:
			printf("請輸入密文:");
			scanf_s("%[^\n]", Ciphertext, MAXSIZE);
			getchar();
			printf("請輸入密鑰:");
			scanf_s("%[^\n]", key, KEY);
			Decrypt(Ciphertext, key);
			break;
		case 0:
			exit(0);
			break;
		}
	}
	return 0;
}

做了一個菜單方便選擇加密解密。

總結

主要是ASCII碼的運用,對照維吉尼亞密碼表算出每個字母的偏移量,對邏輯要求可能比較高,需要,計算偏移量以及循環(huán)密鑰較為繁瑣。

到此這篇關于C語言實現維吉尼亞密碼的示例代碼的文章就介紹到這了,更多相關C語言維吉尼亞密碼內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • c++深入淺出講解堆排序和堆

    c++深入淺出講解堆排序和堆

    在c++里有很多排序方法,比如相對簡單的冒泡排序、選擇排序、插入排序,還有 STL里的sort函數  手寫快排  歸并排序等,還有就是堆排序,這次主要說堆排序和堆
    2022-03-03
  • 詳解C++中的雙冒號 ::

    詳解C++中的雙冒號 ::

    這篇文章主要介紹了C++中的雙冒號 ::,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2020-09-09
  • C/C++?Qt?MdiArea?多窗體組件應用教程

    C/C++?Qt?MdiArea?多窗體組件應用教程

    MDI窗體控件類似于畫布,該控件只具備展示窗體的功能,無法實現生成窗體,所以我們需要在項目中手動增加自定義的Dialog對話框,并對該對話框進行一定的定制,這篇文章主要介紹了C/C++?Qt?MdiArea?多窗體組件應用,需要的朋友可以參考下
    2021-12-12
  • opencv3/C++圖像邊緣提取方式

    opencv3/C++圖像邊緣提取方式

    今天小編就為大家分享一篇opencv3/C++圖像邊緣提取方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • C語言轉義字符實例詳解

    C語言轉義字符實例詳解

    這里主要介紹了C語言的轉義字符的知識,并附有示例代碼,以便理解,希望對學習 C語言的同學有所幫助
    2016-07-07
  • C語言之qsort函數詳解

    C語言之qsort函數詳解

    這篇文章主要介紹了C語言中qsort函數的用法實例詳解的相關資料,希望通過本文能幫助到大家,讓大家理解掌握這部分內容,需要的朋友可以參考下
    2021-08-08
  • C++類型轉換的深入總結

    C++類型轉換的深入總結

    這篇文章主要給大家介紹了關于C++類型轉換的深入總結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • C語言詳解float類型在內存中的存儲方式

    C語言詳解float類型在內存中的存儲方式

    在c語言中float函數是單精度的。它在內存中以二進制的形式存儲。分為符號位,階碼與尾數三部分,下面我們詳細來了解一下
    2022-04-04
  • 詳解如何在code block創(chuàng)建一個C語言的項目

    詳解如何在code block創(chuàng)建一個C語言的項目

    這篇文章主要介紹了詳解如何在code block創(chuàng)建一個C語言的項目,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • C語言實現單詞助手功能

    C語言實現單詞助手功能

    這篇文章主要為大家詳細介紹了C語言實現單詞小助手,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10

最新評論

古丈县| 赤壁市| 英吉沙县| 淄博市| 宿州市| 监利县| 客服| 临夏县| 盐亭县| 万全县| 塘沽区| 金堂县| 浙江省| 霸州市| 郴州市| 英吉沙县| 阿瓦提县| 五寨县| 商河县| 嵊泗县| 芦山县| 双流县| 依安县| 项城市| 安义县| 防城港市| 华亭县| 健康| 潼南县| 新津县| 永春县| 扬州市| 体育| 平原县| 普定县| 容城县| 德江县| 即墨市| 水富县| 五大连池市| 睢宁县|