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.rhkb.cn/news/230749.html

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

相关文章

【Bug解决】Failed to configure a DataSource

1、问题描述 SpringBoot项目在启动时报出下面的错误&#xff1a; Description: Failed to configure a DataSource: url attribute is not specified and no embedded datasource could be configured. Reason: Failed to determine a suitable driver class Action: Consider…

什么是差值表达式

在Vue.js中&#xff0c;差值表达式是一种基本的数据绑定形式&#xff0c;用于将数据绑定到文档对象模型&#xff08;DOM&#xff09;上。差值表达式通常使用双大括号 {{ }} 来表示&#xff0c;这种语法非常直观。当Vue实例的数据发生变化时&#xff0c;差值表达式的内容也会相应…

css 编写圆角矩形只有左侧一半的样式

实现该样式&#xff1a;尺寸大小可自由调整修改 <div class"abc"></div>.abc{width: 50px;height: 300px;border: 1px solid red;border-right: none;border-top-left-radius: 10px;border-bottom-left-radius: 10px;}

设计模式:抽象工厂模式(讲故事易懂)

抽象工厂模式 定义&#xff1a;将有关联关系的系列产品放到一个工厂里&#xff0c;通过该工厂生产一系列产品。 设计模式有三大分类&#xff1a;创建型模式、结构型模式、行为型模式 抽象工厂模式属于创建型模式 上篇 工厂方法模式 提到工厂方法模式中每个工厂只生产一种特定…

(Java企业 / 公司项目)Nacos的怎么搭建多环境配置?(含相关面试题)(二)

上一篇讲了一个单体服务中配置&#xff0c;传统的Nacos配置但是在微服务架构当中肯定都是多环境下配置&#xff0c;比如生产环境&#xff0c;dev测试环境等等。 第一种方式模拟开始&#xff1a; 首先展示在生产环境中nacos如何配置&#xff0c;在模块下新建一个配置文件&…

vue3-13

token可以是后端api的访问依据&#xff0c;一般绝大多数时候&#xff0c;前端要访问后端的api,后端都要求前端请求需要携带一个有效的token,这个token用于用户的身份校验&#xff0c;通过了校验&#xff0c;后端才会向前端返回数据&#xff0c;进行相应的操作&#xff0c;如果没…

PE解释器之PE文件结构

PE文件是由许许多多的结构体组成的&#xff0c;程序在运行时就会通过这些结构快速定位到PE文件的各种资源&#xff0c;其结构大致如图所示&#xff0c;从上到下依次是Dos头、Nt头、节表、节区和调试信息(可选)。其中Dos头、Nt头和节表在本文中统称为PE文件头(因为SizeOfHeaders…

virtualbox新建Ubuntu虚拟机

1、下载virtualbox 2、下载Ubuntu镜像 https://ubuntu.com/blog/desktop virtualbox安装好后&#xff0c;点击新建 选择linux类型 选择内存2~4G都行 选择先不添加虚拟硬盘 创建硬盘&#xff0c;管理点击虚拟介质管理 点击创建&#xff0c;选择创建类型为vmdk&#xff0…

Linux 进程(八) 进程的退出码

main 函数的返回值叫做进程的退出码。当进程成功退出的时候&#xff0c;我们一般用0来表示。进程失败的时候一般用非零来表示。我们使用不同的数字来表示进程退出时不同的失败原因。 我们查看系统的有多少退出码以及其含义时需要用到strerror() 他的头文件和用法如下。 通过一…

输入输出流

1.输入输出流 输入/输出流类&#xff1a;iostream---------i input&#xff08;输入&#xff09; o output&#xff08;输出&#xff09; stream&#xff1a;流 iostream&#xff1a; istream类&#xff1a;输入流类-------------cin&#xff1a;输入流类的对象 ostream类…

Android Matrix剪切clipPath缩放scale图片postTranslate圆形放大镜,Kotlin(2)

Android Matrix剪切clipPath缩放scale图片postTranslate圆形放大镜&#xff0c;Kotlin&#xff08;2&#xff09; 在 Android Matrix剪切clipPath缩放scale图片postTranslate圆形放大镜&#xff0c;Kotlin&#xff08;1&#xff09; Android Matrix剪切clipPath缩放scale图片po…

Apache Doris (六十): Doris - 物化视图

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录

大文件快速传输解决办法汇总

在数据传输普及的当今时代&#xff0c;文件体量也在不断的突破它”大“的上线&#xff0c;很多企业也在面临着这类大文件快速传输的烦恼&#xff0c;而且这里面的“大”可不是一般意义的几M,几G的文件&#xff0c;它有可能上T级甚至是PB级别、TB级别的大文件&#xff0c;或者是…

CCNP课程实验-07-OSPF-Trouble-Shooting

目录 实验条件网络拓朴 环境配置开始排错错点1&#xff1a;R1-R2之间认证不匹配错误2&#xff1a;hello包的时间配置不匹配错误3&#xff1a;R2的e0/1接口区域配置不正确错误4&#xff1a;R4的e0/1接口没有配置进OSPF错误5&#xff1a;R2的区域1没有配置成特殊区域错误6&#x…

文件摆渡系统如何实现网络隔离后的数据交换、业务流转?

近年来全球网络安全威胁态势的加速严峻&#xff0c;使得企业对于网络安全有了前所未有的关注高度。即便没有行业性的强制要求&#xff0c;但在严峻的安全态势之下&#xff0c;企业的网络安全体系建设正从“以合规为导向”转变到“以风险为导向”&#xff0c;从原来的“保护安全…

SpringCloud微服务安全之API审计日志功能实现

SpringCloud微服务安全之API审计日志功能实现 1.审计功能介绍2.记录的实体类设计3.保存审计记录到数据库的工具4.审计功能实现1.审计功能介绍 审计日志 定义:谁,在什么时间,干了什么事。位置:认证之后,授权之前。这样就知道是谁在访问,拒绝掉的访问也能被记录。如果放在认…

分享10篇优秀论文,涉及图神经网络、大模型优化、表格分析

引言 第38届AAAI人工智能年度会议将于2024年2月在加拿大温哥华举行。今天给大家分享十篇AAAI2024论文&#xff0c;主要涉及图神经网络&#xff0c;大模型幻觉、中文书法文字生成、表格数据分析、KGs错误检测、多模态Prompt、思维图生成等。 论文获取方式&#xff0c;回复&am…

微服务实战系列之Dubbo(下)

前言 眼看着2023即将走远&#xff0c;心里想着似乎还有啥&#xff0c;需要再跟各位盆友叨叨。这不说曹操&#xff0c;曹操就来了。趁着上一篇Dubbo博文的余温尚在&#xff0c;博主兴匆匆地“赶制”了Dubbo的下集&#xff0c;以飨读者。 上一篇博主依然从Dubbo的内核出发&#…

C++第四天

定义一个Person类&#xff0c;私有成员int age&#xff0c;string &name&#xff0c;定义一个Stu类&#xff0c;包含私有成员double *score&#xff0c;写出两个类的构造函数、析构函数、拷贝构造和拷贝赋值函数&#xff0c;完成对Person的运算符重载(算术运算符、条件运算…

Winform中使用Fleck实现Websocket服务端并读取SQLite数据库中数据定时循环群发消息

场景 Winform中使用Websocket4Net实现Websocket客户端并定时存储接收数据到SQLite中&#xff1a; Winform中使用Websocket4Net实现Websocket客户端并定时存储接收数据到SQLite中-CSDN博客 Winform中操作Sqlite数据增删改查、程序启动时执行创建表初始化操作&#xff1a; Wi…