1.凯撒密码简介
公元前100多年凯撒发明的一种密码,简单来说是平移密码,也就是将字母位置向后移动一定位数。
如原文是ABCXYZ,密钥为3,加密后就是DEFABC。
以密钥的数字向后平移了三位,如果密钥是5就是平移五位。
解密就是把加密的文字进行还原。
2.凯撒密码分析
我们通过对题目的分析可以发现,加密与解密就是对字母的ASCII值移动n位后得到的字母,当我们对字母加密后解密就是加密的反过程。
总体来说就是对ASCII的处理。
3.代码实现
1.c++实现
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
char caidan();
void jiami();
void jiami_1(char mima_1[], char mima_2[]);
void jiemi();
void jiemi_1(char mima_1[], char mima_2[]);
int main() {
while (1) {
int n = caidan();
if (n == '0') {
cout << "已退出";
return 0;
}
else if (n == '1') {
jiami();
}
else if (n == '2') {
jiemi();
}
else {
cout<<"输入错误\n";
}
}
}
char caidan(){
cout << "----------凯撒密码----------" << endl;
cout << "| 1.加密 |\n";
cout << "| 2.解密 |\n";
cout << "| 0.退出 |\n";
cout << "----------------------------\n";
cout << "请输入:";
char n;
cin >> n;
return n;
}
void jiami() {
char mima_1[100];
char mima_2[100];
cout << "请输入明文";
cin >> mima_1;
jiami_1(mima_1,mima_2);
cout << "所对应的暗文是:";
for(int i=0;i<strlen(mima_1);i++)
cout << mima_2[i];
cout << endl;
}
void jiami_1(char mima_1[], char mima_2[]) {
int n;
cout << "请输入密钥";
cin >> n;
n = n % 26;
int s;
s = strlen(mima_1);
for (int i = 0; i < s; i++) {
if(mima_1[i]>='a'&& mima_1[i] <= 'z')
mima_2[i] = (((mima_1[i] - 'a') + n) % 26) + 'a';
else if (mima_1[i] >= 'A' && mima_1[i] <= 'Z')
mima_2[i] = (((mima_1[i] - 'A') + n) % 26) + 'A';
else {
return;
}
}
}
void jiemi() {
char mima_1[100];
char mima_2[100];
cout << "请输入暗文";
cin >> mima_1;
jiemi_1(mima_1, mima_2);
for (int i = 0; i < strlen(mima_1); i++)
cout << mima_2[i];
cout << endl;
}
void jiemi_1(char mima_1[], char mima_2[]) {
int n;
cout << "请输入密钥";
cin >> n;
n = n % 26;
int s;
s = strlen(mima_1);
for (int i = 0; i < s; i++) {
if (mima_1[i] >= 'a' && mima_1[i] <= 'z')
mima_2[i] = (((mima_1[i] - 'a') - n + 26) % 26) + 'a';
else if (mima_1[i] >= 'A' && mima_1[i] <= 'Z')
mima_2[i] = (((mima_1[i] - 'A') - n + 26) % 26) + 'A';
else {
return;
}
}
}
2.java实现
import java.util.Scanner;
public class Main {
private static char caidan() {
System.out.println("----------凯撒密码----------");
System.out.println("| 1.加密 |");
System.out.println("| 2.解密 |");
System.out.println("| 0.退出 |");
System.out.println("---------------------------");
char n;
System.out.print("请输入:");
Scanner sc =new Scanner(System.in);
n=sc.next().charAt(0);
return n;
}
private static void jiami() {
Scanner sc=new Scanner(System.in);
String mima_1;
String mima_2;
System.out.print("请输入明文:");
mima_1=sc.nextLine();
mima_2=jiami_1(mima_1);
System.out.print("所对应的暗文是:");
System.out.println(mima_2);
}
private static String jiami_1(String mima_1) {
String mima_2="";
Scanner sc=new Scanner(System.in);
System.out.print("请输入密钥:");
int n=sc.nextInt();
n=n%26;
for(int i=0;i<mima_1.length();i++){
char a=mima_1.charAt(i);
if(a>='a'&&a<='z'){
int b;
b=a-'a';
b+=n;
if(b>25){
b-=26;
}
mima_2+=(char)(b+'a');
}
else if(a>='A'&&a<='Z'){
int b;
b=a-'A';
b+=n;
if(b>25){
b-=26;
}
mima_2+=(char)(b+'A');
}
else {
mima_2="错误";
System.out.println(mima_2);
}
}
return mima_2;
}
private static void jiemi() {
Scanner sc=new Scanner(System.in);
String mima_1;
String mima_2;
System.out.print("请输入暗文:");
mima_1=sc.nextLine();
mima_2=jiemi_1(mima_1);
System.out.print("所对应的明文是:");
System.out.println(mima_2);
}
private static String jiemi_1(String mima_1) {
String mima_2="";
Scanner sc=new Scanner(System.in);
System.out.print("请输入密钥:");
int n=sc.nextInt();
n=n%26;
for(int i=0;i<mima_1.length();i++){
char a=mima_1.charAt(i);
if(a>='a'&&a<='z'){
int b;
b=a-'a';
b-=n;
if(b<0){
b+=26;
}
mima_2+=(char)(b+'a');
}
else if(a>='A'&&a<='Z'){
int b;
b=a-'A';
b-=n;
if(b<0){
b+=26;
}
mima_2+=(char)(b+'A');
}
else {
mima_2="错误";
System.out.println(mima_2);
}
}
return mima_2;
}
public static void main(String[] args) {
while (true){
char n=caidan();
if(n=='1'){
jiami();
}
else if(n=='2'){
jiemi();
}
else if(n=='0'){
System.out.println("已退出");
break;
}
else {
System.out.println("输入错误");
}
}
}
}
3.python实现
def caidan():
print("----------凯撒密码----------")
print("| 1.加密 |")
print("| 2.解密 |")
print("| 0.退出 |")
print("---------------------------")
a = input("请输入:")
return a
def jiami():
a = input("请输入明文:")
b = jiami_1(a)
print("所对应的暗文是:" + b)
def jiami_1(a):
n = int(input("请输入密钥:"))
n = n % 26
b = ""
for i in a:
if i == ' ':
i = ' '
else:
if 'a'<=i<='z':
s = chr((ord(i) - ord('a') + n) % 26 + ord('a'))
b += s
if 'A'<=i<='Z':
s = chr((ord(i) - ord('A') + n) % 26 + ord('A'))
b += s
return b
def jiemi():
a = input("请输入明文:")
b = jiemi_1(a)
print("所对应的暗文是:" + b)
def jiemi_1(a):
n = int(input("请输入密钥:"))
n = n % 26
b = ""
for i in a:
if i == ' ':
i = ' '
else:
if 'a' <= i <= 'z':
s = chr((ord(i) - ord('a') - n) % 26 + ord('a'))
b += s
if 'A' <= i <= 'Z':
s = chr((ord(i) - ord('A') - n) % 26 + ord('A'))
b += s
return b
if __name__ == '__main__':
while 1:
n = caidan()
if n == '1':
jiami()
elif n == '2':
jiemi()
elif n == '0':
print("已退出")
break
else:
print("输入错误")
4.算法分析
1.c++实现
1.加密
for (int i = 0; i < s; i++) {
if(mima_1[i]>='a'&& mima_1[i] <= 'z')
mima_2[i] = (((mima_1[i] - 'a') + n) % 26) + 'a';
else if (mima_1[i] >= 'A' && mima_1[i] <= 'Z')
mima_2[i] = (((mima_1[i] - 'A') + n) % 26) + 'A';
else {
return;
}
}
s为字符串的长度,然后字符减‘a’或‘A’,得到一个序号(0–25代表字母a–z)然后加上密钥再对26求余,可以得到一个新的序号。再加上‘a’或‘A’可以变成所对应字母的ascii。
2.解密
for (int i = 0; i < s; i++) {
if (mima_1[i] >= 'a' && mima_1[i] <= 'z')
mima_2[i] = (((mima_1[i] - 'a') - n + 26) % 26) + 'a';
else if (mima_1[i] >= 'A' && mima_1[i] <= 'Z')
mima_2[i] = (((mima_1[i] - 'A') - n + 26) % 26) + 'A';
else {
return;
}
}
s为字符串的长度,然后字符减‘a’或‘A’,得到一个序号(0–25代表字母a–z)然后减去密钥再对26求余,可以得到一个新的序号。再加上‘a’或‘A’可以变成所对应字母的ascii。
2.java实现
1.加密
for(int i=0;i<mima_1.length();i++){
char a=mima_1.charAt(i);
if(a>='a'&&a<='z'){
int b;
b=a-'a';
b+=n;
if(b>25){
b-=26;
}
mima_2+=(char)(b+'a');
}
else if(a>='A'&&a<='Z'){
int b;
b=a-'A';
b+=n;
if(b>25){
b-=26;
}
mima_2+=(char)(b+'A');
}
else {
mima_2="错误";
System.out.println(mima_2);
}
}
charAt(i)是 提取字符串中第i个字符,注意i是从0开始。
mima_1.length()是求字符串的长度。
字符减‘a’或‘A’,把字符型转换为整型,得到一个序号(0–25代表字母a–z)然后加上密钥,如果得到的数字大于25,则需要减去26,可以得到一个新的序号。再加上‘a’或‘A’可以变成所对应字母的ascii。然后进行数据的强制转换得到加密后的结果
2.解密
for(int i=0;i<mima_1.length();i++){
char a=mima_1.charAt(i);
if(a>='a'&&a<='z'){
int b;
b=a-'a';
b-=n;
if(b<0){
b+=26;
}
mima_2+=(char)(b+'a');
}
else if(a>='A'&&a<='Z'){
int b;
b=a-'A';
b-=n;
if(b<0){
b+=26;
}
mima_2+=(char)(b+'A');
}
else {
mima_2="错误";
System.out.println(mima_2);
}
}
charAt(i)是 提取字符串中第i个字符,注意i是从0开始。
mima_1.length()是求字符串的长度。
字符减‘a’或‘A’,把字符型转换为整型,得到一个序号(0–25代表字母a–z)然后减去密钥,如果得到的数字小于0,则需要加上26,可以得到一个新的序号。再加上‘a’或‘A’可以变成所对应字母的ascii。然后进行数据的强制转换得到加密后的结果
3.python实现
1.加密
for i in a:
if i == ' ':
i = ' '
else:
if 'a'<=i<='z':
s = chr((ord(i) - ord('a') + n) % 26 + ord('a'))
b += s
if 'A'<=i<='Z':
s = chr((ord(i) - ord('A') + n) % 26 + ord('A'))
b += s
可以先利用ord()将字符转换为数字,然后利用公式进行计算,最后通过chr()将数字转换成字符。
2.解密
for i in a:
if i == ' ':
i = ' '
else:
if 'a' <= i <= 'z':
s = chr((ord(i) - ord('a') - n) % 26 + ord('a'))
b += s
if 'A' <= i <= 'Z':
s = chr((ord(i) - ord('A') - n) % 26 + ord('A'))
b += s
可以先利用ord()将字符转换为数字,然后利用公式进行计算,最后通过chr()将数字转换成字符。文章来源:https://www.toymoban.com/news/detail-738946.html
3.chr()_and_ord()
1.chr()函数参数是0 - 256 的一个整数,
ord()函数参数是一个ascii字符;
2.chr()函数返回值是当前整数对应的ascii字符,
ord()函数返回对应字符的ascii码;
3.chr函数将ascll码转为字符,
ord函数将字符转为ascll码文章来源地址https://www.toymoban.com/news/detail-738946.html
到了这里,关于凯撒密码_c++_java_python(加密及解密)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!