【信息安全】seed-labs实验-Secret-Key Encryption Lab

news2025/1/14 1:24:50

目录

  • Task 1: Frequency Analysis
  • Task 2: Encryption using Different Ciphers and Modes
  • Task 4: Padding
  • Task 5: Error Propagation – Corrupted Cipher Text
  • Task 6: Initial Vector (IV) and Common Mistakes
    • Task 6.1. IV Experiment
    • Task 6.2. Common Mistake: Use the Same IV
    • Task 6.3. Common Mistake: Use a Predictable IV
  • Task 7: Programming using the Crypto Library

Task 1: Frequency Analysis

大致原理:单表替换密码(将明文中的字母按照对照表映射成密文),会将明文中的统计规律带到密文中,如明文中出现最多的是A,则密文中出现最多的就是A在对照表下的密文。因此我们可以通过频率分析的方法找到对照表,破解密文。
代码思想:读入密文ciphertext.txt(只有小写的字母+空格+回车的密文),然后统计其中各个字母出现的次数并对统计结果进行排序。然后我们还有一个已知的排序结果words_frequency(这个是百度搜到的公开单字母频率),这两个排序结果的对应关系我们就认为是对照表了,接着使用这个对照表翻译密文得到明文out.txt

vim task1.py
sudo python3 task1.py

def get_frequency(path):
    res = {}
    for i in range(ord('a'),ord('z')+1):
        res[chr(i)]=0
    with open(path) as f:
        for line in f.readlines():
            for ch in line.strip():
                if ch.isalpha():
                    res[ch.lower()] +=1
    
    return sorted(res.items(),key=lambda s:s[1],reverse=True)

def main():
    ciphertext_frequency= get_frequency('./ciphertext.txt')
    words_frequency= "ETAOINRSHDCLMPUFGWYBKJVXQZ";
    trans = {}
    for i in range(26):
        trans[ciphertext_frequency[i][0]] = words_frequency[i].lower()
    with open('./out.txt',mode='a') as f1:
        with open('./ciphertext.txt') as f2:
            for line in f2.readlines():
                for ch in line.strip():
                    if ch.isalpha():
                        f1.write(trans[ch.lower()])
                    else:
                        f1.write(ch)


if __name__ == '__main__':
    main()

Task 2: Encryption using Different Ciphers and Modes

用AES加密算法(128位密钥,CBC模式)加密一个文件并进行解密。

openssl enc -aes-128-cbc -e -in ./plaintext.txt -out cipher.bin -K 00112233445566778889aabbccddeeff -iv 0102030405060708

openssl enc -aes-128-cbc -d -in cipher.bin -out out.txt -K 00112233445566778889aabbccddeeff -iv 0102030405060708

用AES加密算法(128位密钥),分别采用ECB和CBC模式加密一个bmp图片,查看加密后的图片。

openssl enc -aes-128-ecb -in ./pic_original.bmp -out ./pic_ecb.bmp -e -K 00112233445566778889aabbccddeeff 

openssl enc -aes-128-cbc -in ./pic_original.bmp -out ./pic_cbc.bmp -e -K 00112233445566778889aabbccddeeff -iv 0102030405060708

在这里插入图片描述

Task 4: Padding

分别创建大小为5,10,15字节的文件

echo -n "01234" > 5.txt
echo -n "0123456789" > 10.txt
echo -n "012345678999999" > 15.txt

在这里插入图片描述

先用AES加密算法(128位密钥,CBC模式)加密这些文件,然后解密这些密文(选择解密时不去除padding的选项),观察解密后各个文件的尺寸大小

注:我们在解密的时候添加了参数-nopad,表示不去除padding

openssl enc -aes-128-cbc -e -in ./5.txt -out ./cbc/5-cbc.txt -K 00112233445566778889aabbccddeeff -iv 0102030405060708
openssl enc -aes-128-cbc -e -in ./10.txt -out ./cbc/10-cbc.txt -K 00112233445566778889aabbccddeeff -iv 0102030405060708
openssl enc -aes-128-cbc -e -in ./15.txt -out ./cbc/15-cbc.txt -K 00112233445566778889aabbccddeeff -iv 0102030405060708

openssl enc -aes-128-cbc -d -in ./cbc/5-cbc.txt -out ./cbc/5-cbc-out.txt -K 00112233445566778889aabbccddeeff -iv 0102030405060708 -nopad
openssl enc -aes-128-cbc -d -in ./cbc/10-cbc.txt -out ./cbc/10-cbc-out.txt -K 00112233445566778889aabbccddeeff -iv 0102030405060708 -nopad
openssl enc -aes-128-cbc -d -in ./cbc/15-cbc.txt -out ./cbc/15-cbc-out.txt -K 00112233445566778889aabbccddeeff -iv 0102030405060708 -nopad

