大数据安全 | 【实验】凯撒加密与解密

📚实验目的

  • 通过实际编程掌握凯撒密码的加密、解密与破译,加深对凯撒密码算法的认识。
  • 1)输入任意明文和密钥K=10,对其进行凯撒加密;
  • 2)输入密文和密钥K=10,对其进行凯撒解密。
  • 3)破译如下密文:Izqzm piyzmznodhvoz tjpm kjrzm oj xcvibz tjpmnzga!

📚关于凯撒加密

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实际上就是k是几,就移几位。移位加密的安全性——!!——暴力穷举:把25种可能都试一遍。

🔥输入任意明文和密钥K=10,对其进行凯撒加密;

  1. 首先通过input函数获取用户输入的明文和密钥。
  2. 然后通过循环遍历明文中的每个字符。
    1. 对于空格字符,不进行加密处理,直接保留;
    2. 对于小写字母,通过计算将其位移n个位置后,再转换为相应的ASCII码,也就是小写输出为小写。
    3. 对于其他情况,默认为大写字母,同样通过计算进行位移加密。大写输出为大写。
  3. 最后,将加密后的字符逐个拼接起来,并输出为密文。
a = input("请输入你想要加密的明文:")
n = int(input("请输入你的密钥:"))
b = ""
for letter in a:
    if letter == " ":  
        temp = " "#空格不加密
    elif letter.islower():# 判断是否为小写字母
        temp = chr((ord(letter) - ord("a") + n) % 26 + ord("a"))  # 加密后保持小写
    else:  # 其他情况默认为大写字母
        temp = chr((ord(letter) - ord("A") + n) % 26 + ord("A"))  # 加密后保持大写
    b += temp#将加密后的字符逐个拼接起来
print("密文为:",b)

在这里插入图片描述

🔥输入密文和密钥K=10,对其进行凯撒解密。

  1. 首先通过input函数获取用户输入的密文和密钥。
  2. 然后通过循环遍历明文中的每个字符。
    1. 对于空格字符,不进行解密处理,直接保留;
    2. 对于小写字母,通过计算将其位移n个位置后,再转换为相应的ASCII码,也就是小写输出为小写。
    3. 对于其他情况,默认为大写字母,同样通过计算进行位移解密。大写输出为大写。
  3. 最后,将解密后的字符逐个拼接起来,并输出为明文。
a = input("请输入你想要解密的密文:")
n = int(input("请输入你的密钥:"))
b = ""
for letter in a:
    if letter == " ":  
        temp = " " # 空格不加密
    elif letter.islower():  # 判断是否为小写字母
        temp = chr((ord(letter) - ord("a") - n) % 26 + ord("a"))  # 解密后保持小写
    else:  # 其他情况默认为大写字母
        temp = chr((ord(letter) - ord("A") - n) % 26 + ord("A"))  # 解密后保持大写
    b += temp  # 将解密后的字符逐个拼接起来
print("明文为:",b)

在这里插入图片描述

🔥(暴力)破译密文

  1. 首先定义了三个字符串变量total、upper和lower分别表示所有字母字符、大写字母和小写字母。
  2. 通过input函数获取用户输入的密文。接下来,通过循环从1到25(共25个可能的钥匙,这里默认先不考虑0,也就是不移位)遍历所有钥匙值。
  3. 在内层循环中,对于密文中的每个字符进行处理。
    1. 首先判断字符是否在字母字符total中。如果是,则判断字符是大写字母还是小写字母。
    2. 对于大写字母,通过字符串方法find()函数找到字符在upper中的位置,然后进行钥匙的逆向位移操作;
    3. 对于小写字母,通过字符串方法find()函数找到字符在lower中的位置,然后进行钥匙的逆向位移操作。处理完字符后,将解密后的字符追加到字符串b的末尾。
    4. 如果字符不在字母字符total中,则直接将字符追加到字符串b的末尾。
  4. 最终,输出每个钥匙对应的解密结果。
total = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
lower = "abcdefghijklmnopqrstuvwxyz"

a = input("请输入你要破解的密文:")
for key in range(1,26):
    b = ""
    for i in a:
        if i in total:
            if i.isupper():  #密文字母为大写
                num = upper.find(i)  #在字母里搜索到密文字符的位置
                num = num - key
                if num < 0:
                    num = num + len(upper)
                b = b + upper[num]  #将解密后字符追加到字符串末尾
            elif i.islower():  #密文字母为小写
                num = lower.find(i)  #在字母里搜索到密文字符的位置
                num = num - key
                if num < 0:
                    num = num + len(lower)
                b = b + lower[num]  #将解密后字符追加到字符串末尾
        else:
            b = b + i  #如果密文中内容不在字母里则不解密,直接追加
    print('第%d把钥匙的结果是%s' %(key, b)) 

在这里插入图片描述

  • 破解得:Never underestimate your power to change yourself!

📚分析体会

凯撒加密是一种简单而易于理解的加密方法,但由于只有26个可能的位移值,因此被认为是相对较弱的加密算法。在现代密码学中,它通常被用作教学示例或简单的加密需求,而不适用于安全性要求较高的场景。


参考博客:

凯撒密码加解密程序(C语言) 2009年09月30日 星期三 13:21 1、程序结构化,用函数分别实现 2、对文件的加密,解密输出到文件 #include #include void menu()/*菜单,1.加密 2.解密 3.退出*/ { clrscr(); printf("\n==============================================================================="); printf("\n1.Encrypt the file"); printf("\n2.Decrypt the file"); printf("\n3.Quit\n"); printf("===============================================================================\n"); printf("Please select a item:"); return; } char encrypt(char ch,int n)/*加密函数,把字符向右循环移位n*/ { while(ch>='A'&&ch='a'&&ch<='z') { return ('a'+(ch-'a'+n)%26); } return ch; } main() { int i,n; char ch0,ch1; FILE *in,*out; char infile[10],outfile[10]; textbackground(RED); textcolor(LIGHTGREEN); clrscr(); menu(); ch0=getch(); while(ch0!='3') { if(ch0=='1') { clrscr(); printf("\nPlease input the infile:"); scanf("%s",infile);/*输入需要加密的文件名*/ if((in=fopen(infile,"r"))==NULL) { printf("Can not open the infile!\n"); printf("Press any key to exit!\n"); getch(); exit(0); } printf("Please input the key:"); scanf("%d",&n);/*输入加密密码*/ printf("Please input the outfile:"); scanf("%s",outfile);/*输入加密后文件的文件名*/ if((out=fopen(outfile,"w"))==NULL) { printf("Can not open the outfile!\n"); printf("Press any key to exit!\n"); fclose(in); getch(); exit(0); } while(!feof(in))/*加密*/ { fputc(encrypt(fgetc(in),n),out); } printf("\nEncrypt is over!\n"); fclose(in); fclose(out); sleep(1); } if(ch0=='2') { clrscr(); printf("\nPlease input the infile:"); scanf("%s",infile);/*输入需要解密的文件名*/ if((in=fopen(infile,"r"))==NULL) { printf("Can not open the infile!\n"); printf("Press any key to exit!\n"); getch(); exit(0); } printf("Please input the key:"); scanf("%d",&n);/*输入解密密码(可以为加密时候的密码)*/ n=26-n; printf("Please input the outfile:"); scanf("%s",outfile);/*输入解密后文件的文件名*/ if((out=fopen(outfile,"w"))==NULL) { printf("Can not open the outfile!\n"); printf("Press any key to exit!\n"); fclose(in); getch(); exit(0); } while(!feof(in)) { fputc(encrypt(fgetc(in),n),out); } printf("\nDecrypt is over!\n"); fclose(in); fclose(out); sleep(1); } clrscr(); printf("\nGood Bye!\n"); sleep(3); getch(); } }
下面是一个简单的C++程序,用于破解凯撒加密算法。该程序可以读取一个密文文件,并输出破解后的明文。程序假设密文只包含大写字母,密钥是一个整数。密钥从0到25进行枚举,程序会将每个密钥应用于密文,并输出解密后的明文。程序使用了词频分析来帮助破解密文。 ```c++ #include <iostream> #include <fstream> #include <string> #include <map> using namespace std; // 词频表,记录每个字母出现的频率 map<char, int> freq_table = { {'A', 8167}, {'B', 1492}, {'C', 2782}, {'D', 4253}, {'E', 12702}, {'F', 2228}, {'G', 2015}, {'H', 6094}, {'I', 6966}, {'J', 153}, {'K', 772}, {'L', 4025}, {'M', 2406}, {'N', 6749}, {'O', 7507}, {'P', 1929}, {'Q', 95}, {'R', 5987}, {'S', 6327}, {'T', 9056}, {'U', 2758}, {'V', 978}, {'W', 2360}, {'X', 150}, {'Y', 1974}, {'Z', 74} }; // 统计一个字符串中每个字母出现的频率 map<char, int> count_letters(string s) { map<char, int> freq; for (char c : s) { if (isalpha(c)) { freq[toupper(c)]++; } } return freq; } // 计算一个字符串的得分,用于评估其是否是明文 int score_string(string s) { int score = 0; map<char, int> freq = count_letters(s); for (auto p : freq) { char c = p.first; int count = p.second; if (freq_table.count(c)) { int expected_count = freq_table[c] * s.size() / 100; score += abs(count - expected_count); } } return score; } // 对一个字符串进行凯撒解密 string caesar_decrypt(string s, int key) { string plaintext = ""; for (char c : s) { if (isalpha(c)) { char base = isupper(c) ? 'A' : 'a'; char decrypted = base + ((c - base - key + 26) % 26); plaintext += decrypted; } else { plaintext += c; } } return plaintext; } int main() { // 读取密文文件 ifstream fin("ciphertext.txt"); string ciphertext; getline(fin, ciphertext); // 枚举密钥,对密文进行解密,并评分 int best_score = INT_MAX; string best_plaintext; for (int key = 0; key < 26; key++) { string plaintext = caesar_decrypt(ciphertext, key); int score = score_string(plaintext); if (score < best_score) { best_score = score; best_plaintext = plaintext; } } // 输出破解后的明文 cout << best_plaintext << endl; return 0; } ``` 该程序读取一个名为"ciphertext.txt"的文件,该文件包含要破解的密文。程序首先枚举密钥,对密文进行解密,并评分。评分使用了词频分析,计算解密后的明文与英文文本的相似度。程序输出得分最低的解密后的明文。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啦啦右一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值