密码学-回顾篇(上)

简介: 密码学-回顾篇

概述  


密码学作为研究编制密码和破译密码的科学技术,由编码学和破译学两门学科构成。

其中,应用于编制密码以保守通信秘密称为编码学,应用于破译密码以获取通信情报称为破译学。

根据明文处理方式的不同分为序列密码与分组密码,根据密钥的使用个数不同分为对称加密算法和非对称加密算法。密码学的应用范围也非常广泛,在渗透测试或CTF比赛中也经常会用到密码学知识,因此,掌握密码学相关知识,学会利用Python工具脚本进行检测尤为重要。


算法  


对称加密算法  


对称加密算法依赖于一个共享的加密密钥,该密钥会被分发给所有参与通信的对象。所有通信对象都使用这个密钥对消息数据进行加密和解密。当使用越长的密钥对消息进行加密时,密文数据越难被破解。对称加密算法主要应用于批量加密的数据,并且只为安全服务提供机密性。

对称加密算法的特点是文件加密和解密使用相同的密钥,即发送方和接收方需要持有同一把密钥。相对于非对称加密算法,对称加密算法具有更高的加解密速度,但双方都需要事先知道密钥,密钥在传输过程中可能会被窃取,因此安全性没有非对称加密算法强。常见的对称加密算法包括DES、AES等。

         

因为对称加密算法具有发送方和接收方使用同一把密钥的特点,所以存在如下优缺点:

对称加密算法的主要优势在于能够以极快的速度进行操作,通常是非对称加密算法的1000~10000倍。

对称加密算法未实现不可否认性。由于任意通信方都可以利用共享的密钥对消息进行加密和解密,因此无法分辨指定消息的来源。

对称加密算法具有不可扩展性。对于大的用户组来说,使用对称密钥的密码进行通信非常困难。只有在每个可能的用户组合共享私有密钥时,组中个人之间的安全专有通信才能实现。

密钥需要经常更新。每当有成员离开用户组时,所有涉及这个成员的密钥都必须被抛弃。


非对称加密算法  


非对称密钥算法(也称为公钥算法)针对对称加密算法的弱点提供了另外一种解决方案。

在系统中,每个用户都有两个密钥:

一个是在所有用户之间共享的公钥,另一个是只有用户自己知道并秘密保管的私钥。

如果使用公钥加密消息,那么只有相关的私钥能够进行解密,反之,如果使用私钥加密消息,则只有用相关的公钥能够解密,即数字签名技术。

 

文件加密需要公钥(publickey)和私钥(privatekey)。接收方在发送消息前,需要事先生成公钥和私钥,然后将公钥发送给发送方。发送方收到公钥后,将待发送数据用公钥加密,发送给接收方。接收方收到数据后,用私钥解密获得明文信息。在整个过程中,公钥负责加密,私钥负责解密,这样数据在传输过程中即使被截获,攻击者没有私钥也无法破解。非对称加密算法的加解密速度低于对称加密算法,但是安全性更高。通常非对称加密算法包括RSA、ECC等。

非对称加密算法除了能够确保消息的保密性,还可以实现对数字签名。如果小明希望使其他用户确信带有其签名的消息是由小明本人发送的,那么首先要使用散列算法创建一个消息摘要。小明随后使用其私钥对消息摘要进行加密。所有希望验证这个签名的用户只需要利用小明的公钥对消息摘要进行解密,然后验证解密的消息摘要是正确的,即可确定。

非对称加密算法的主要优点如下:

§有较好的扩展性,增加新用户只需要生成一对“公钥-私钥”。新用户与非对称密码系统中的所有用户通信时都使用这对相同的密钥。

§容易删除用户。非对称算法提供了一种密钥撤销机制,这个机制准许密钥被取消,从而能够有效地从非对称系统中删除用户。

§只有在用户的私钥被破坏时,才需要进行密钥重建。如果某位用户离开了公司,那么系统管理员只需要简单地将该用户的密钥作废即可。其他密钥都不会被破坏,因此其他用户都不需要进行密钥重建。

§非对称加密算法提供了完整性、身份认证和不可否认性。如果某位用户没有与其他个体共享其私钥,那么具有该用户签名的消息就是正确无误的,并且具有特定的来源,在以后的任何时刻都不能被否认。


分组密码工作模式  


密码学中,分组密码工作模式可以提供诸如机密性或真实性的信息服务。基于分组的对称加密算法(DES、AES等)只是描述如何根据加密密钥对一段固定长度(块)的数据进行加密,对于比较长的数据,分组密码工作模式描述了如何重复应用某种算法加密分组操作来安全地转换大于固定长度的数据量。常见的分组密码工作模式有ECB、CBC、CFB、OFB、CTR 5种,下面将对这5种工作模式的分组密码进行分析。

ECB  