在这里插入图片描述

用xxd命令查看各个解密文件中padding的内容

xxd 5-cbc-out.txt
xxd 10-cbc-out.txt
xxd 15-cbc-out.txt

在这里插入图片描述

用AES加密算法(128位密钥,ECB模式,CFB模式,OFB模式)进行类似上述(2)和(3)的操作,查看各个解密文件中padding的内容。

注:观察发现,ECB、CBC出现填充,而CFB、OFB没有填充。因为CFB、OFB可以将DES转换为流密码。

ecb
openssl enc -aes-128-ecb -e -in ./5.txt -out ./ecb/5-ecb.txt -K 00112233445566778889aabbccddeeff 
openssl enc -aes-128-ecb -e -in ./10.txt -out ./ecb/10-ecb.txt -K 00112233445566778889aabbccddeeff
openssl enc -aes-128-ecb -e -in ./15.txt -out ./ecb/15-ecb.txt -K 00112233445566778889aabbccddeeff 

openssl enc -aes-128-ecb -d -in ./ecb/5-ecb.txt -out ./ecb/5-ecb-out.txt -K 00112233445566778889aabbccddeeff -nopad
openssl enc -aes-128-ecb -d -in ./ecb/10-ecb.txt -out ./ecb/10-ecb-out.txt -K 00112233445566778889aabbccddeeff -nopad
openssl enc -aes-128-ecb -d -in ./ecb/15-ecb.txt -out ./ecb/15-ecb-out.txt -K 00112233445566778889aabbccddeeff -nopad

xxd 5-ecb-out.txt
xxd 10-ecb-out.txt
xxd 15-ecb-out.txt

在这里插入图片描述
注:xxd的第三列表示的是这一行原本的内容,发现多了一些...
在这里插入图片描述


cfb
openssl enc -aes-128-cfb -e -in ./5.txt -out ./cfb/5-cfb.txt -K 00112233445566778889aabbccddeeff -iv 0102030405060708
openssl enc -aes-128-cfb -e -in ./10.txt -out ./cfb/10-cfb.txt -K 00112233445566778889aabbccddeeff -iv 0102030405060708
openssl enc -aes-128-cfb -e -in ./15.txt -out ./cfb/15-cfb.txt -K 00112233445566778889aabbccddeeff -iv 0102030405060708

openssl enc -aes-128-cfb -d -in ./cfb/5-cfb.txt -out ./cfb/5-cfb-out.txt -K 00112233445566778889aabbccddeeff -iv 0102030405060708 -nopad
openssl enc -aes-128-cfb -d -in ./cfb/10-cfb.txt -out ./cfb/10-cfb-out.txt -K 00112233445566778889aabbccddeeff -iv 0102030405060708 -nopad
openssl enc -aes-128-cfb -d -in ./cfb/15-cfb.txt -out ./cfb/15-cfb-out.txt -K 00112233445566778889aabbccddeeff -iv 0102030405060708 -nopad

xxd 5-cfb-out.txt
xxd 10-cfb-out.txt
xxd 15-cfb-out.txt

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

ofb
openssl enc -aes-128-ofb -e -in ./5.txt -out ./ofb/5-ofb.txt -K 00112233445566778889aabbccddeeff -iv 0102030405060708
openssl enc -aes-128-ofb -e -in ./10.txt -out ./ofb/10-ofb.txt -K 00112233445566778889aabbccddeeff -iv 0102030405060708
openssl enc -aes-128-ofb -e -in ./15.txt -out ./ofb/15-ofb.txt -K 00112233445566778889aabbccddeeff -iv 0102030405060708

openssl enc -aes-128-ofb -d -in ./ofb/5-ofb.txt -out ./ofb/5-ofb-out.txt -K 00112233445566778889aabbccddeeff -iv 0102030405060708 -nopad
openssl enc -aes-128-ofb -d -in ./ofb/10-ofb.txt -out ./ofb/10-ofb-out.txt -K 00112233445566778889aabbccddeeff -iv 0102030405060708 -nopad
openssl enc -aes-128-ofb -d -in ./ofb/15-ofb.txt -out ./ofb/15-ofb-out.txt -K 00112233445566778889aabbccddeeff -iv 0102030405060708 -nopad
 
xxd 5-ofb-out.txt
xxd 10-ofb-out.txt
xxd 15-ofb-out.txt

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

Task 5: Error Propagation – Corrupted Cipher Text

