大数据安全 | 【实验】仿射加密

news2024/11/24 8:50:12

文章目录

  • 📚实验目的
  • 📚关于仿射加密
    • 🔥使用暴力破解的方式对仿射加密进行破解,还原明文
    • 🔥使用词频统计的方式对仿射加密进行破解,还原明文
    • 🔥在同一运行环境下,对比两种破解方式所需的时间
  • 📚分析体会

📚实验目的

  • 通过实际编程掌握仿射密码的破译,实现对仿射密码算法以及破解方式的深入理解,考虑在破解过程中密钥长度和密码算法本身的设计对安全性的影响,并思考如何设计更安全的加密算法。具体内容:
  • 1)使用暴力破解的方式对仿射加密进行破解,还原明文;
  • 2)使用词频统计的方式对仿射加密进行破解,还原明文。
  • 3)在同一运行环境下,对比两种破解方式所需的时间。

📚关于仿射加密

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

🔥使用暴力破解的方式对仿射加密进行破解,还原明文

  1. 定义一个空字符串ans,用于存储解密后的明文。
  2. 使用三个嵌套的循环遍历alpha_inverse列表、0到25的beta列表和密文中的每个字符。
    1. 如果字符是空格,则将空格添加到结果字符串ans中。

    2. 如果字符是小写英文字母,则计算字符的偏移量cur(密文字符的ASCII码 - 'a’的ASCII码 - beta)。根据公式解密字符并将解密后的字符添加到结果字符串ans中。公式chr(((cur * alpha_inverse[j]) % 26) + ord('a'))

    3. 如果字符是大写英文字母,同样计算字符的偏移量cur,并根据公式解密字符并将解密后的字符添加到结果字符串ans中。公式chr(((cur * alpha_inverse[j]) % 26) + ord('A'))在这里插入图片描述

    4. 如果字符不是字母,直接将字符添加到结果字符串ans中。

  3. 打印出解密结果。
  4. 清空结果字符串ans,为下一组合结果做准备。
alpha = [1, 3, 5, 7, 9, 11, 15, 17, 19, 21, 23, 25]
alpha_inverse = [1, 9, 21, 15, 3, 19, 7, 23, 11, 5, 17, 25]

# 暴力破解仿射加密
def baoli(mi):
    ans = ""
    # 遍历alpha_inverse列表
    for j in range(len(alpha_inverse)):
        # 遍历0到25的beta列表
        for k in range(26):
            # 遍历密文中的每个字符
            for i in range(len(mi)):
                # 如果字符为空格,将空格添加到结果字符串
                if mi[i] == ' ':
                    ans += ' '
                # 如果字符是小写英文字母
                elif mi[i].islower():
                    # 计算字符的偏移量
                    cur = ord(mi[i]) - ord('a') - k
                    # 解密并将解密后的字符添加到结果字符串
                    if cur >= 0:
                        ans += chr(((cur * alpha_inverse[j]) % 26) + ord('a'))
                    else:
                        ans += chr(((26 + cur) * alpha_inverse[j]) % 26 + ord('a'))
                # 如果字符是大写英文字母
                elif mi[i].isupper():
                    # 计算字符的偏移量
                    cur = ord(mi[i]) - ord('A') - k
                    # 解密并将解密后的字符添加到结果字符串
                    if cur >= 0:
                        ans += chr(((cur * alpha_inverse[j]) % 26) + ord('A'))
                    else:
                        ans += chr(((26 + cur) * alpha_inverse[j]) % 26 + ord('A'))
                # 如果字符不是字母,将字符直接添加到结果字符串
                else:
                    ans += mi[i]
            print("α逆=", alpha_inverse[j], ",β=", k, "时的明文:", ans)
            # 清空结果字符串,用于下一组合结果存储
            ans = ""

密文Ptfxgj Jnno-afv wn Htzaixojv Tjtxg
在这里插入图片描述

🔥使用词频统计的方式对仿射加密进行破解,还原明文

  1. 定义一个空字符串ans,用于存储解密后的明文。

  2. 创建一个列表b,用于记录每个字母在密文中出现的次数,初始值都为0。

    1. 遍历密文中的每个字符,如果字符是小写英文字母,则将对应位置的计数器值加1;如果字符是大写英文字母,则同样将对应位置的计数器值加1。
    2. 找到出现次数最多的字母maxchar和其对应的次数time_max,以及出现次数第二多的字母secondchar和其对应的次数time_secmax。
    3. 将最多字母maxchar的计数器值置为0,排除对找到次常出现字母的干扰。
    4. 将出现频率最多和次多的字母分别映射为e和t
      在这里插入图片描述
  3. 遍历alpha_inverse列表和0到25的beta列表,找到满足条件的alpha_inverse和beta。

    if (((alpha[j] * 4 + k) % 26) == (ord(maxchar) - ord('a'))) and (((alpha[j] * 19 + k) % 26) == (ord(secondchar) - ord('a')))
    

在这里插入图片描述

  1. 再次遍历密文中的每个字符,根据解密的密钥alpha_inverse和beta进行解密操作,并将解密后的字符添加到结果字符串ans中。
  2. 返回解密后的结果字符串ans。

# 使用词频统计方式破解仿射加密
def count(mi):
    ans = ""
    # 用于记录每个字母在密文中出现的次数的列表
    b = [0] * 26
    # 遍历密文中的每个字符统计出现次数
    for i in range(len(mi)):
        if mi[i].islower():
            b[ord(mi[i]) - ord('a')] += 1
        elif mi[i].isupper():
            b[ord(mi[i]) - ord('A')] += 1

    # 出现次数最多的字母
    maxchar = ''
    # 最大出现次数
    time_max = 0
    # 最大出现次数字母的索引
    index = 0
    # 遍历26个字母找最大出现次数的字母
    for i in range(26):
        if b[i] > time_max:
            maxchar = chr(i + ord('a'))
            time_max = b[i]
            index = i
    # 将最大出现次数字母的次数置为0,排除对找次常出现字母的干扰
    b[index] = 0

    # 找次常出现字母
    secondchar = ''
    time_secmax = 0
    for i in range(26):
        if b[i] > time_secmax:
            secondchar = chr(i + ord('a'))
            time_secmax = b[i]

    # 解密的密钥alpha_inverse
    key_alpha = 0
    # 解密的密钥beta
    beta = 0
    # 遍历alpha_inverse列表
    for j in range(len(alpha_inverse)):
        # 遍历0到25的beta列表
        for k in range(26):
            # 如果找到满足条件的alpha_inverse和beta
            if (((alpha[j] * 4 + k) % 26) == (ord(maxchar) - ord('a'))) and (((alpha[j] * 19 + k) % 26) == (ord(secondchar) - ord('a'))):
                # 更新解密的密钥alpha_inverse
                key_alpha = alpha_inverse[j]
                # 更新解密的密钥beta
                beta = k
                break

    # 遍历密文中的每个字符,解密
    for i in range(len(mi)):
        if mi[i] == ' ':
            ans += ' '
        elif mi[i].islower():
            cur = ord(mi[i]) - ord('a') - beta
            if cur >= 0:
                ans += chr(((cur * key_alpha) % 26) + ord('a'))
            else:
                ans += chr(((26 + cur) * key_alpha) % 26 + ord('a'))
        elif mi[i].isupper():
            cur = ord(mi[i]) - ord('A') - beta
            if cur >= 0:
                ans += chr(((cur * key_alpha) % 26) + ord('A'))
            else:
                ans += chr(((26 + cur) * key_alpha) % 26 + ord('A'))
        else:
            ans += mi[i]
    return ans

最高频对应e,次高频对应t
在这里插入图片描述

🔥在同一运行环境下,对比两种破解方式所需的时间

  1. 暴力解法的时间复杂度较高,因为它需要尝试所有可能的alpha_inverse和beta的组合。对于每一组组合,还需要遍历整个密文进行解密操作。因此,当密文较长时,暴力解法的运行时间会显著增加。
  2. 统计词频法相比暴力解法,由于利用了词频信息,它可能能够更快地找到出现频率最高的字母和次常出现的字母,从而确定解密的密钥。因此,统计词频法通常要比暴力解法快速一些,尤其是针对较长密文时。

📚分析体会

  1. 仿射加密是一种基于数学运算的密码算法,它将明文中的每个字符通过一个线性变换映射到密文中的对应字符。该线性变换由两个参数alpha和beta决定。具体来说,给定一个字符x(大小写英文字母),则其在仿射加密中的加密运算为:加密(x) = (alpha * x + beta) mod 26,其中mod 26表示对26取模运算。解密则是加密的逆运算:解密(y) = alpha_inverse * (y - beta) mod 26,其中alpha_inverse表示alpha的逆元。
  2. 暴力破解:该方法通过尝试所有可能的alpha_inverse和beta的组合来破解密文。它会遍历所有可能的参数组合,并将解密后的结果与已知的明文库进行匹配,从而找到正确的参数组合以解密密文。暴力破解的时间复杂度较高,尤其是对于较长的密文,所需的时间可能很长。
  3. 统计词频法:该方法利用了密文中字母的词频信息来猜测解密的参数。首先,统计密文中每个字母的出现次数,找到出现频率最高的字母,以及次常出现的字母。然后利用这两个字母的位置关系及其对应的解密公式,可以得到解密的参数alpha_inverse和beta。通过这种方式,不需要穷举所有可能的参数组合,从而提高破解速度。

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

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

相关文章

LLM之Colossal-LLaMA-2:Colossal-LLaMA-2的简介、安装、使用方法之详细攻略

LLM之Colossal-LLaMA-2:Colossal-LLaMA-2的简介、安装、使用方法之详细攻略 导读:2023年9月25日,Colossal-AI团队推出了开源模型Colossal-LLaMA-2-7B-base。Colossal-LLaMA-2项目的技术细节,主要核心要点总结如下: >> 数据处…

融合之力:数字孪生、人工智能和数据分析的创新驱动

数字孪生、人工智能(AI)和数据分析是当今科技领域中的三个重要概念,它们之间存在着紧密的关联和互动,共同推动了许多领域的创新和发展。 一、概念 数字孪生是一种数字化的模拟技术,它通过复制现实世界中的物理实体、…

应用在手机触摸屏中的电容式触摸芯片

触控屏(Touch panel)又称为触控面板,是个可接收触头等输入讯号的感应式液晶显示装置,当接触了屏幕上的图形按钮时,屏幕上的触觉反馈系统可根据预先编程的程式驱动各种连结装置,可用以取代机械式的按钮面板&…

数据库存储引擎和数据类型详细介绍

目录 一、数据库存储引擎(了解)1.了解MySQL体系结构2.存储引擎(了解)2.1.存储引擎的介绍2.2.存储引擎分类2.3.如何选择引擎? 3.事务控制语言(TCL)事务的四个特性(ACID) 二、数据类型(了解)1.整型…

【文献】TOF标定 Time-of-Flight Sensor Calibration for a Color and Depth Camera Pair

文章目录 Article info.Introduction处理TOF误差Take home messagesResourcesIDEAS Article info. Time-of-Flight Sensor Calibration for a Color and Depth Camera Pair IEEE TRANSACTIONS ON PATTERN ANALYSIS AND MACHINE INTELLIGENCE, VOL. 37, NO. 7, JULY 2015 Intr…

(一)连续随机量的生成-加权重采样

加权重采样 import numpy as np import matplotlib.pyplot as plt# Step 1: Generate 10,000 random theta values from U([0, 1]) n 10000 theta_values np.random.rand(n)# Define the function to compute weights for a given theta def compute_weight(theta):return (…

SQLAlchemy列参数的使用和query函数的使用

目录 Column常用参数 代码演示 代码刨析 query函数的使用 基本用法 常见用法示例 查询所有记录 根据条件查询 查询第一条符合条件的记录 查询特定列的值 添加排序规则 使用聚合函数 连接查询 使用filter_by Column常用参数 primary_key:True设置某个字…

当蛋白质成为儿童的敌人:应对蛋白过敏的挑战

儿童时期是充满欢笑和探索的时光,但对某些孩子来说,它可能伴随着一项不太受欢迎的挑战——蛋白过敏。在这篇文章中,我们将探讨蛋白过敏的现象、挑战以及如何在这个过程中为孩子提供支持。 蛋白质过敏:小儿的无情敌人 蛋白质过敏…

flink的序列化基准测试

背景: flink提供了在本地环境使用jmh测试不同序列化方法的性能差异,本文就是基于这个https://github.com/apache/flink-benchmarks这个性能测试,总结几个结论,以便后面使用时避免掉坑 基准测试 我们本次运行的是SerializationF…

2023 年解锁网络安全即服务

在当今快速发展的数字世界中,强大的网络安全机制的重要性怎么强调都不为过。对于越来越多地发现自己成为网络威胁焦点的小型企业来说尤其如此。 那么,“网络安全即服务”到底是什么?为什么它对小型企业至关重要? 网络安全即服务…

【RocketMQ】(八)Rebalance负载均衡

消费者负载均衡,是指为消费组下的每个消费者分配订阅主题下的消费队列,分配了消费队列消费者就可以知道去消费哪个消费队列上面的消息,这里针对集群模式,因为广播模式,所有的消息队列可以被消费组下的每个消费者消费不…

服务断路器_服务雪崩解决方案之服务限流

服务熔断和服务隔离都属于出错后的容错处理机制,而限流模式则可以称为预防模式。 限流模式主要是提前对各个类型的请求设置最高的QPS阈值,若高于设置的阈值则对该请求直接返回,不再调用后续资源。 注意: 限流的目的是通过对并发访…

【SQL server】数据库入门基本操作教学

个人主页:【😊个人主页】 系列专栏:【❤️初识JAVA】 前言 数据库是计算机系统中用于存储和管理数据的一种软件系统。它通常由一个或多个数据集合、管理系统和应用程序组成,被广泛应用于企业、政府和个人等各种领域。目前常用的数…

点击、拖拉拽,BI系统让业务掌握数据分析主动权

在今天的商业环境中,数据分析已经成为企业获取竞争优势的关键因素之一。然而,许多企业在面对复杂的数据分析工具时,却常常感到困扰。这些工具往往需要专业的技术人员操作,而且界面复杂,难以理解和使用。对业务人员来说…

java: 通过xml模板转成word文件

依赖: freemarker <dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.31</version> <!-- 请根据您的需求选择最新版本 --></dependency> 代码展示 import freemarker.t…

关于ElementUI之动态树+数据表格+分页实例

目录 一.ElementUI动态树 二.实例 2.1.数据表 2.2.后端 2.3.前端 三.书籍管理 3.1.数据表 3.2.后端 3.2.前端 好啦今天就分享到这了&#xff0c;希望能帮到你哦&#xff01;&#xff01;&#xff01; 一.ElementUI动态树 ElementUI提供了一个动态树组件&#xff08;Dynami…

Kotlin小节(二)

1、安全索引取值函数&#xff1a;getOrElse和getOrNull getOrElse&#xff1a;如索引值存在&#xff0c;返回索引处数值&#xff1b;索引值不存在&#xff0c;返回lamada值 getOrNull&#xff1a;如索引值存在&#xff0c;返回索引处数值&#xff1b;索引值不存在&#xff0c…

Git与Repo:开源开发的得力工具组合

Git与Repo&#xff1a;开源开发的得力工具组合 1. 引言 开源开发在当今的软件行业中扮演着至关重要的角色。它不仅推动了技术的创新和进步&#xff0c;也促进了开发者之间的合作与共享。随着越来越多的开源项目的涌现&#xff0c;有效的代码管理和版本控制成为了必不可少的工…

【已解决】‘python‘ 不是内部或外部命令,也不是可运行的程序或批处理文件

【已解决】‘python‘ 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件 环境变量配置 已经下载了安装包的情况下&#xff0c;这个问题就是环境变量没有配置的问题&#xff08;共两个&#xff09;。 分别是pythonx.x\Scripts\和pythonx.x\ 自定义安装环境变量…

算法与数据结构-字符串匹配算法

文章目录 主串和模式串BF 算法RK 算法BM算法1. 坏字符规则2. 好后缀规则 主串和模式串 在开始讲解这个算法之前&#xff0c;我先定义两个概念&#xff0c;方便我后面讲解。它们分别是主串和模式串。这俩概念很好理解&#xff0c;我举个例子你就懂了。 比方说&#xff0c;我们…