
游說萬乘苦不早,著鞭跨馬涉遠道,仰天大笑出門去,我輩豈是蓬蒿人!
文章目錄
- 前言
- 正文
- 古典密碼
- 一、古典密碼概述介紹
- 1、置換密碼
- 2、代換密碼
- 二、古典密碼分類介紹
- 1、置換密碼
- 2、編輯本段代換密碼
- 三、編輯本段代換密碼中的加法密碼(凱撒密碼)
- 1、加法密碼介紹
- 2、該密碼程式整體分析
- 3、該密碼程式分步分析
- 1、test.h頭檔案
- 2、zhizhen.cpp 源檔案
- 3、test1.cpp 源檔案
- 4、test2.cpp 源檔案
- 四、程式整體代碼展示
- 結語:
前言
Happy new year , everyone! 2022年的第一天,forever 在這里祝大家虎年快樂,希望大家在新的一年里鍵盤敲爛,年薪百萬,
forever 因為一些緣故,接觸一些關于密碼學的知識,當時是以凱撒密碼為話題打開的,然后自己寫完之后就發現挺有趣的,覺得密碼學確實博大精深,因此今天就想寫一篇博客來記錄并且分享一下自己學到的皮毛!
這里我們就先介紹一下古典密碼學,然后在其中重點介紹一下凱撒密碼吧!
正文
古典密碼
一、古典密碼概述介紹
古典密碼編碼方法歸根結底主要有兩種,即置換和代換,
1、置換密碼
把明文中的字母重新排列,字母本身不變,但位置發生了變化,這樣編成的密碼稱為置換密碼,其中最簡單的例子就是:倒序明文,即將明文的內容倒過來,然后截成固定長度的字母組作為密文,
2、代換密碼
代換密碼則是將明文中的字符替代成其他字符,組成的新字符就是密文,
二、古典密碼分類介紹
1、置換密碼
1、列置換
加密:這里是將明文按照固定長 n 分組,即每一行有 n 個字母,在密鑰控制下按照某一順序交換列,最后按照列的優先順序依次讀出,即產生了密文,解密:逆程序,
2、周期置換
一般是進行同列置換,但是在加、解密時,在列交換后是按行優先的順序向下進行的,
2、編輯本段代換密碼
1、單表代換密碼
(1)加法密碼
加法密碼是利用明文字母在字母表中后面第 K 個字母來代替,
其加密原理為:t=(m+k) mod n;
解密:m=(t-k) mod n;
當 k = 3 時,此時就是著名的凱撒密碼;凱撒密碼是歷史上第一個密碼技術,
(2)乘法密碼
加密原理:t=m*k mod n;滿足條件gcd(n,k)=1,表示兩個數互素,即 n 和 k 的最大公因數為1時,才能正確解密,當 n=26 時則這里與26互素的數有1、3、5、7、9、11、15、17、19、21、23、25;因此這里乘法加密的密鑰空間為12;當 k=1 時,加密變換為恒等變換,即無變化,
(3)密鑰詞組代替密碼
隨機選一個詞語,去掉其中的重復字母,寫到矩陣的第一行,從明文字母表中去掉這一行的字母,其余字母順序寫入矩陣,然后按列取出字母構成密文字母表,
2、多表代換密碼
單表代替密碼的安全性不高,一個原因是一個明文字母只由一個密文文字字母代替,因此可以利用頻率分析來破譯,所以就產生了更為安全的多表代換密碼,即構造多個密文字母表,在密鑰的控制之下用一系列代換表對明文的字母序列進行代換,這樣就提高了代換的次數和復雜程度,
(1)Vernam密碼
(2)Playfair密碼
(3)Hill密碼(乘積密碼)
三、編輯本段代換密碼中的加法密碼(凱撒密碼)
凱撒密碼就是編輯本段代換密碼中的加法密碼中的典型例子,凱撒密碼它屬于著名的加法密碼系列,
這里我們就來講一講加法密碼,當然凱撒密碼也屬于加法密碼系列,因此 for ever 就帶大家一起看看吧!
1、加法密碼介紹
加法密碼
加法密碼是利用明文字母在字母表中后面第 K 個字母來代替,
其加密原理為:t=(m+k) mod n;
解密:m=(t-k) mod n;
當 k = 3 時,此時就是著名的凱撒密碼;凱撒密碼是歷史上第一個密碼技術,
2、該密碼程式整體分析
此程式 forever 將其安排如下:
頭檔案 test.h 檔案,該檔案作用:庫函式頭檔案的參考、符號的宣告、函式的宣告
源檔案 zhizhen.cpp 檔案 ,該檔案作用:程式的主函式(程式主體架構)
源檔案 test1.cpp 檔案,該檔案作用:加密函式的實作
源檔案 test2.cpp 檔案,該檔案作用:解密函式的實作
3、該密碼程式分步分析
1、test.h頭檔案
//頭檔案的參考
#include <stdio.h>
#include <string.h>
//函式的宣告
void jiami(char ao, int k);//加密函式
void jiemi(char au, int k);//解密函式
2、zhizhen.cpp 源檔案
#include "test.h"
//列印選單函式
void menu()
{
printf("——— 0.exit(退出程式) ———\n");
printf("——— 1.encryption(加密) ———\n");
printf("——— 2.deciphering(解密)———\n");
}
//主函式
int main()
{
char AI=0;
char AU=0;
int k = 0;
unsigned int n = 0;
do
{
menu();
printf("請選擇:");
scanf("%d", &n);
AI = getchar();
switch (n)
{
case 1:printf("開始加密\n");
printf("密鑰:");
scanf("%d", &k);
AI = getchar();
printf("加密前檔案:");
AI = getchar();
printf("加密后檔案:");
jiami(AI, k);//呼叫加密函式
printf("\n");
break;
case 2:printf("開始解密\n");
printf("密鑰:");
scanf("%d", &k);
AU = getchar();
printf("解密前檔案:");
AU = getchar();
printf("解密后檔案:");
jiemi(AU, k);//呼叫解密函式
printf("\n");
break;
case 0:printf("退出程式\n");
break;
default:printf("請輸入合法數字\n");
}
printf("\n");
} while (n);
return 0;
}
運行結果:

總結:程式里面用了大量 getcgar() 函式,其中多數作用是用來吸識訓車的
3、test1.cpp 源檔案
#include "test.h"
//凱撒密碼加密程式
void jiami(char ai, int k)
{
while (ai != '\n')
{
if (ai >= 'a' && ai <= 'z')
{
printf("%c", (ai - 'a' + k) % 26 + 'a');//加法加密的公式
}
else if (ai >= 'A' && ai <= 'Z')
{
printf("%c", (ai - 'A' + k) % 26 + 'A');
}
else
{
printf("%c", ai);
}
ai = getchar();
}
}
運行結果:

總結:
1、 這里密鑰是k 自己輸入,當 k = 3 時,就是著名的凱撒密碼,
2、(ai - ‘a’ + k) % 26 + ‘a’ 這一串公式,就是加法密碼再加密時候的演算法公式,其原理是利用 ASCⅡ 值來計算的,
4、test2.cpp 源檔案
#include "test.h"
//凱撒解密程式
void jiemi(char au, int k)
{
while (au != '\n')
{
if (au >= 'a' && au <= 'z')
{
printf("%c", (((au - 'a' - k) % 26) + 26) % 26 + 'a');
}
else if (au >= 'A' && au <= 'Z')
{
printf("%c", (((au - 'A' - k) % 26) + 26) % 26 + 'A');
}
else
{
printf("%c", au);
}
au = getchar();
}
}
運行結果:

總結:
1、((au - ‘a’ - k) % 26) + 26) % 26 + ‘a’) 同理,這是解密的演算法公式,
2、解密的時候注意密鑰輸入和加密輸入的密鑰要相同,才能正確解密,
四、程式整體代碼展示
加密密碼之凱撒密碼代碼如下:
#include <stdio.h>
#include <string.h>
void jiami(char ao, int k);
void jiemi(char au, int k);
void menu()
{
printf("——— 0.exit(退出程式) ———\n");
printf("——— 1.encryption(加密) ———\n");
printf("——— 2.deciphering(解密)———\n");
}
//凱撒密碼加密程式
void jiami(char ai, int k)
{
while (ai != '\n')
{
if (ai >= 'a' && ai <= 'z')
{
printf("%c", (ai - 'a' + k) % 26 + 'a');
}
else if (ai >= 'A' && ai <= 'Z')
{
printf("%c", (ai - 'A' + k) % 26 + 'A');
}
else
{
printf("%c", ai);
}
ai = getchar();
}
}
//凱撒解密程式
void jiemi(char au, int k)
{
while (au != '\n')
{
if (au >= 'a' && au <= 'z')
{
printf("%c", (((au - 'a' - k) % 26) + 26) % 26 + 'a');
}
else if (au >= 'A' && au <= 'Z')
{
printf("%c", (((au - 'A' - k) % 26) + 26) % 26 + 'A');
}
else
{
printf("%c", au);
}
au = getchar();
}
}
//主函式
int main()
{
char AI=0;
char AU=0;
int k = 0;
unsigned int n = 0;
do
{
menu();
printf("請選擇:");
scanf("%d", &n);
AI = getchar();
switch (n)
{
case 1:printf("開始加密\n");
printf("密鑰:");
scanf("%d", &k);
AI = getchar();
printf("加密前檔案:");
AI = getchar();
printf("加密后檔案:");
jiami(AI, k);//呼叫加密函式
printf("\n");
break;
case 2:printf("開始解密\n");
printf("密鑰:");
scanf("%d", &k);
AU = getchar();
printf("解密前檔案:");
AU = getchar();
printf("解密后檔案:");
jiemi(AU, k);//呼叫解密函式
printf("\n");
break;
case 0:printf("退出程式\n");
break;
default:printf("請輸入合法數字\n");
}
printf("\n");
} while (n);
return 0;
}
運行結果:

結語:
光陰似箭確實不假!送2021年的那個我,迎2022年的那個我,今天 forever 給大家介紹的密碼學相關基礎知識并且詳細敘說了加法密碼之凱撒密碼,希望大家感興趣,也望其能夠幫助到一些人,如有不足或錯誤之處,歡迎大佬批評并指正哈!
謝謝觀看!
再見啦!
以上代碼均可運行,所用編譯環境為 vs2019 ,運行時注意加上編譯頭檔案#define _CRT_SECURE_NO_WARNINGS 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/400613.html
標籤:其他
上一篇:【Leetcode資料結構演算法題】合并兩個有序陣列(順序表篇)
下一篇:一名計算機大學生的自述
