Crypto基础之密码学

FLAG:20岁的年纪不该困在爱与不爱里,对吗
专研方向: 密码学,Crypto
每日emo:今年你失去了什么?


Crypto基础之密码学

  • 前言
  • 一、编码
    • Base编码
      • base64:
      • Base32 和 Base16:
      • uuencode:
      • xxencode:
      • URL编码
  • 二、古典编码
    • 移位密码
      • 简单移位密码
      • 云影密码
      • 栅栏密码
      • 曲路密码
    • 替代密码
      • 恺撒密码
      • 培根密码:
      • 仿射密码
  • 现代密码
    • 分组密码和序列密码:
    • 公钥密码


前言

浅谈密码学:

密码学可以分为古典密码学和现代密码学,两者有什么区别呢
密码学研究:怎么让密码这个数据不泄露,不被破译。

古典密码学:我们想要发送的信息,不想要第三方知道,对这个信息进行加密。

现代密码学:除了研究密码信息的保密问题,还要考虑其他很多方面的安全隐患,比如窃听、篡改、伪装、否认。


一、编码

编码是信息表达另一种表达方式,掌握各类编码转化技巧是密码学的基础。
编码 (encode)和解码 (decode)是个相当广泛的话题,涉及计算机对信息处理的根本方式。最常用的编码是ASCII(美国信息交换标准代码),包含国际通用的大小写字母、数字、常见符号等,是互联网的通用语言。


Base编码

base64:

base64 是一种基于 64 个可打印字符来表示二进制数据的表示方法。由于 2⁶ = 64 ,所以每 6 个比特为一个单元,对应某个可打印字符。3 个字节有 24 个比特,对应于 4 个 base64 单元,即 3 个字节可由 4 个可打印字符来表示。相应的转换过程如下图所示:
在这里插入图片描述
在 base64 转换的时候,3 字节的数据先后放入一个 24 位的缓冲区中,先来的字节占高位 。数据不足3字节,缓冲器中剩下的位用0补足。每次取出 6bit,按照其值选择中的字符作为编码后的输出,直到全部输入数据转换完成。若原数据长度不是 3 的倍数且剩下1个输入数据,则在编码结果后加 2 个 “ = ”,若剩下 2 个输入数据,则在编码结果后加 1 个 “=”。所以,识别 Base64 编码的一种方法是看末尾是否有 “ = ” 。但是这种识别方法并不是万能的,当编码的字符长度刚好是3的倍数时,编码后的字符串末尾不会出现 “=”

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

Base32 和 Base16:

Base 系列中还有 Base32 和 Base16 ,其实 Base32 / Base16 与 Base64 的目的一样,只是具体的编码规则不同。Base32 编码将二进制文件转换成 32 个 ASCII 字符组成的文本,转换表为

ABCDEFGHIJKLMNOPQRSTUVWXYZ234567

Base16 编码则将二进制文件转换成由 16 个字符组成的文本,这 16 个字符为 0~9和 A~F,其实就是 Hex 编码。


uuencode:

uuencode 衍生自 “unix-to-unix encoding” ,曾是 UNIX 系统下将二进制的资料借由 UUCP 邮件系统传输的一个编码程式,是一种二进制到文字的编码。uuencode 将输入字符以每3字节为单位进行编码,如此重复。如果最后剩下的字符少于 3 字节,不足部分用 0 补齐。与 Base64 一样, uuencode 将这 3 字节分为4组,每组以十进制数表示,这时出现的数字为 0~63 。此时将每个数加上 32,产生的结果刚好落在 ASCI 可打印字符的范围内。经过 uuencode 编码过后的字符,可以看到 uuencode 的特征: 特殊符号很多.


xxencode:

xxencode 与 Base64 类似,只不过使用的转换表不同:、

+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

只是多了“ - ”字符,少了“ / ”字符,而且 xxencode 末尾使用的补全符号为“ + ”,不同于Base64 使用的“ = ”.


URL编码

