【Python】编写代码,实现恺撒密码的加密算法以及欧氏距离程序

138 阅读3分钟

我正在参加「掘金·启航计划」

在本次python文章种,编写此函数的目的,主要是为了理解和掌握自定义函数过程的定义和调用方法,以及函数中的参数的作用,本次定义的函数是恺撒密码加解密算法

image.png

编号语言或插件修饰符说明
1pythonmath.pow(x,y)次方,math.pow(3,2),3的2次方,就是9
2pythonmath.sqrt(x)平方根,math.sqrt(9)=3

【什么是恺撒密码】

1)在密码学中,恺撒密码(英语:Caesar cipher),或称恺撒加密、恺撒变换、变换加密,是一种最简单且最广为人知的加密技术

2)它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文

3)加密逻辑:例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推

4)解密逻辑:恺撒密码的解密算法程序首先接收用户输入的加密文本,然后对字母a-z和字 母A-Z按照密码算法进行反向转换

5)位移边界需要注意

例如:正向移位三位,则x变为了a,y变为了b,z变成了c

而反向移位(向后移动),则a变成了x,b变成了y,c变成了z,d变成了a

【凯撒加密算法程序编写】

1)函数名定义为:def Caesar_cipher(n,rawstr)

其中,n表示移位数量,rawstr表示用户输入的原文

2)输入输出逻辑

先判断字符串中的字符是否在列表中,如果在,则移位n,如果不在,则原样输出

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# 2022.06.20 11:54
import sys 

# 先判断字符串中的字符是否在列表中,如果在,则移位n,如果不在,则原样输出
def Caesar_cipher(n,rawstr):
    new_str = ''
    str_list = 'abcdefghijklmnopqrstuvwxyz'
    max_index = len(str_list) - 1
    alpha = list(str_list)

    for value in rawstr:
        if value in alpha:
            index = str_list.find(value)
            next_index = index + n
            if next_index > max_index:
                next_index = next_index % max_index - 1
            new_str+=alpha[next_index]
        else:
            new_str+=value
    
    return new_str

while True:
    str_1 = input('请输入原文')
    n = int(input('请输入你所需要移位的数值'))
    cipher = Caesar_cipher(n,str_1)
    print(f'移位{n}后,密文为{cipher}\r\n')

【什么是欧几里得度量】

1)欧几里得度量(euclidean metric)(也称欧氏距离)是一个通常采用的距离定义

2)三维空间里点a和b的坐标,如果分别为a(x1,y1,z1)、b(x2,y2,z2),则ab的距离的计算机公式是

image.png

【欧氏距离实现代码编写】

1)通过上面公式可知,只要确定三位空间的两个坐标点的xyz轴的值,即可通过公式得到两点的距离

2)效果和代码编写如下

e015f226dd9adae650ce068f41763d8.png

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# 2022.06.20 12:19
import sys 
import math

def O_dis(a,b):
    new_str = 0
    
    # 公式:√(x1-x2)^2+(y1-y2)^2+(z1-z2)^2
    # math.sqrt(x) > math.sqrt(9) = 3 > 3^2
    # math.pow(3,2) > 3的2次方
    
    arr_b = b.split(',')
    arr_a = a.split(',')
    
    x1 = int(arr_a[0])
    y1 = int(arr_a[1])
    z1 = int(arr_a[2])

    x2 = int(arr_b[0])
    y2 = int(arr_b[1])
    z2 = int(arr_b[2])

    new_str = math.sqrt(math.pow(x1 - x2,2) + math.pow(y1 - y2,2) + math.pow(z1 - z2,2))

    return new_str

while True:
    a = input('请输入第一个位置的坐标xyz,用逗号分开')
    b = input('请输入第二个位置的坐标xyz,用逗号分开')

    value = O_dis(a,b)

    print(f'欧氏距离的值是{value}\r\n')