ECB(Electronic Codebook,电子密码本)模式是最简单的加密模式,明文消息被分成固定大小的块(分组),并且每个块被单独加密。每个块的加密和解密都是独立的,且使用相同的方法进行加密,所以可以进行并行计算,但是一旦有一个块被破解,使用相同的方法就可以解密所有的数据,安全性比较差。ECB模式适用于数据较少的情形,加密前需要把明文数据填充到块大小的整倍数。

 

CBC  

CBC(Cipher Block Chaining,密码块链)模式中每一个分组要先和前一个分组加密后的数据进行XOR(异或)操作,然后再进行加密。这样每个密文块依赖该块之前的所有明文块,为了保持每条消息都具有唯一性,第一个数据块进行加密之前需要用初始化向量IV进行异或操作。CBC模式是一种最常用的加密模式,主要缺点为加密是连续的,不能并行处理,并且与ECB一样,消息块必须填充到块大小的整倍数.

CFB  

CFB(Cipher Feedback,密码反馈)模式和CBC模式比较相似,前一个分组的密文加密后和当前分组的明文进行XOR(异或)操作,生成当前分组的密文。CFB模式的解密和CFB加密在流程上也是非常相似的。

 

OFB  

OFB(Output Feedback,输出反馈)模式将分组密码转换为同步流密码,也就是说可以根据明文长度先独立生成相应长度的流密码。在加密流程中可以看出,OFB和CFB非常相似,CFB是前一个分组的密文加密后与当前分组明文进行XOR操作,OFB是将前一个分组异或之前的流密码与当前分组明文进行XOR处理。由于异或操作的对称性,OFB模式的解密与加密的流程完全相同。

CTR  

CTR(Counter,计数器)模式与OFB模式相同,计数器模式将分组密码转换为流密码。加密“计数器”的连续值用来产生下一个密钥流块。

 


PyCryptodome库

 

PyCryptodome是Python中一种强大的加密算法库,可以实现常见的单向加密、对称加密、非对称加密和流加密算法。目前该库函数支持Python 2和Python 3两种不同版本。其安装方式也极其简单,可根据当前Python环境以pip方式进行安装。

安装PyCryptodome库函数时可以通过pip指令直接进行安装:

sudo pip3 install -i https://pypi.douban.com/simple pycryptodome            

pip3 install -i htttps://pypi.douban.com/simple pycryptodomex        

 

Base64编/解码  


Base64是一种由任意二进制到文本字符串的编码方法,常用于在URL、Cookie、网页中传输少量二进制数据。在CTF比赛和渗透测试中,通常会遇到Base64编码的数据,例如Base64编码的图片、请求的数据包被Base64编码等,这时都可以利用Base64的可逆性进行解码。

当通过记事本打开jpg、pdf等格式的文件时,会看到一堆乱码,这是因为二进制文件包含很多无法显示和打印的字符。所以,如果想让像记事本这样的文本处理软件能处理二进制数据,就需要将二进制数据转换为特定字符串,此时就要用到Base64。除此之外,Base64编码也有很多其他用途,例如,垃圾信息传播者采用Base64编码的方式规避反垃圾邮件工具。当需要将二进制数据编码为适合放在URL(包括隐藏表单域)中的形式时,也可以采用Base64的编码方式。该编码不仅简短,同时也具有不可读性,能对敏感数据起到较好的保护作用。

Base64编码原理  

Base64编码原理非常简单,首先确定好要编码的字符串,并查找其对应的ASCII码将其转换为二进制表示,每三个8位的字节转换为四个6位的字节(3×8=4×6=24),把6位的最高位添两位数字0,组成四个8位的字节,因此转换后的字符串将要比编码前的字符串长1/3。转换后,再将二进制转换为十进制表示,对应Base64编码的索引表查阅出该十进制对应的字母,由此最终获得Base64编码。


用Python实现Base64编/解码  

import base64            
s='ms08067'            
bsse = base64.b64encode(s.ensode("utf-8"))            
print(base)            
import base64            
base = 'qwerqwe=='            
bbs=str(base64.b64decode(base),"utf-8")            
print(bbs)


DES加密算法  


简介  

ES(Data Encryption Standard)是迄今为止世界上最为广泛使用和流行的一种分组密码算法。在1937年,美国国家标准局(NBS)公开征集一个密码算法作为国家标准数据加密算法,IBM公司在1974年提交了LUCIFER算法,后来IDM公司对该算法进行改进,经过美国国家标准局审查后也就成为了后来的DES算法。DES作为一种分组加密算法,是一个16轮的Feistel型结构密码,它的分组长度为64比特,用一个56比特的密钥来加密一个64比特的明文串,输出一个64比特的密文串。其中,使用密钥为64比特,密钥位数是56比特,另8位用作奇偶校验,加密用的位数是48比特。加密的过程是先对64位明文分组进行初始置换,然后分左、右两部分分别经过16轮迭代,然后再进行循环移位与变换,最后进行逆变换得出密文。加密与解密使用相同的密钥,因而它属于对称密码体制

原理  

DES加密算法综合运用了置换、代替、代数等多种密码技术,具有设计精巧、实现容易、使用方便等特点。DES加密算法的明文、密文和密钥的分组长度都是64位。

