AES+MD5初探研究

简介: 本文介绍了如何使用Python实现AES加解密(ECB和CBC模式),包括密钥长度、填充方式和编码方式的详细示例。同时,还展示了MD5、SHA-1、SHA-256和SHA-512的哈希算法实现,并通过两个CTF例题讲解了如何绕过MD5和SHA-1的比较条件,获取flag。文章提供了详细的代码示例,适合初学者学习和参考。

image.png

开局一张图:后面的详细过程,还是推荐看遍课程演示,文字不好解释,略过。

用Python实现AES加解密(ECB)

这和之前的DES写法很想,得融汇贯通。

hex编码

from Crypto.Cipher import AES
import binascii
key = b'0123456789123456'#密钥必须是16字节
text = 'www.52ying.top'
#明文数据必须是16字节的倍数,否则就要进行填充
text = text + (16-len(text)%16)*'='
print('填充之后:',text)
aes = AES.new(key,AES.MODE_ECB)
enCryptext = binascii.b2a_hex(aes.encrypt(text.encode()))
print("加密并编码后:",enCryptext)
deCryptext = aes.decrypt(binascii.a2b_hex(enCryptext))
print("解码并解密后:",deCryptext)

base64编码

from Crypto.Cipher import AES
import base64
key = b'0123456789123456'
text = 'www.52ying.top'
text = text+(16-(len(text)%16))*"-"
print('填充后:',text)
aes = AES.new(key,AES.MODE_ECB)
enCryptext = base64.standard_b64encode(aes.encrypt(text.encode()))
print('加密并编码后:',enCryptext)
deCryptext = aes.decrypt(base64.standard_b64decode(enCryptext))
print("解密并解码:",deCryptext)

AES-ECB-196

区别就是密钥长度变成了24字节

from Crypto.Cipher import AES
from Crypto import Random
import base64
key = b'012345678901234567891234'#密钥必须是24字节
text = 'www.52ying.top'
pad = lambda s:s+(16-len(text)%16)*chr((16-len(text)%16))
unpad = lambda s:s[0:-s[-1]]
text = pad(text)#填充处理
print("填充后:",text)
aes = AES.new(key,AES.MODE_ECB)
deCryptext = base64.standard_b64encode(aes.encrypt(text.encode()))
print("加密并编码后:",deCryptext)
enCryptext = aes.decrypt(base64.standard_b64decode(deCryptext))
print("解密后解码:",unpad(enCryptext))

AES算法的数据块大小有128、196和265等,在Python实现的过程中需要注意密钥的大小,对应的密钥大小分别是16, 24 或 32 位长度。

用Python实现AES加解密(CBC)

from Crypto.Cipher import AES
import base64
#填充方式PKCS7Padding
pad = lambda s:s+(16 - len(s) % 16) * chr(16 - len(s) % 16)
unpad = lambda s:s[0:-s[-1]]
# key可以是16, 24 或 32 位长度, 其对应 AES-128, AES-196 和 AES-256
key = b'12345678901234567890123456789012'
iv=b'1234567887654321'
text = 'www.52ying.top'
text = pad(text)
print('填充后:',text)
aes = AES.new(key,AES.MODE_CBC,iv)
enCryptext = base64.standard_b64encode(aes.encrypt(text.encode()))
print("加密并编码:",enCryptext)
aes1 = AES.new(key,AES.MODE_CBC,iv)
deCryptext = aes1.decrypt(base64.standard_b64decode(enCryptext))
print("解密并解码:",unpad(deCryptext))

注意一个小tips,在DES和AES的CBC模式下,不能实例化同一个对象进行加密与解密,必须实例化两个不同的对象,分别进行加密和解密哦。

例题

[ACTF新生赛2020]crypto-aes(考点:AES)_ctf aes-CSDN博客

MD5

import hashlib
def encrypt_md5(str):
    new_md5 = hashlib.md5()
    new_md5.update(str.encode(encoding='utf-8'))
    return new_md5.hexdigest()
if __name__ == "__main__":
    str = encrypt_md5('www.52ying.top')
    print(str)

盐值的处理方式有多种,有些系统或者CMS中在处理用户密码的时候会添加“salt”来增强密码的安全性,下面整理一些加盐的处理方式。

MD5(password+salt)

MD5(salt+password)

MD5(salt+password),N次MD5加密

MD5(MD5(password)+salt)

MD5(salt+password+slat)

MD5(MD5(salt)+password+MD5(salt))

sha-1

image.png

from hashlib import sha1
def encrypt_sha1(str):
    new_sha1 = sha1()
    new_sha1.update(str.encode(encoding='utf-8'))
    return new_sha1.hexdigest()
if __name__ == '__main__':
    print("data: wwww.52ying.top")
    mid_result = encrypt_sha1('www.52yibng.top')
    print('sha1:',mid_result)

image.png

sha-256

SHA256是SHA-2下细分出的一种算法,哈希值长度是256位

from hashlib import sha256
def encrypt_sha256(str):
    new_sha256=sha256()
    new_sha256.update(str.encode(encoding='utf-8'))
    return new_sha256.hexdigest()
if __name__ == '__main__':
    print("data: www.52ying.top")
    sha256_result = encrypt_sha256("www.52ying.top")
    print("sha256: ",sha256_result)

sha-512