创建一个至少1000字节大的文本文件

#!/bin/bash

f=""
for (( i = 1; i < 1024; ++i)); do f=$f"6"; done
echo $f >> f.txt

用AES加密算法(128位密钥,ECB模式)加密这个文件

openssl enc -aes-128-ecb -e -in ./f.txt -out ./ecb/f-ecb.txt -K 00112233445566778889aabbccddeeff 

用bless工具修改密文中第55个字节中的1个bit

bless ./ecb/f-ecb.txt

注:bless工具貌似是不支持直接修改的,只能删除、复制和黏贴。比如我想将DF修改成EF,做法就是选中EF(是鼠标拖动,让ED块变红),然后右键复制,选中DF右键删除,然后再右键黏贴。
在这里插入图片描述
在这里插入图片描述

解密被上述修改后的密文,查看解密后的明文有什么变化

openssl enc -aes-128-ecb -d -in ./ecb、f-ecb.txt -out ./ecb/f-ecb-out.txt -K 00112233445566778889aabbccddeeff 
vim ./ecb/f-ecb-out.txt

在这里插入图片描述

用AES加密算法(128位密钥,CBC模式,OFB模式)进行类似上述(2)-(4)的操作,查看对应解密后的明文有什么变化
注:不同的模式下,密文改变带来的影响不同,具体怎么个不同法和采用的模式有关。

cbc模式
openssl enc -aes-128-cbc -e -in ./f.txt -out ./cbc/f-cbc.txt -K 00112233445566778889aabbccddeeff -iv 0102030405060708
bless ./cbc/f-cbc.txt
openssl enc -aes-128-cbc -d -in ./cbc/f-cbc.txt -out ./cbc/f-cbc-out.txt -K 00112233445566778889aabbccddeeff -iv 0102030405060708
vim ./cbc/f-cbc-out.txt

ofb模式
openssl enc -aes-128-ofb -e -in ./f.txt -out ./ofb/f-ofb.txt -K 00112233445566778889aabbccddeeff -iv 0102030405060708
bless ./ofb/f-ofb.txt
openssl enc -aes-128-ofb -d -in ./ofb/f-ofb.txt -out ./ofb/f-ofb-out.txt -K 00112233445566778889aabbccddeeff -iv 0102030405060708
vim ./ofb/f-ofb-out.txt

Task 6: Initial Vector (IV) and Common Mistakes

Task 6.1. IV Experiment

用AES加密算法(128位密钥,CBC模式),采用相同的密钥和不同的初始化向量加密一个相同的文件,观察加密结果是否相同

echo -n "01234" > f.txt
openssl enc -aes-128-cbc -e -in ./f.txt -out ./f-cbc-iv1.txt -K 123456 -iv 111111
openssl enc -aes-128-cbc -e -in ./f.txt -out ./f-cbc-iv2.txt -K 123456 -iv 222222
cat f-cbc-iv1.txt
cat f-cbc-iv2.txt

在这里插入图片描述

用AES加密算法(128位密钥,CBC模式),采用相同的密钥和相同的初始化向量加密一个相同的文件,观察加密结果是否相同

openssl enc -aes-128-cbc -e -in ./f.txt -out ./f-cbc-iv1-same.txt -K 123456 -iv 111111
cat f-cbc-iv1.txt
cat f-cbc-iv1-same.txt

在这里插入图片描述

思考为什么IV必须唯一
从实验结果可以发现,在key相同的情况,相同的IV会导致加密结果相同,所以为了信息安全IV必须唯一。

Task 6.2. Common Mistake: Use the Same IV

已知明文攻击:假设采用OFB模式进行加密,加密时所采用的IV是相同的,请破译P2的内容。
在这里插入图片描述
在这里插入图片描述

Task 6.3. Common Mistake: Use a Predictable IV

Task 7: Programming using the Crypto Library

大致思想:这个任务说的是,已知key是由words.txt文件中的某一行填充而成,给你明文、密文、iv以及words.txt,能不能找到key
代码思路:核心思想就是把words.txt中的每一个单词当成key,结合已知的iv构造aes,然后使用这个aes去解码密文,如果得到的明文和已知明文相同,那就找到了key。
碰到的问题:python中的Crypto包,把iv定死了成16bite,而任务给的是32bite的iv,没有办法,就自己重新生成了密文,希望老师不介意。(并且自己来做的话,填充函数这边就可以自己发挥了)

import base64
from Crypto.Cipher import AES