URL编码又称为 百分号编码。如果一个保留字符在特定上下文中具有特殊含义,且URI中必须使用该字符用于其他目的,那么该字符必须进行编码。URL编码一个保留字符,需要先把该字符的ASCII编码表示为两个十六进制的数字,然后在其前面放置转义字符“ % ”,置入URI中的相应位置(非ASCI字符需要转换为 UTF-8 字节序,然后每字节按照上述方式表示)。例如,如果“ / ”用于URI的路径成分的分界符,则是具有特殊含义的保留字符。如果该字符需要出现在URI一个路径成分的内部,,则应该用“ %2F ”或“ %2f ”来代替“ / ".

二、古典编码

移位密码

密码和编码都是加密,但是有着本质区别:那个密码比编码多一个密钥(key)。我们将数据(明文)通过一定规则(秘钥)进行打乱混编(加密)得到字符串(密文),这就是密码的基本流程。密码学中,一般将明文用m表示,将密文用c表示,将秘钥k表示。

简单移位密码

有一个明文“qianxinshequ”,有一个秘钥“4132”,用下面的形式进行书写:

m="qianxinshequ"
k="4132"

当m为qianxinshequ的时候,先按照秘钥长度对其进行分割,已知 len(k)=4 :

qian xins hequ

m被分为了3部分,按照k的数字顺序对每一部分的明文进行移位加密。根据k,每一部分的明文第一位被换到了第四位,第二位被换到了第一位,第三位依旧是第三位,第四位被换到第二位。剩下的两部分,以此类推。

经过变化,m变为:

inaq isnx euqh

合并就变成了密文:

inaqisnxeuqh

一个简单移位密码完成。

云影密码

云影密码仅包含01248数字,其中0用于分隔,其余数字用于做加和操作之后转换为明文。

例如:

m = "QIANXIN"

加密之后就是

c = "88108101084208880810842"

解密是这样的

881 81 1 842 888 81 842

各组相加

17 9 1 14 24 9 14

对应

Q I A N X I N

连起来就是m

m = "QIANXIN"

加密程序:

def yunying_decode(c):
    t="abcdefghijklmnopqrstuvwxyz"
    l=c.split("0")
    r=""
    for i in l:
        tep=0
        for j in i:
            tep+=int(j)
        r+=t[tep-1]
    return r

if __name__ =="__main__":
    print yunying_decode("8842101220480224404014224202480122")


栅栏密码

栅栏密码是一种规则比较特殊的移位密码,他的k是一个数字,用来表示栅栏的长度。其具体加密过程为,将要加密的m分成若干组。每组一共有k个字符。然后取每组第一个字符顺次连接,组成第一个字符串。然后再将第二个字符顺次连接,组成第二个字符串。以此类推,直到所有的m加密完毕。最后将加密后的字符串拼接在一起,便是c

例:

m = "qianxin"
k = "2"

按照k进行分解

qi an xi n

每组首位相加,以此类推

qaxn ini

合并得出c

c = "qaxnini"

曲路密码

将m填入一个表中,按照定向的连贯的顺序进行遍历,对其进行加密,是移位密码的一种。
在这里插入图片描述

此时,k看起来是一个表的形式,但仍然可以用字符串进行表达。因为k就是行列数。如下图所示:修改行列数就可以修改k。

有以下m

m = "qianxinyuanchuang"

k为7行5列,c为:

unihcxnngaaiunayq

替代密码

什么是代替密码?
首先构造一个或多个密文字母表,然后用密文字母表中的字母或字母组来代替明文字母或字母组,各字母或字母组的相对位置不变,但其自身发生改变。

代替密码又分为单表代替密码、多表代替密码和多名代替密码。

单表代替密码:
单表代替密码又称简单代替密码,它只使用一个密文字母表,并且由密文字母表中的一个字母代替明文字母表中的一个字母。
所以说单表代替建立了由密文到明文的一对一的映射关系。

多表代替密码:
由于单表代替密码只是用一个密文字母表,很容易破解。提高密码强度的一个方法是采用多个密文字母表。
最典型的多表代替密码是Vigenre密码。
维吉尼亚密码使用26个密文字母表,将26个密文字母表排在一起成为Vigenre方阵,如下图所示:

