密码学上的经典瞬间:如果当时有Python!

news2024/10/7 20:33:55

提到“安全”,首先想到的一定是加密。
在如今的互联网环境中,信息加密无处不在,我们早已习惯,甚至毫无感觉。
比如,通过https协议访问的各个网站的内容,QQ,微信等聊天工具之间互相发送的信息等等,都是经过加密处理的。

前几天看了一篇介绍密码学历史的文章,原来密码学的历史可以追溯到古罗马时代,
学习python时,可以用这些历史上红极一时的经典加密方法来练练手,
练习python的同时,也看看前人在密码学上表现的智慧。

凯撒加密

凯撒加密(Caesar Shift)是第一个已知的密码学实例,看名字就知道可能来自古罗马。
这是由罗马皇帝朱利尤斯·凯撒(Julius Caesar)发明的,用于当时的战时秘密通信。

原理非常简单,就是将每个字母向后移动两位,比如**“A”变成“C”“B”变成“D”**等等。
所以,只要将所有可能出现的字母和符号罗列出来,很容易用python实现。

all_chars = """abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,.?:;'"\n """

def change(c, shift=2):
    idx = all_chars.index(c)
    return all_chars[(idx+shift)%len(all_chars)]

def caesar_encrypt(s, shift=2):
    """
    加密,默认后移两位
    """
    chars = [change(c, shift) for c in s]
    return "".join(chars)

def caesar_decrypt(s, shift=-2):
    """
    解密,默认前移两位
    """
    chars = [change(c, shift) for c in s]
    return "".join(chars)

origin_msg = "Attack at nine o 'clock tomorrow morning"
print("原始信息: {}".format(origin_msg))

secret_msg = caesar_encrypt(origin_msg)
print("加密信息: {}".format(secret_msg))
print("解密信息: {}".format(caesar_decrypt(secret_msg)))

# 运行结果
原始信息: Attack at nine o 'clock tomorrow morning
加密信息: Cvvcembcvbpkpgbqb
enqembvqoqttqyboqtpkpi
解密信息: Attack at nine o 'clock tomorrow morning

这种加密方式适合英文字母(字母的数量不大),如果用中文的话,就不太适用了(汉字的数量太多了)。

凯撒加密现在看来实在太简陋,借助计算机来暴力破解,很快就能解密,不过在古代,还是非常有效的。

二战时德国的恩尼格玛

恩尼格玛Enigma)是二战时期德国使用的一种密码机,它在密码学历史上扮演了重要角色。
它借助机械来加密,看起来像一台装满电器元件的打字机,使用了“字母轮”装置,可以进行数百万次的字母置换,生成一组随机的、无模式的字母串。

在二战期间,恩尼格玛被德国军队广泛使用,包括空军、海军和陆军,德国对恩尼格玛进行了多次改进,增加了其安全性。
后来,英国的图灵Alan Turing)领导了一个团队,设计了一种名为**“彭姆斯特号”**的机器,成功破译了恩尼格玛密码。
这一成就对盟军在二战中的胜利起到了重要作用,通过破译恩尼格玛密码,盟军能够获取德国的军事机密信息,从而在战场上取得优势。
IT行业的人,应该没人不知道图灵的吧。有一部名叫《模仿游戏》的电影描述的就是这个事迹,非常精彩。

恩尼格玛密码机的工作原理是通过一系列齿轮或转子,其位置决定替换密码。
关于其细节有很多专业的文章介绍,这里参考网络上的代码实现了一个简易版本(能够支持大小写字母的加密和恢复)。

from random import shuffle, randint, choice
from copy import copy

num_alphabet = list(range(26))

def en_shift(l, n):
    return l[n:] + l[:n]

class Cog:
    """
    模拟转子
    """
    def __init__(self):
        self.shuf = copy(num_alphabet)
        shuffle(self.shuf)
        return

    def subs_in(self, i):
        return self.shuf[i]

    def subs_out(self, i):
        return self.shuf.index(i)

    def rotate(self):
        self.shuf = en_shift(self.shuf, 1)

    def setcog(self, a):
        self.shuf = a