DES加密过程如下所示:

1)64位密钥经子密钥产生算法产生16个48位子密钥。

2)64位明文首先经过初始置换IP(Initial Pennutation),将数据打乱重新排列,并分成左右两边,各32位序列。

3)加密函数f实现子密钥K1对K0的加密,结果为32位的数据组f(R0,K1)。f(R0,K1)再与L0的模2相加,又得到一个32位的数组L0⊕f(R0,K1),以L0⊕f(R0,K1)作为第二次加密迭代的R1,以R0作为第二次加密迭代的Ll,第二次加密迭代至第十六次加密迭代分别用子密钥K2,…,K16进行,其过程与第一次加密迭代相同。

4)第16次加密迭代结束后,产生一个64位的数据组。以其左边32位作为R16,右边32位作为L16,两者合并后经过逆初始置换IP-1将数据重新排列,便得到64位密文。至此,加密结束。

相关文章
|
8月前
|
数据采集 人工智能 自然语言处理
AI终于能听懂宝宝说话了!ChildMandarin:智源研究院开源的低幼儿童中文语音数据集,覆盖22省方言
ChildMandarin是由智源研究院与南开大学联合推出的开源语音数据集,包含41.25小时3-5岁儿童普通话语音数据,覆盖中国22个省级行政区,为儿童语音识别和语言发展研究提供高质量数据支持。
954 20
AI终于能听懂宝宝说话了!ChildMandarin:智源研究院开源的低幼儿童中文语音数据集,覆盖22省方言
|
4月前
|
前端开发 搜索推荐 开发者
深入理解 HTML 中的<h1>标签:语义、用法与最佳实践
本文深入解析HTML中<h1>标签的核心特性、使用规范及常见误区,探讨其在SEO优化、页面结构与可访问性中的重要作用,帮助开发者构建语义清晰、结构合理的网页文档。
474 1
|
10月前
|
机器学习/深度学习 人工智能 搜索推荐
《探秘AI驱动的个性化推荐系统:精准触达用户的科技密码》
在这个信息爆炸的时代,AI驱动的个性化推荐系统应运而生,通过数据收集与处理、构建用户画像、核心算法(协同过滤与基于内容的推荐)及深度学习技术,精准洞察用户需求。它广泛应用于电商、视频平台等领域,提升用户体验和商业效益。尽管面临数据稀疏性、隐私保护等挑战,未来将更加精准、实时并注重用户隐私。
845 1
《探秘AI驱动的个性化推荐系统:精准触达用户的科技密码》
|
11月前
|
数据库 Docker 容器
docker容器为啥会开机自启动
通过配置适当的重启策略,Docker容器可以在主机系统重启后自动启动。这对于保持关键服务的高可用性和自动恢复能力非常有用。选择适合的重启策略(如 `always`或 `unless-stopped`),可以确保应用程序在各种情况下保持运行。理解并配置这些策略是确保Docker容器化应用可靠性的关键。
480 17
|
存储 监控 容灾
微信技术总监谈架构:微信之道——大道至简(演讲全文)
在技术架构上,微信是如何做到的?日前,在腾讯大讲堂在中山大学校园宣讲活动上,腾讯广研助理总经理、微信技术总监周颢在两小时的演讲中揭开了微信背后的秘密。 周颢把微信的成功归结于腾讯式的“三位一体”策略:即产品精准、项目敏捷、技术支撑。微信的成功是在三个方面的结合比较好,能够超出绝大多数同行或对手,使得微信走到比较前的位置。所谓产品精准,通俗的讲就是在恰当的时机做了恰当的事,推出了重量级功能,在合适的时间以最符合大家需求的方式推出去。他认为在整个微信的成功中,产品精准占了很大一部分权重。
470 1
微信技术总监谈架构:微信之道——大道至简(演讲全文)
|
消息中间件 Kubernetes API
在K8S中,如何收集k8s集群日志?
在K8S中,如何收集k8s集群日志?
|
存储 Linux iOS开发
【Picgo指南】图床神器之Picgo工具的安装与快速上手详细教程
【Picgo指南】图床神器之Picgo工具的安装与快速上手详细教程
2673 6
|
存储
逻辑地址和物理地址转换
逻辑地址和物理地址转换
1258 0
|
Kubernetes 算法 调度
在K8S中,如何把Pod调度到某个节点,有哪些方法?
在K8S中,如何把Pod调度到某个节点,有哪些方法?
|
前端开发 JavaScript .NET
【转】BarTender与ASP.NET的集成小结(条码标签打印编程)
话说自从上次发了篇NHibernate的资料后,好久没有写东西了,半年来一直在忙一个项目,做完项目后,发现很多东西虽然当时做了,懂了,但是很快就会模糊了,于是又再想起总结的重要性~~没啥地方好放资料的,放在博客园也是一个不错的选择~~   本人也是新手,写的不好的地方,请多原谅。
2820 0