CRYPTO现代密码学学习

CRYPTO现代密码学学习

  • RC4 加密算法
  • RSA加密解密
  • DES加密解密详解
    • 密钥的生成
    • 密文的生成

RC4 加密算法

简单介绍:RC4加密算法是一种对称加密算法,加密和解密使用同一个函数
初始化分为以下几个步骤

  • 初始化存储0-255字节的Sbox(其实就是一个数组)
  • 填充key到256个字节数组中称为Tbox(你输入的key不满256个字节则初始化到256个字节)
  • 交换s[i]与s[j] i 从0开始一直到255下标结束. j是 s[i]与T[i]组合得出的下标
     // 步骤一、初始化赋值
    for (i=0;i<256;i++){S[i] = i;T[I] = K[i mod keylen];}
    // 步骤二、用T产生S的初始置换
    j = 0;for (i=0; i<256; i++){j = (j + S[i] + T[i]) mod 256;swap(S[i],S[j]);}// 步骤三、得到密钥流K(每次计算出一个K)
    i=j=0;for(h=0; h<datalen; h++){i=(i+1) mod 256;j=(j+S[i]) mod 256;swap(S[i],s[j]);t=(S[i]+S[j]) mod 256;K=S[t];// D[h]^=K;      亦或得到密文}```

RC4加密解析传送阵

RSA加密解密

1

求解私钥的步骤:
欧拉函数:表示表示与n互质的数的个数

2
eg:

[WUSTCTF2020]babyrsa

c = 28767758880940662779934612526152562406674613203406706867456395986985664083182
n = 73069886771625642807435783661014062604264768481735145873508846925735521695159
e = 65537

若要求解私钥,必须要分解n,得到两个质数p,q:http://www.factordb.com/index.php

p = 189239861511125143212536989589123569301
q = 386123125371923651191219869811293586459

求解私钥d,以及明文m

from Crypto.Util.number import long_to_bytes
from Crypto.Util.number import *q = 189239861511125143212536989589123569301
p = 386123125371923651191219869811293586459e = 65537
c = 28767758880940662779934612526152562406674613203406706867456395986985664083182
# n = 73069886771625642807435783661014062604264768481735145873508846925735521695159
n = q * p
# print(n)
d = gmpy2.invert(e, (p - 1) * (q - 1))
print("d=", d)
m = pow(c, d, n)

此处有疑问了,明文是如何转为这么一大长串数字呢?

import Crypto
from Crypto.Util.number import bytes_to_long
import os
t = os.urandom(4)	# os.urandom(len)方式产生长度为len的随机字节串
print(t)
for i in t:print(i)
print(bytes_to_long(t))	# 调用函数计算long整型值:

计算原理:29*pow(2,24) + 30*pow(2,16) + 150*pow(2,8) + 148*pow(2,0)
result

大数在此处的类是mpz,引用了GMP库:参考传送阵

判断字符串中所有字符是否都是可打印字符。

Unicode字符集中“Other” “Separator”类别的字符为不可打印的字符(但不包括ASCII码中的空格(0x20))。可用于判断转义字符。
ASCII码中第0~32号及第127号是控制字符;第33~126号是可打印字符,其中第48~57号为0~9十个阿拉伯数字;65~90号为26个大写英文字母,97~
122号为26个小写英文字母。
ascii码在0~255字符中只有189个字符能被打印。

lst = []
for idx,val in enumerate(range(256)):if chr(val).isprintable():lst.append(idx)
print(len(lst))
print(set(range(256)) - set(lst))

answer

DES加密解密详解

Data Encryption Standard
就不主动写了,这篇文章讲的非常详细:
https://www.hankcs.com/security/des-algorithm-illustrated.html

密钥的生成

  • 子密钥K1~K16的生成:
    密钥转为2进制的初始密钥,初始密钥进行PC-1置换,得到56位的密钥;
    将这56bit密钥均分为两个28bit,左半部分 (C0) ,右半部分 (D0)
    将得到的 C0,D0 按照给定的移位表依次进行移位

密钥

  • 子密钥的CiDi 轮,是由 Ci-1Di-1 循环移位运算得到的
    off = [1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1]
    
        即C1C0向左循环移位1D1D0向左循环移位1C2C1向左循环移位1D2D1向左循环移位1C3C2向左循环移位2D3D2向左循环移位2;最后将其 Ci 与 Di 合并CiDi
  • 将合并后的每个 CiDi 经过PC-2置换,得到K1~K16

密文的生成

  • 和密钥的生成一样,先进行一个初始置换(换了个名字,叫IP置换)只不过密钥是将校验位去掉了,而明文的加密不需要验证。

  • 初始置换后将其均分为左边32位 L0,右边32位 R0

  • 密文的加密规则如下图
    密文生成

  • 需要经过f函数的加密16轮,得到的 L16 R16, 接着再次进行一个IP逆置换,形成最终的密文。

  • 重要的就是这16轮的加密。
    加密函数
        Ln = Rn-1
        Rn= Ln-1 ㊉ f (Rn-1,Kn)
    f函数步骤如下(eg)

    • L1 = R0,R1 =L0 ㊉ f(R0,K1)
    • R032位,K1为48位,所以要进行32-48位的E盒扩展

      扩展规则:以4为单位,分为8组,每组首位前添加前相邻位,末位后添加相邻位,如下图所示:扩展
    • 扩展为48位后,与对应的子密钥进行亦或,即 R0 ㊉ K1,得到另一组最终48位的数据。
    • 分开后的密文序列是32位的,所以还要对其进行S盒压缩,最终将8组6bit的数据被转换为8组4bit(一共32位)的数据。

      48位数据化为8组6bitB1B2B3B4B5B6B7B8 ,每组含有6bit,经过以下运算
          S1(B1)S2(B2)S3(B3)S4(B4)S5(B5)S6(B6)S7(B7)S8(B8)
      最终得到的8组6bit的数据
      输出结构电路
      S盒计算eg:
      101010到S1中。S1会将这六位的第一位1和第六位0拿出来,组成10作为S1的行,中间四位0101拿出来作为S1的列。我们转换成十进制,此时映射到这个S盒的位置就是(2,5),对应S盒的第3行6列(索引都从0开始数)。
      位置
    • 将得到的32位数据在经过P盒置换,得到数据即为f函数结束
  • 将最终经过f函数的数据与 L0 亦或,得到 R1,即 L0 ㊉ 上一步结果

  • 重复上面步骤至16轮,在第16轮后,将R16L16 拼接为 R16L16

  • R16L16 经过IP-1盒逆置换,得到最终16进制数,即为密文。

注意:
DES加密算法中,

  • 密钥:
    置换PC-1盒64位去掉校验位为56位,简单表替换;
    置换PC-2盒,取56位密钥中的48位,简单表替换
  • 密文:
    置换IP盒,将原明文数据打乱,简单表替换,数据位数不变;
    扩展E盒,将分开的32位扩展为48位
    压缩S盒,将已经经过f函数变换后的48位数据(8组6bit)变回原来的32位(8组4bit),用于下次f函数的计算 ;
    置换P盒,将S盒的到的数据进行置换,简单表替换,数据位数依旧为32位。经P盒置换后的数据和 L0 做 ㊉ ,得到下一步的 Ri+1 .
    逆置换IP-1盒,合并后 R16L16 简单表替换,数据位数不变64bit

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

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

相关文章

爬虫工具(tkinter+scrapy+pyinstaller)

需求介绍输入&#xff1a;关键字文件&#xff0c;每一行数据为一爬取单元。若一行存在多个and关系的关键字 &#xff0c;则用|隔开处理&#xff1a;爬取访问6个网站的推送&#xff0c;获取推送内容的标题&#xff0c;发布时间&#xff0c;来源&#xff0c;正文第一段&#xff0…

excel中找出重复项,并标红

一、查找重复值 二、清除格式 还是通过添加规则的路径&#xff0c;清除格式&#xff0c;直接通过格式刷&#xff0c;刷不掉。

Windows重装升级Win11系统后 恢复Mysql数据

背景 因为之前电脑硬盘出现问题&#xff0c;换了盘重装了系统&#xff0c;项目的数据库全部没了&#xff0c;还好之前的Mysql是安装在的D盘里&#xff0c;还有留存文件 解决办法 1.设置环境变量 我的路径是 D:\SoftWare\Application\mysql-5.7.35-winx64 此电脑右键属性 …

基于SSM实现的社区论坛系统(附PPT、设计文档)

基于SSM实现的社区论坛系统&#xff08;附PPT、设计文档&#xff09; 文章目录 基于SSM实现的社区论坛系统&#xff08;附PPT、设计文档&#xff09;系统介绍技术选型成果展示设计文档用户端管理员端 源码获取账号地址及其他说明 系统介绍 基于SSM实现的社区论坛系统是一款前后…

pycharm远程开发调试(remote development)踩坑记录2

在一次我清理了服务器上一些老的pycharm版本之后 打算重新装3.2版本&#xff0c;就全部给清理了。结果坏了事了&#xff0c;新版的装不上了。 试了公司和中科院的服务器都出现这样的问题&#xff0c;100%复现。md。 一直在这一步循环&#xff1a; Downloading the IDE Backen…

echarts实现控制图(设置阈值上下限超出变色)

echarts实现控制图组件&#xff0c;拓展超出阈值变色显示&#xff0c;图中标记平均值及最大值和最小值 代码如下&#xff1a; <template><div :class"className" :style"{height:height,width:width}" /> </template><script>im…

基于Kettle开发的web版数据集成开源工具(data-integration)-介绍篇

目录 &#x1f4da;第一章 官网介绍&#x1f4d7;目标实现&#xff1a;让kettle使用更简单&#x1f4d7;架构及组成 &#x1f4da;第二章 核心功能&#x1f4da;第三章 对比Kettle&#x1f4d7;工具栏位比对&#x1f4d7;工具栏组件内容比对&#x1f4d7;扩展&#xff1a;WebSp…

多线程基础入门【Linux之旅】——下篇【死锁,条件变量,生产消费者模型,信号量】

目录 一&#xff0c;死锁 1. 死锁的必要条件 2&#xff0c;避免死锁 二&#xff0c;条件变量 同步概念与竞态条件 条件变量——初始化 静态初始化 动态初始化 pthread_cond_destroy (销毁) pthread_cond_wait (等待条件满足) pthread_cond_signal (唤醒线程) ph…

在Go语言中处理HTTPS请求

随着互联网的发展&#xff0c;安全性变得越来越重要。HTTPS作为安全的HTTP协议&#xff0c;已经被广泛使用。在Go语言中&#xff0c;处理HTTPS请求需要一些特定的步骤。本文将详细介绍如何在Go语言中处理HTTPS请求。 首先&#xff0c;确保你已经安装了Go语言的开发环境&#x…

10+免费图片素材/壁纸网站,搭一些图片处理工具,快收藏!

划到最后“阅读原文”——领取工具包&#xff08;超过1000工具&#xff0c;免费素材网站分享和行业报告&#xff09; Hi&#xff0c;我是胡猛夫~&#xff0c;专注于分享各类价值网站、高效工具&#xff01; 更多资源&#xff0c;更多内容&#xff0c;欢迎交流&#xff01;公 号…

threejs在透视相机模式下,绘制像素大小固定的元素

要求&#xff1a;在透视相机模式下绘制一个图标&#xff0c;图标大小始终为32*32px。图标如下&#xff1a; 实现思路&#xff1a; 使用THREE.Sprite。因为 SpriteMaterial 支持配置 sizeAttenuation 使Sprite大小不随相机的深度而衰减。所以我们只要保证sprite的初始的大小合适…

SpringCloud之Eureka组件工作原理详解

Eureka是一种服务注册与发现组件&#xff0c;最初由Netflix开发并开源出来。它主要用于构建分布式系统中的微服务架构&#xff0c;并提供了服务注册、服务发现、负载均衡等功能。在本文中&#xff0c;我们将详细解释Eureka的工作原理。 一、Eureka概述 Eureka是Netflix开源的一…

SAFe大规模敏捷企业级实训

课程简介 SAFe – Scaled Agile Framework是目前全球运用最广泛的大规模敏捷框架&#xff0c;也是成长最快、最被认可、最有价值的规模化敏捷框架&#xff0c;目前全球SAFe认证专业人士已达80万人&#xff0c;福布斯100强的70%都在实施SAFe。本课程是一个2天的 SAFe权威培训课…

老生常谈:Web 与低代码开发

Web技术和低代码平台是当前技术领域中的两个热门话题。它们在应用开发领域中扮演着重要的角色&#xff0c;不断被提及和讨论。本文将讨论为什么“Web与低代码”这个话题成为了“老生常谈”&#xff0c;探讨其背后的原因以及这两个概念的关系。 在当今技术飞速发展的时代&#x…

【UWB定位源码】工厂企业人员定位系统源码,实现安全区域管控、人员在岗监控、车辆实时轨迹监控

UWB高精度定位系统源码&#xff0c;企业工厂人员定位系统源码 概念&#xff1a; UWB (ULTRA WIDE BAND, UWB) 技术是一种无线载波通讯技术&#xff0c;它不采用正弦载波&#xff0c;而是利用纳秒级的非正弦波窄脉冲传输数据&#xff0c;因此其所占的频谱范围很宽。 UWB的主要特…

摩擦纳米发电机测试整套解决方案(发电机+采集卡+软件)-升级版/高频率运动版

本测试系统为纳米发电机测试&#xff0c;可结合KEITHLEY 6514或者6517进行纳米发电测试&#xff0c;电压、电流 、电阻、电荷随时间的变化&#xff0c;搭配DAQ数据采集卡&#xff0c;可高速采集数据的变化&#xff0c;如NI USB 6002 最高采样速度可达50K&#xff0c;6003最高采…

【管理篇 / 恢复】❀ 07. macOS下用命令刷新固件 ❀ FortiGate 防火墙

【简介】随着苹果电脑的普及&#xff0c;很多管理员都会通过苹果电脑对飞塔防火墙进行管理。当防火墙需要命令状态下刷新固件时&#xff0c;在macOS下用命令刷新固件&#xff0c;将会是一个小小的挑战。 首先是硬件的连接&#xff0c;USB配置线的USB一头&#xff0c;接入MAC的U…

OpenGL如何基于glfw库 进行 点线面 已解决

GLFW是现在较流行、使用广泛的OpenGL的界面库&#xff0c;而glut库已经比较老了。GLEW是和管理OpenGL函数指针有关的库&#xff0c;因为OpenGL只是一个标准/规范&#xff0c;具体的实现是由驱动开发商针对特定显卡实现的。由于OpenGL驱动版本众多&#xff0c;它大多数函数的位置…

内网DNS隐蔽隧道搭建之iodine工具

iodine iodine是基于C语言开发的&#xff0c;分为服务端和客户端。iodine支持转发模式和中继模式。其原理是&#xff1a;通过TAP虚拟网卡&#xff0c;在服务端建立一个局域网&#xff1b;在客户端&#xff0c;通过TAP建立一个虚拟网卡&#xff1b;两者通过DNS隧道连接&#xf…

uniapp中uview组件库丰富的Slider 滑动选择器的使用方法

目录 #平台差异说明 #基本使用 #设置最大和最小值 #设置步进值 #禁用状态 #自定义按钮的内容和样式 #自定义滑动选择器整体的样式 #此页面源代码地址 #API #Props #Slider Events 该组件一般用于表单中&#xff0c;手动选择一个区间范围的场景。 说明 该组件在H5&…