class Enigma:
    def __init__(self, numcogs, readability=True):
        self.readability = readability
        self.numcogs = numcogs
        self.cogs = []
        self.oCogs = []

        for i in range(0, self.numcogs):
            self.cogs.append(Cog())
            self.oCogs.append(self.cogs[i].shuf)

        refabet = copy(num_alphabet)
        self.reflector = copy(num_alphabet)
        while len(refabet) > 0:
            a = choice(refabet)
            refabet.remove(a)

            b = choice(refabet)
            refabet.remove(b)

            self.reflector[a] = b
            self.reflector[b] = a

    def reset(self):
        for i in range(0, self.numcogs):
            self.cogs[i].setcog(self.oCogs[i])

    def encode(self, text):
        t = 0
        ciphertext = ""
        for l in text:
            c = ord(l)
            start_c = 65
            if c >= 97:
                start_c = 97

            num = c % start_c
            if num > 25 or num < 0:
                if self.readability:
                    ciphertext += l
                else:
                    pass

            else:
                # Pass through cogs, reflect, then return through cogs
                t += 1
                for i in range(self.numcogs):
                    num = self.cogs[i].subs_in(num)

                num = self.reflector[num]

                for i in range(self.numcogs):
                    num = self.cogs[self.numcogs - i - 1].subs_out(num)
                ciphertext += "" + chr(start_c + num)

                # Rotate cogs
                for i in range(self.numcogs):
                    if t % ((i * 6) + 1) == 0:
                        self.cogs[i].rotate()
        return ciphertext

# 初始化
x = Enigma(6)

origin_msg = "Attack at nine o 'clock tomorrow morning"
print("原始信息: {}".format(origin_msg))

secret_msg = x.encode(origin_msg)
print("加密信息: {}".format(secret_msg))

x.reset()
print("解密信息: {}".format(x.encode(secret_msg)))

# 运行结果
原始信息: Attack at nine o 'clock tomorrow morning
加密信息: Gpzlwo ub heck w 'ewrfo ufvpvlnj ergaaki
解密信息: Attack at nine o 'clock tomorrow morning

这里初始化了6个转子,恩尼格玛密码机即使针对相同的原始消息,每次运行产生的加密信息都不一样,
大大增加了破解的难度。

有计算机之后

有了计算机之后,加密和解密的能力都大大增强了,目前用的最多也是最安全的当属RSA算法,
RSA的安全性依赖于大数分解的难度,目前被破解的最长RSA密钥是768个二进制位。也就是说,长度超过768位的密钥,还未被破解,至少目前尚未有人公开宣布。

RSA算法在各种编程语言中都有相应的库,这里不在重复实现了。

如果你对Python感兴趣,想要学习python,这里给大家分享一份Python全套学习资料,都是我自己学习时整理的,希望可以帮到你,一起加油!

😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓
Python全套学习资料

在这里插入图片描述

1️⃣零基础入门

① 学习路线

对于从来没有接触过Python的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

② 路线对应学习视频

还有很多适合0基础入门的学习视频,有了这些视频,轻轻松松上手Python~
在这里插入图片描述

③练习题

每节视频课后,都有对应的练习题哦,可以检验学习成果哈哈!
在这里插入图片描述

2️⃣国内外Python书籍、文档

① 文档和书籍资料

在这里插入图片描述

3️⃣Python工具包+项目源码合集

①Python工具包

学习Python常用的开发软件都在这里了!每个都有详细的安装教程,保证你可以安装成功哦!
在这里插入图片描述

②Python实战案例

光学理论是没用的,要学会跟着一起敲代码,动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。100+实战案例源码等你来拿!
在这里插入图片描述

③Python小游戏源码