SHA256是SHA-2下细分出的一种算法,哈希值长度是512位

from hashlib import sha512

例题,0e绕过MD5()==比较

题目

<?php
include_once "flag.php";
ini_set("display_errors", 0);
$str = strstr($_SERVER['REQUEST_URI'], '?');
$str = substr($str,1);
$str = str_replace('key','',$str);
parse_str($str);#将用户提交的字符串转变成变量
echo md5($key1);
echo '<br>';
echo md5($key2);
echo '<br>';
if(md5($key1) == md5($key2) && $key1 !== $key2)
{
    echo "取得flag:".$flag;
}
?>

这里的代码的大致功能有:

(1)、接收前端的数据并转换为变量,变量中过滤key;

(2)、计算两个变量的MD5值;

(3)、变量的MD5值相等且两个变量不相同的情况下打印flag

如果要获取flag,则需要绕过str_replace以及if中的条件。

(1)key关键词双写,kekeyy1/kekeyy2即可

(2)两个变量的MD5值以0e开头即可

PHP是弱类型语言,“==”在PHP下条件中基本上都是可以绕过的,如1和“1”、1和“1abc”等等,在题目中只要保证MD5的结果是以0e开头即可,在PHP中会被当做科学计数法,0e123==0eabc。在MD5值中以0e开头的数据大致有:s214587387a、QNKCDZO、240610708、s878926199a、s155964671a等,题目测试情况如下;

Payload:http://127.0.0.1:8800/?kekeyy1=s214587387a&kkeyey2=240610708

结果:

0e848240448830537924465865611904

0e462097431906509019562988736854

取得flag:flag{www.ms08067.com}

数组绕过md5()== 比较

题目

<?php
include('flag.php');
$_GET['id']=urldecode($_GET['id']);
if (isset($_GET['uname']) & isset($_POST['passwd'])) {
    echo 123;
    if ($_GET['uname']==$_POST['passwd']) {
        echo 'passwd can not be uname';
    }else if (sha1($_GET['uname'])===sha1($_POST['passwd'])&
$_GET['id']=='cream') {
        die('Flag:'.$flag);
    }else
    {
        echo 'sorry!!!';
    }
}

如果要获取flag,则需要满足一些条件,如:

(1)提交id、uname、passwd三个参数;

(2)uname和passwd不能相等,但是他们的sha1值恒等于

可以使用数组的方式来保证uname和passwd的值一样。所以最后测试的payload是:

http://192.168.1.215:88/sha1/?id=cream&uname[]=abc

post数据:passwd[]=123

相关文章
|
存储 数据采集 NoSQL
收藏!一张图帮你快速建立大数据知识体系
对海量数据进行存储、计算、分析、挖掘处理需要依赖一系列的大数据技术,而大数据技术又涉及了分布式计算、高并发处理、高可用处理、集群、实时性计算等,可以说是汇集了当前 IT 领域热门流行的 IT 技术。本文对大数据技术知识体系进行划分,共分为基础技术、数据采集、数据传输、数据组织集成、数据应用、数据治理,进行相关的阐述说明,并列出目前业界主流的相关框架、系统、数据库、工具等。(文末福利:下载大数据知识体系图)
18709 3
收藏!一张图帮你快速建立大数据知识体系
|
XML 安全 前端开发
一行代码搞定禁用 web 开发者工具
在如今的互联网时代,网页源码的保护显得尤为重要,特别是前端代码,几乎就是明文展示,很容易造成源码泄露,黑客和恶意用户往往会利用浏览器的开发者工具来窃取网站的敏感信息。为了有效防止用户打开浏览器的 Web 开发者工具面板,今天推荐一个不错的 npm 库,可以帮助开发者更好地保护自己的网站源码,本文将介绍该库的功能和使用方法。 功能介绍 npm 库名称:disable-devtool,github 路径:/theajack/disable-devtool。从 f12 按钮,右键单击和浏览器菜单都可以禁用 Web 开发工具。 🚀 一行代码搞定禁用 web 开发者工具 该库有以下特性: • 支持可配
1828 22
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。
|
存储 SQL 关系型数据库
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
MySQL如何进行分库分表、数据迁移?从相关概念、使用场景、拆分方式、分表字段选择、数据一致性校验等角度阐述MySQL数据库的分库分表方案。
2656 15
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
|
存储 人工智能 自然语言处理
新手指南:微软ai助手Copilot国内如何使用?
微软 Copilot 是一款强大的 AI 助手,掌握一些技巧可以让你更好地利用它,提高效率和创造力,让你的工作和生活更加精彩!
17808 11
|
移动开发 自然语言处理 小程序
miniprogram-to-uniapp使用指南(各种小程序项目转换为uni-app项目)
miniprogram-to-uniapp使用指南(各种小程序项目转换为uni-app项目)
2006 1
|
算法 测试技术 持续交付
四种灰度分布方案
【6月更文挑战第10天】产品迭代加速,灰度发布成为降低风险、优化用户体验的关键。它允许新老版本并存,逐步引入流量验证新版本稳定性。
|
数据安全/隐私保护
BUUCTF---misc--snake
BUUCTF---misc--snake
|
Java Maven
运行maven项目出现Error:java: JDK isn‘t specified for module ‘XXX‘
运行maven项目出现Error:java: JDK isn‘t specified for module ‘XXX‘
1482 0