在这里插入图片描述
维吉尼亚密码的规则是用明文字母在方阵中的列和密钥字母在方阵中的行的交点处的字母来代替该明文字母。例如,明文字母为p,密钥字母为y,就用交点处的n来代替字母p。
维吉尼亚密码的解密就是利用维吉尼亚方阵进行反替换。例如,密文J,密钥是X,首先根据密钥J找到密文字母表,再查找密文X所在的列,该列与明文字母表的交点就是对应的明文O

多名代替密码:
为了抵抗频率分析攻击,希望密文中不残留明文字母的频率痕迹。一种明显的方法是设法将密文字母的频率分布拉平。


恺撒密码

单表替代密码,通过将字母一定的位数来实现加密和解密,移动的位数称为偏移量.
所以位数就是恺撒密码的密钥,只考虑可见字符,并且都为ascii码,所以128为模数.

加密:

def caser_encode(m,k):
    c=""
    for i in m:
        c+= chr((ord(i)+k)%128)
    return c

print caser_encode("flag{kaisamima}",3)

解密:

def caser_decode(c,k):
    m=""
    for i in c:
        m+= chr((ord(i)-k)%128)
    return m

print caser_decode("iodj~ndlvdplpd\x00",3)

ROT13:
在恺撒密码中,有一个特例,当k=13,只作用于大小写英文字母的时候称为ROT13,准确地来说它是一种编码,是ctf的常客.
通常会作用于md5, flag等字符串上,而我们都知道,md5字符只有ABCDEF,对应的ROT13为NOPQRS,flag对应的是SYNT


培根密码:

培根密码一般使用两种不同的字体表示密文,关键是字体,使用AB代表两种字体,5个一组表示密文
在这里插入图片描述


仿射密码

仿射密码是加法密码和乘法密码的结合,映射函数为:
在这里插入图片描述

其中,要求(k1,n)= 1,0≤k0<n,且不允许同时有k1 = 1和k0 = 0


现代密码

分组密码和序列密码:


分组加密

分组加密(Block Cipher) 又称为分块加密或块密码,是一种对称密码算法,这类算法将明文分成多个等长的块 (Block) ,使用确定的算法和对称密钥对每组分别加密或解密。分组加密是极其重要的加密体制,如DES和AES曾作为美国政府核定的标准加密算法,应用领域从电子邮件加密到银行交易转账,非常广泛。
本质上,块加密可以理解为一种特殊的替代密码,只不过每次替代的是一大块。因为明文空间非常巨大,所以对于不同的密钥,无法制作一个对应明密文的密码表,只能用特定的解密算法来还原明文。

序列密码

通俗讲,序列密码就是利用初始密钥(种子密钥),产生密钥流,再利用密钥流,对明文逐比特进行加密(异或运算),解密相同,将密文与密钥进行逐比特异或运算。
由于密钥流的周期性会导致加密的不安全,但是非周期(随机)又存在协商难题,因此序列密码在产生密钥流时采用的是伪随机数(周期很大的周期序列)
采用伪随机数近乎完美地解决了以上两个难题,也实现了一次一密的加密方案。
序列密码又分为同步序列密码与自同步序列密码
1)同步序列:密文只与明文和密钥有关,密文不参与加密。
2)自同步序列:密文参与加密,密文不仅与明文和密钥有关,还与之前的密文有关。


公钥密码

公钥密码 (Public Key Cryptography),又称为非对称密码,其最大特征是加密和解密不再使用相同的密钥,而使用不同的密钥。使用者会将一个密钥公开,而将另一个密钥私人持有,这时这两个密钥被称为公钥和私钥。一般来说,公钥和私钥是难以互相计算的,但它们可以互相分别作为加密密明和解密密钥。当信息发送者选择采用接收者的公钥加密时,接收者收到信息后使用自己的私钥解密,这样便可保持信息的机密性;若信息发送者使用自己的私钥对信息摘要进行加密,接收者使用发送者的公钥对摘要进行验证,即可起到签名的作用,可以保证信息的认证性和不可否认性。

RSA是一种公钥密码算法,它的名字由三位开发者,即Ron Rivest、Adi Shamir和Leonard Adleman的姓氏的首字母组成的。 RSA被用于公钥密码和数字签名。