如果觉得上面的实战案例有点枯燥,可以试试自己用Python编写小游戏,让你的学习过程中增添一点趣味!
在这里插入图片描述

4️⃣Python面试题

我们学会了Python之后,有了技能就可以出去找工作啦!下面这些面试题是都来自阿里、腾讯、字节等一线互联网大厂,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
在这里插入图片描述
在这里插入图片描述

上述所有资料 ⚡️ ,朋友们如果有需要的,可以扫描下方👇👇👇二维码免费领取🆓
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1351786.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端开发_JavaScript基础

JavaScript介绍 JS是一种运行在客户端&#xff08;浏览器&#xff09;的编程语言&#xff0c;实现人机交互效果 作用&#xff1a; 网页特效 (监听用户的一些行为让网页作出对应的反馈) 表单验证 (针对表单数据的合法性进行判断) 数据交互 (获取后台的数据, 渲染到前端) 服…

Android--Jetpack--WorkManager详解

2024已经到来&#xff0c;愿你安睡时&#xff0c;山河入梦。愿你醒来时&#xff0c;满目春风。愿你欢笑时&#xff0c;始终如一。愿你行进时&#xff0c;前程似锦&#xff0c;坦荡从容。 编程语言的未来&#xff1f; 目录 一&#xff0c;定义 二&#xff0c;特点 三&#xff0c…

【心得】PHP文件包含高级利用攻击面个人笔记

目录 一、nginx日志文件包含 二、临时文件包含 三、php的session文件包含 四、pear文件包含 五 、远程文件包含 文件包含 include "/var/www/html/flag.php"; 一 文件名可控 $file$_GET[file]; include $file.".php"; //用php伪协议 &#xff0…

【Leetcode】2487. 从链表中移除节点

文章目录 题目思路代码 题目 2487. 从链表中移除节点 思路 1、递归移除节点&#xff1a; 如果头节点为空&#xff0c;直接返回空。递归调用函数处理下一个节点 head->next。在递归返回后&#xff0c;判断当前节点的值是否小于之前记录的最大值 maxVal。如果小于 maxVal…

【Unity中的A星寻路】Navigation导航寻路系统四大页签详解

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

uniapp 使用wx.getFuzzyLocation获取当前的模糊地理位置

前言&#xff1a; 最近在进行一个小程序项目开发的时候&#xff0c;需要用到定位的功能&#xff0c;然后首先是尝试了getLocation方法&#xff0c;但是sccess中的内容始终无法打印&#xff0c;后来才知道是需要申请权限&#xff0c;在连续小程序后台管理员申请权限之后&#x…

【鸿蒙千帆起】《开心消消乐》完成鸿蒙原生应用开发,创新多端联动用户体验

《开心消消乐》已经完成鸿蒙原生应用开发&#xff0c;乐元素成为率先完成鸿蒙原生应用开发的 20游戏厂商之一。作为一款经典游戏&#xff0c;《开心消消乐》已经拥有 8 亿玩家&#xff0c;加入鸿蒙原生应用生态&#xff0c;将为其带来更优的游戏性能和更多创新体验。自 9 月 25…

【Math】重要性采样 Importance sample推导【附带Python实现】

【Math】重要性采样 Importance sample推导【附带Python实现】 文章目录 【Math】重要性采样 Importance sample推导【附带Python实现】1. Why need importance sample?2. Derivation of Discrete Distribution3. Derivation of Continuous Distribution3. An Example 笔者在学…

虹科方案|从困境到突破:TigoLeap方案引领数据采集与优化

导读&#xff1a;在数字化工厂和智能制造的时代&#xff0c;数据已经成为优化机器和流程的关键。然而&#xff0c;如何高效地收集和处理这些数据&#xff0c;特别是在开发、部署和生产阶段&#xff0c;仍是企业面临的一大挑战。虹科TigoLeap平台&#xff0c;作为一款引领行业变…

