欢迎光临北京国标标准舞学院网!

服务热线:010-69453013

凯撒密码_c++_java_python(加密及解密)

文章目录

1.凯撒密码简介

公元前100多年凯撒发明的一种密码,简单来说是平移密码,也就是将字母位置向后移动一定位数。
如原文是ABCXYZ,密钥为3,加密后就是DEFABC。
以密钥的数字向后平移了三位,如果密钥是5就是平移五位。
解密就是把加密的文字进行还原。

2.凯撒密码分析

我们通过对题目的分析可以发现,加密与解密就是对字母的ASCII值移动n位后得到的字母,当我们对字母加密后解密就是加密的反过程。
总体来说就是对ASCII的处理。

3.代码实现

1.c++实现

#include
#include
#include
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()将数字转换成字符。

3.chr()_and_ord()

1.chr()函数参数是0 - 256 的一个整数,
ord()函数参数是一个ascii字符;
2.chr()函数返回值是当前整数对应的ascii字符,
ord()函数返回对应字符的ascii码;
3.chr函数将ascll码转为字符,
ord函数将字符转为ascll码