CRYPTO现代密码学学习

news2024/9/19 10:45:09

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 = 386123125371923651191219869811293586459

e = 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.coloradmin.cn/o/1354776.html

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

相关文章

金融中IC和IR的定义

当谈到金融领域时&#xff0c;IC&#xff08;Information Coefficient&#xff09;和IR&#xff08;Information Ratio&#xff09;通常是用来评估投资组合管理绩效的指标。它们都涉及到投资者对信息的利用和管理的效果。 信息系数&#xff08;IC - Information Coefficient&a…

使用Go语言采集1688网站数据对比商品价格

目录 引言 一、数据采集原理 二、数据采集流程 三、数据采集代码实现 四、数据分析与比较 五、注意事项 六、结论 引言 随着电子商务的快速发展&#xff0c;越来越多的消费者开始通过在线平台购买商品。在众多电商平台中&#xff0c;1688作为中国最大的批发交易平台&am…

三、C语言中的分支与循环—if语句 (1)

在这一章节中我们的学习内容如下&#xff0c;咱们一步步来。 分支结构 1. if语句 2. 关系操作符 3. 条件操作符 4. 逻辑操作符&#xff1a;&& , || , &#xff01; 5. switch语句 循环结构 6. while循环 7. for循环 8. do-while循环 9. break和conti…

kubeadm创建k8s集群

kubeadm来快速的搭建一个k8s集群&#xff1a; 二进制搭建适合大集群&#xff0c;50台以上。 kubeadm更适合中下企业的业务集群。 部署框架 master192.168.10.10dockerkubelet kubeadm kubectl flannelnode1192.168.10.20dockerkubelet kubeadm kubectl flannelnode2192.168.1…

vue3 + TS + vite 搭建中后台管理系统(完整项目)

vue3 TS vite 搭建中后台管理系统&#xff08;完整项目&#xff09; 前言1、搭建步骤及方法2、集成多种插件功能&#xff0c;实现中后台按需使用3、新手学TS如何快速进入状态、定义TS类型4、layout搭建四款常见风格6、大屏搭建效果5、vue3Ts运营管理系统总结&#xff1a; 前言…

2020年认证杯SPSSPRO杯数学建模C题(第一阶段)抗击疫情,我们能做什么全过程文档及程序

2020年认证杯SPSSPRO杯数学建模 C题 抗击疫情&#xff0c;我们能做什么 原题再现&#xff1a; 2020 年 3 月 12 日&#xff0c;世界卫生组织&#xff08;WHO&#xff09;宣布&#xff0c;席卷全球的冠状病毒引发的病毒性肺炎&#xff08;COVID-19&#xff09;是一种大流行病。…

Mybatis Plus 基础功能 BaseMapper和基础配置以及注解

文章目录 Mybatis Plus导入依赖定义Mapper约定常见配置 Mybatis Plus 导入依赖 官网看一下也行plus官网 spring boot3 版本<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><vers…

易点易动固定资产管理系统集成企业微信,帮助企业全生命周期管理固定资产

在现代企业中&#xff0c;固定资产管理是一项至关重要的任务。固定资产的高效管理可以提高企业的运营效率、降低成本&#xff0c;并确保资产的安全和稳定。然而&#xff0c;传统的固定资产管理方法往往复杂繁琐&#xff0c;容易出现信息不准确、流程不畅和数据不一致的问题。为…

Pikachu--字符型注入(get)

Pikachu--字符型注入&#xff08;get&#xff09; 提交方式是get提交&#xff0c;直接在浏览器地址栏里输入注入语句得出结果 判断注入类型 我们要输入数据库里面有的名字 比如vince 输入1 and 12 错误结果 输入 1 and 11 正确结果 判断为字符型注入 判断字段数 输…

一起玩儿物联网人工智能小车(ESP32)——24. 变量与函数(二)

摘要&#xff1a;本文介绍变量和函数的基本知识 在前面一篇中了解了变量&#xff0c;接着就来了解一下函数。函数是程序中的一个关键概念&#xff0c;它可以简化程序的编写&#xff0c;使代码更加模块化、可复用&#xff0c;提高程序的可读性。其实在之前已经多次遇到函数了&am…