Windows mp4info使用教程(提取MP4盒子信息、MP4 box信息、box分析工具、atom分析工具)

参考文章&#xff1a;https://www.onlinedown.net/soft/617940.htm 文章目录 软件主界面打开视频文件点击左方能看到各盒子信息 软件主界面 双击打开软件&#xff1a; 打开视频文件 点击左方能看到各盒子信息 比我用xxd命令查看原始16进制数据方便多了。 ᅟᅠ        …

C++初阶——类与对象

目录 C宏函数 在使用宏函数时&#xff0c;有几个常见的错误需要注意&#xff1a; 宏函数在某些情况下有以下优势&#xff1a; 1.C宏函数 在 C 中&#xff0c;宏函数&#xff08;Macro Function&#xff09;是使用预处理器定义的宏&#xff08;Macro&#xff09;&#xff0…

一、HTML5简介

一、简介 超文本标记语言&#xff08;英语&#xff1a;HyperText Markup Language&#xff0c;简称&#xff1a;HTML&#xff09;是一种用于创建网页的标准标记语言。可以使用 HTML 来建立自己的 WEB 站点&#xff0c;HTML 运行在浏览器上&#xff0c;由浏览器来解析。 <!…

swift-碰到的问题

如何让工程不使用storyboard和scene 删除info.plist里面的Application Scene mainifest 删除SceneDelegate.swift 删除AppDelegate.swift里面的这两个方法 func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession…

javascript 常见工具函数(四)

31.RGB值和十六进制值之间的转换&#xff1a; &#xff08;1&#xff09;十六进制的颜色转为 RGB格式&#xff1a; /*16进制颜色转为RGB格式*/String.prototype.colorRgb function () {var sColor this.toLowerCase();if (sColor && reg.test(sColor)) {if (sColor.l…

【通讯录案例-登录功能-Segue Objective-C语言】

一、我们接下来呢,来说这个登录按钮的实现, 1.我们来实现一下这个登录按钮的一个功能啊, 比如说,当我点击“登录”了以后,我要跳到后边儿的那个TableView, 首先呢,我们来看一下示例程序,参考一下, 当我们上边这两个文本框都有值的时候, 当这两个文本框都有值了以后…

Nginx - 使用error_page实现带有图片的自定义错误页面

文章目录 概述官网文档需求实现 概述 在Nginx中&#xff0c;您可以使用error_page指令来指定当请求遇到特定错误时应当显示的自定义错误页面。为了实现带有图片的自定义错误页面&#xff0c;可以按照以下步骤操作&#xff1a; 创建错误页面&#xff1a; 首先&#xff0c;需要…

three.js 多通道组合

效果&#xff1a; 代码&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"></div><div style"border: 1px so…

计算机毕业论文内容参考|基于区块链技术的电子健康记录系统的设计与实现

文章目录 摘要前言绪论课题背景国内外相关研究课题内容区块链技术介绍系统分析用户需求分析系统设计系统实现系统测试总结与展望摘要 本文介绍了基于区块链技术的电子健康记录系统的设计与实现。该系统旨在解决传统电子健康记录系统存在的数据安全性、数据隐私性和数据互操作性…

HTML5和JS实现明媚月色效果

HTML5和JS实现明媚月色效果 先给出效果图&#xff1a; 源码如下&#xff1a; <!DOCTYPE html> <html> <head><title>明媚月光效果</title><style>body {margin: 0;overflow: hidden;background-color: #000; /* 添加一个深色背景以便看到…

新全国产迅为龙芯 3A6000 处理器板卡

11月28日&#xff0c;“2023龙芯产品发布暨用户大会”在北京举行&#xff0c;迅为作为龙芯重要合作伙伴受邀参加&#xff0c;在整机产品发布仪式上&#xff0c;展示了基于龙芯 3A6000 处理器的全国产安全型工控计算机。 龙芯 3A6000 处理器完全自主设计、性能优异&#xff0c;代…