公钥加密系统
在一个公钥加密系统中,任何人参与者都拥有独自的公钥和密钥,通常用P表示公钥,用S表示密钥,公钥用于加密,密钥用于解密。并且公钥可以公开,任何人都可以使用这个公钥发送一段密文,而只有私钥的持有者才可以用私钥解密

公钥和私钥对应的函数互为反函数

RSA公钥加密体系基于一个数论事实:把两个大质数相乘很容易,但是分解大数为两个质数的乘积很难

RSA加密
在RSA公钥加密系统中,可以通过以下过程创建一对公钥和私钥

1.任意选取远大于信息 M 的大质数 p 和 q,且 p != q
2.令 n = pq
3.计算 φ = (p-1)(q-1)
4.选取一个与 φ 互质的小奇数 e
5.计算对模 φ 意义下的 e 的乘法逆元 d,即 ed ≡ 1 (mod φ)
6.公开 P=(e, n),此即为RSA公钥
7.隐藏 S=(d, n),此即为RSA私钥

对于明文 M,使用以下函数进行加密
在这里插入图片描述

对于密文 C,使用以下函数进行解密
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GO并发编程综合应用

一.GO并发编程综合应用 1.生产者消费者模式 1.1需求分析 ​ 生产者每秒生产一个商品&#xff0c;并通过物流公司取货 ​ 物流公司将商品运输到商铺 ​ 消费者阻塞等待商铺到货&#xff0c;需要消费10次商品 1.2实现原理 1.3代码实现&#xff1a; package mainimport (&q…

chatGPT 国内版,嵌入midjourney AI创作工具

聊天GPT国内入口,免切网直达,可直接多语言对话,操作简单,无需复杂注册,智能高效,即刻使用.可以用作个人助理,学习助理,智能创作、新媒体文案创作、智能创作等各种应用场景! 地址&#xff1a; https://ai.wboat.cn/

56.微服务面试篇

目录 一、SpringCloud常见组件有哪些&#xff1f; 二、Nacos源码分析和Sentinel源码分析。 三、Nacos的服务注册表结构是怎样的&#xff1f; 四、Nacos如何支撑数十万服务注册压力&#xff1f; 五、Nacos如何避免并发读写冲突问题&#xff1f; 六、Nacos与Eureka的区别有…

locust 压测 websocket

* 安装 python 3.8 https://www.python.org/ py --version * 安装 locust pip install locust2.5.1 -i http://pypi.douban.com/simple/ pip install locust2.5.1 -i https://pypi.mirrors.ustc.edu.cn/simple/ locust -V 备注&#xff1a;-i 是切换下载源 * 安装依赖 pip ins…

ElasticSearch - networking配置global

版本8.11 单机部署了一个节点 在elasticsearch.yml中 配置了network.host: 8.8.8.8(之前为127.0.0.1) 但启动服务失败 报错信息为: BindTransportException: Failed to bind to 8.8.8.8:[9300-9399] 为啥要配置8.8.8.8 是因为参考的官方说明 Networking | Elasticsearch Gu…

Docker知识点整理

Docker和虚拟机技术的区别&#xff1a; 传统的虚拟机&#xff0c;可以虚拟出一条硬件&#xff0c;运行一个完整的操作系统&#xff0c;在这个操作系统上安装和运行所需的软件 容器内的应用可以直接运行在宿主 主机的内核中&#xff0c;容器没有自己的内核&#xff0c;也不用虚…

云上丝绸之路| 云轴科技ZStack成功实践精选(西北)

古有“丝绸之路” 今有丝绸之路经济带 丝路焕发新生&#xff0c;数智助力经济 云轴科技ZStack用“云”护航千行百业 沿丝绸之路&#xff0c;领略西北数字化。 古丝绸之路起点-陕西 集历史与现代交融&#xff0c;不仅拥有悠久的历史文化积淀&#xff0c;而且现代化、数字化发…

卡片C语言(2021年蓝桥杯B)

分析&#xff1a;我们用一个数组来记录卡牌&#xff0c;我们每使用一张卡牌&#xff0c;就减一张&#xff0c;当卡牌数为-1的时候&#xff0c;说明不够用了&#xff0c;此时我们就打印上一个组合的数字。 #include <stdio.h> int main(){int num[10],i,m,n,j;for(i0;i&l…