class EncryptDate:
    def __init__(self, key, iv):
        self.length = 16  
        self.key = self.pad(key).encode("utf-8")                          
        self.iv = iv.encode("utf-8")                            
                                              
        self.aes = AES.new(self.key, AES.MODE_CBC, self.iv)     
        self.unpad = lambda s: s[0:-s[-1]]

    def pad(self, text): # 填充函数
        count = len(text.encode('utf-8'))
        add = self.length - (count % self.length)
        entext = text + (chr(add) * add)
        return entext

    def encrypt(self, encrData):  # 加密函数
        a = self.pad(encrData)
        res = self.aes.encrypt(a.encode("utf-8"))
        msg = str(base64.b64encode(res), encoding="utf8")
        return msg

    def decrypt(self, decrData):  # 解密函数
        res = base64.decodebytes(decrData.encode("utf-8"))
        msg_text = self.aes.decrypt(res)
        decrypt_text = self.unpad(msg_text).decode('utf8')
        return decrypt_text

def main():
    # 使用Syracuse作为key,9999999999999999作为iv对明文进行加密
    aes_key = "Syracuse"
    aes_iv = "9999999999999999"
    text_data = 'This is a top secret.'
    encrypt_data = EncryptDate(aes_key, aes_iv).encrypt(text_data)

    # 在words.txt中找到key
    # 寻找的方式就是使用该单词作为key,配合已知的iv进行解密,若得到的明文和已知的明文相同,则找到了key
    with open("words.txt") as f:
        for line in f.readlines():
            word = line.strip()
            try:
                decrypt_data = EncryptDate(word, aes_iv).decrypt(encrypt_data)
            except Exception as e:
                continue
            if(decrypt_data == text_data):
                print("原来key是:"+word)
                break;
if __name__ == '__main__':
    main()


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

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

相关文章

python源代码打包成为exe文件

目录标题前言下载安装模块&#xff08;pyinstaller&#xff09;执行打包命令1、在cmd中进入项目文件2、执行pyinstaller命令成exe文件3、找到exe文件报错以及解决报错X1解决方法&#xff1a;报错X2解决方法&#xff1a;写在最后前言 大家都知道我们在pycharm中编写的源代码&am…

如何在 15 分钟内度量 DORA 指标?

在这篇文章中&#xff0c;我们将介绍 DevOps 四个关键指标——DORA 指标是什么&#xff0c;其度量难点&#xff0c;以及如何基于开源工具快速实现 DORA 指标的持续追踪。如果你熟悉 DORA 指标&#xff0c;可以直接跳到本文第二部分。 什么是 DORA 指标&#xff1f; DORA 的全…

设备树的使用

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、设备树的概念&#xff1f;二、设备树的作用三、如何使用设备树1.设备树的位置2.设备树的语法认识DTC、DTS、DTSI、DTB设备节点信息3.添加自己的设备树节点4.…

STM32MP157驱动开发——SPI驱动

STM32MP157驱动开发——SPI驱动一、简介1.SPI介绍2.STM32MP1 SPI介绍3. ICM-20608 简介4.Linux下的SPI框架二、驱动开发1&#xff09;IO 的 pinctrl 子节点创建与修改2&#xff09;SPI 设备节点的创建与修改3&#xff09;ICM20608驱动4&#xff09;测试App5&#xff09;运行测试…

【分享】订阅用友U8集简云连接器同步费用审批数据至用友U8系统

方案简介 集简云通过与钉钉连接平台深度融合&#xff0c;实现OA审批通过后&#xff0c;将采购、报销、收款、售后等费用审批单数据自动同步至用友U8系统&#xff0c;大大提高了企业日常采购、报销、付款等的工作效率&#xff0c;实现企业业务流程的自动化&#xff0c;为企业降…

Docker的数据管理

目录 一、数据卷 二、数据卷容器 三、容器互联 容器中管理数据主要有两种方式&#xff1a; 数据卷&#xff08;Data Volumes&#xff09;数据卷容器&#xff08;Data Volume Dontainers&#xff09; 一、数据卷 数据卷是一个供容器使用的特殊目录&#xff0c;位于容器中。可…

5点电容式触摸屏控制芯片GT811介绍

5点电容式触摸屏控制芯片GT811简介 5点电容式触摸屏控制芯片GT811&#xff0c;采用投射式电容检测原理&#xff0c;由16个驱动通道与10个感应通道组成触摸检测网络&#xff0c;通过内置模拟放大电路、数字运算模块&#xff0c;及高性能MPU得到实时准确的触摸信息&#xff0c;并…

rocketmq安装

链接&#xff1a;https://pan.baidu.com/s/14ziQH62MeYmM8N6JsH5RcA 提取码&#xff1a;yyds 下载rocketmq-all-4.9.3-bin-release.zip 下载、修改配置 mkdir -p /app/rocketmq cd /app/rocketmqunzip rocketmq-all-4.9.3-bin-release.zip cd rocketmq-4.9.3/修改 配置文件&…