python下载wheel并安装

一、查看当前python 版本兼容信息 pip debug --verbose C:\python\37>pip debug --verbose WARNING: This command is only meant for debugging. Do not use this with automation for parsing and getting these details, since the output and options of this command…

探索LinkedIn:使用TypeScript和jsdom库的高级内容下载器

概述 LinkedIn是一个专业的社交网络平台&#xff0c;拥有超过7亿的用户和数以亿计的职位、公司和教育机构的信息。对于数据分析师、市场营销人员、招聘人员和其他对LinkedIn数据感兴趣的人来说&#xff0c;能够从LinkedIn上获取和分析这些信息是非常有价值的。 因此&#xff0…

如何利用Oracle官方网站不登录账号下载和安装非最新版本的JDK(版本自由选择)

一、JDK概述 JDK&#xff08;Java Development Kit&#xff09;是Java开发工具集&#xff0c;是针对Java编程语言的软件开发环境。它包含了Java编译器、JRE&#xff08;Java运行时环境&#xff09;以及其他一些用于开发、调试和测试Java应用程序的工具&#xff0c;是Java开发人…

【日积月累】Java Lambda 表达式

目录 【日积月累】Java Lambda 表达式 1.前言2.语法3.应用场景3.1简化匿名内部类的编写3.1简化匿名内部类的编写3.2简化集合类中的操作3.3实现函数式接口3.4简化多个方法的调用3.5简化异步编程 4.总结5.参考 文章所属专区 日积月累 1.前言 Lambda表达式是一个匿名函数&#…

计算机毕业设计——SpringBoot 房屋销售租赁平台 房屋购物网站(附源码)

1&#xff0c;绪论 1.1 背景调研 在房地产行业持续火热的当今环境下&#xff0c;房地产行业和互联网行业协同发展&#xff0c;互相促进融合已经成为一种趋势和潮流。本项目实现了在线房产平台的功能&#xff0c;多种技术的灵活运用使得项目具备很好的用户体验感。 这个项目的…

微信小程序封装vant 下拉框select 单选组件

先上效果图&#xff1a; 主要是用vant 小程序组件封装的&#xff1a;vant 小程序ui网址&#xff1a;vant-weapp 主要代码如下: 先封装子组件&#xff1a; select-popup 放在 components 文件夹里面 select-popup.wxml: <!--pages/select-popup/select-popup.wxml--> &…

Flume基础知识(三):Flume 实战监控端口数据官方案例

1. 监控端口数据官方案例 1&#xff09;案例需求&#xff1a; 使用 Flume 监听一个端口&#xff0c;收集该端口数据&#xff0c;并打印到控制台。 2&#xff09;需求分析&#xff1a; 3&#xff09;实现步骤&#xff1a; &#xff08;1&#xff09;安装 netcat 工具 sudo yum …

RT-Thread学习

RT-Thread是以Apache License v2开源许可发布的物联网操作系统。 RT-Thread有十多年的历史&#xff0c;在开发过程中也放在Github上由大家协同开发&#xff0c;并发布一个个版本&#xff0c;导致不同人群面对多样的版本无从下手。 RT-Thread的版本/分支有以下几种可供选择&…

51单片机(STC8)-- GPIO输入输出

文章目录 I/O口相关寄存器端口数据寄存器端口模式配置寄存器&#xff08;PxM0&#xff0c;PxM1&#xff09;端口上拉电阻控制寄存器(PxPU)关于I/O的注意事项 配置I/O口I/O设置demoI/O端口模式LED控制&#xff08;I/O输出&#xff09;按键检测&#xff08;I/O输入&#xff09; S…

低代码搭建,助力批发零售行业解决方案的快速实现

引言 随着技术的快速发展&#xff0c;低代码技术作为一种高效的业务解决方案&#xff0c;正日益在批发零售行业中展现其巨大的应用潜力。其所带来的快速搭建、灵活性和成本效益&#xff0c;对于现代批发零售业务的管理和发展具有重要意义。 本文旨在探讨低代码技术在批发零售…