AIGC重塑教育:AI大模型驱动的教育变革与实践

目录 引言 AI与教育工作者 ​教育资源不平衡 引言 AI正迅猛地改变着我们的生活。 根据高盛发布的一份报告&#xff0c;AI有可能取代3亿个全职工作岗位&#xff0c;影响全球18%的工作岗位。在欧美&#xff0c;或许四分之一的工作可以用AI完成。另一份Statista的报告预测&…

Nginx 服务器安装及配置文件详解

1. 安装nginx 1.1 选择稳定版本 我们编译安装nginx来定制自己的模块&#xff0c;机器CentOS 6.2 x86_64。首先安装缺少的依赖包&#xff1a; # yum -y install gcc gcc-c make libtool zlib zlib-devel openssl openssl-devel pcre pcre-devel 这些软件包如果yum上没有的话…

springoot集成kafka

1.常见两种模式 2.高可用 和 负载均衡 组内:消费者 一个只能消费一个分区 组外:消费者消费是订阅者模式

【Https】工作流程

HTTPS 也是⼀个应用层协议。是在 HTTP 协议的基础上引入了⼀个加密层。 前言 由于Http是明文传输&#xff0c;因此如果有人想修改/截获数据都是非常容易&#xff0c;因此就出现了运营商劫持问题。 加密基础知识 明文密钥>密文 加密 密文密钥>明文 解密 对称加密和非对…

ssm基于HTML5的OA办公系统论文

基于HTML5的OA办公系统 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;作为一个一般的企业都开始注重与自己的信息展示平台&#xff0c;实现基于HTML5的OA办公系统在技术上已成熟。本文介绍了基于HTML5的OA办公系统的开发全过程。通过分析企业对于博客网站的需…

【Proteus仿真】【51单片机】视力保护仪

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器&#xff0c;使LCD1602液晶&#xff0c;按键、HC-SR04超声波、PCF8591 ADC、光敏传感器、蜂鸣器、LED等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显示…

Linux基本操作

常用快捷键 按键 作用 Ctrld 键盘输入结束或退出终端 Ctrls 暂停当前程序&#xff0c;暂停后按下任意键恢复运行 Ctrlz 将当前程序放到后台运行&#xff0c;恢复到前台为命令fg Ctrla 将光标移至输入行头&#xff0c;相当于Home键 Ctrle 将光标移至输入行末&#xf…

LeetCode Hot100 146.LRU缓存

题目&#xff1a; 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回关键字的值&…

编译Sqlite3记录

下载源文件&#xff1a; 下载地址&#xff1a;SQLite Download Page 打开QtCreator创建新的工程&#xff0c;选择纯C工程&#xff0c;将main.c删除&#xff0c;将下载的源码解压后的文件复制到并添加到工程中&#xff0c;其中的文件包括&#xff1a;sqlite3ext.h、sqlite3.h、…

威睿三合一电驱动系统斩获“2023汽车新供应链百强-金辑奖”

10月19日&#xff0c;2023第五届“金辑奖”颁奖盛典在上海圆满落幕。威睿公司“高效低噪碳化硅电驱动系统”在动力总成电气化领域脱颖而出&#xff0c;荣获“2023中国汽车新供应链百强”荣誉称号。 “金辑奖”由盖世发起&#xff0c;旨在“发现好公司推广好技术成就汽车人”&a…

iPhone 16 的电池供应可能来自印度

据英国《金融时报》报道&#xff0c;据报道&#xff0c;苹果已通知其供应链&#xff0c;包括中国德赛公司和台湾新普科技等电池供应商&#xff0c;其倾向于将 iPhone 16 的电池供应转移到印度。苹果鼓励供应商将现有产能迁往印度&#xff0c;以扩大该地区的生产规模。 鉴于电池…

ShenYu网关注册中心之Zookeeper注册原理

文章目录 1、客户端注册流程1.1、读取配置1.1.1、用于注册的 ZookeeperClientRegisterRepository1.1.2、用于扫描构建 元数据 和 URI 的 SpringMvcClientEventListener 1.2、扫描注解&#xff0c;注册元数据和URI1.2.1、构建URI并写入Disruptor1.2.2、构建元数据并写入Disrupto…