F28335第十六篇——Flash操作

文章目录前言配置方法擦除函数编写和校验函数前言 本文主要介绍如何对DSP28335进行Flash操作。 本文主要参考资料&#xff1a; TI.Flash2833x_API_Readme DSP的Flash操作需要借助官方提供API。官方提供的API主要完成Flash的擦除&#xff0c;编写&#xff0c;校验三种功能。…

八、Java 15 新特性

八、Java 15 新特性 JDK 15 在 2020 年 9 月 15 号正式发布了&#xff01;根据发布的规划&#xff0c;这次发布的 JDK 15 将是一个短期的过度版&#xff0c;只会被 Oracle 支持&#xff08;维护&#xff09;6 个月&#xff0c;直到明年 3 月的 JDK 16 发布此版本将停止维护。而…

VUE3-生命周期钩子《六》

目录 1.onMounted() 2.onUpdated() 生命周期的作用&#xff0c;页面加载的时候&#xff0c;主动执行某些程序。生命周期钩子有很多种&#xff0c;每一种都是有顺序的&#xff0c;如果不按照顺序执行的话&#xff0c;那么就不会触发某种效果&#xff0c;所以先要了解生命周期钩…

Java Web高级面试题(一)

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;Java面试题…

常用的工具网站(网址 + 效果图)

一&#xff0c;阿里图标库 https://www.iconfont.cn/?spma313x.7781069.1998910419.d4d0a486a 二&#xff0c;AI人工智能图片放大 https://bigjpg.com/zh 三&#xff0c;一个有情怀的免费PPT模板下载网站&#xff01; https://www.ypppt.com/ 四&#xff0c;照片抠图…

AOP技术

目录 一、简介 1.1、OCP原则 1.2、AOP介绍及使用场景 二、AOP在项目中的使用 2.1、集成使用 2.2、定义全局异常通知 2.3、AOP注解的含义 2.4、多个切面的执行顺序 三、通知的执行顺序&#xff08;基于spring-aop5版本&#xff09; 四、常用的四种切入点表达式 4.1、…

【技术分享】手机端代理网络共享至win电脑端

【技术分享】手机端代理网络共享至win电脑端使用前提工具准备具体步骤1. 打开并实现安卓模拟器内的vP|n2. 打开并配置安卓模拟器内的Proxy Server3. 配置win的代理4. 完成使用前提 手机端具备代理功能&#xff0c;而电脑端不具备&#xff1b;希望电脑端使用手机端的代理功能上…

嵌入式技术之IAP,自从有了它老板再也不担心我的代码了!(中)

上篇文章我们一起学习了IAP的工作原理和IAP包含的3个重要功能&#xff1a;数据交互、数据存储和程序跳转。 这3个重要功能称为“IAP的三板斧”&#xff0c;接下来我们看这三板斧具体完成哪些细节工作&#xff0c;如何实现这三板斧。 1.数据交互 数据交互的功能是IAP核心功能…

Gson解析JSON

1.介绍 Gson是Google提供的处理JSON数据的Java类库&#xff0c;主要用于转换Java对象和JSON对象。 2.依赖 <!-- https://mvnrepository.com/artifact/com.google.code.gson/gson --> <dependency><groupId>com.google.code.gson</groupId><artifac…

python协程--yield和yield from

字典为动词“to yield”给出了两个释义&#xff1a;产出和让步。对于 Python 生成器中的 yield 来说&#xff0c;这两个含义都成立。yield item 这行代码会产出一个值&#xff0c;提供给 next(...) 的调用方&#xff1b;此外&#xff0c;还会作出让步&#xff0c;暂停执行生成器…

Web应用怎样获取Access Token?

1.在联盟创建服务器应用 参考文档&#xff1a;开发准备 2.获取用户级Access Token 2.1 获取code 参考文档&#xff1a;接入华为帐号获取凭证 2.1.1 先按照跳转链接进行配置url https://oauth-login.cloud.huawei.com/oauth2/v3/authorize? response_typecode& acces…

docker(七)容器监控(CAdvisor+InfluxDB+Granfana)

docker可能会运行多个容器&#xff0c;一个宿主机上有多个容器时&#xff0c;需要监控容器的&#xff1a;CPU使用率&#xff0c;内存使用率&#xff0c;网络状态&#xff0c;磁盘空间等数据。 一、docker stats docker stats命令可以监控以下数据&#xff1a; 数据是实时的&…