Blowfish加密算法学习

news/2024/5/20 0:14:53 标签: 学习, 算法, CTF

文章目录

  • Blowfish加密算法
    • 简介
    • 加密原理
      • 密钥扩展
      • 数据加密
    • python解密脚本

Blowfish加密算法

简介

Blowfish是一种对称区块加密算法。该算法流程分为密钥扩展以及数据加密俩部分,每次分组长度64位,密钥采用32-448位,经过扩展后生成多个子密钥数组。进行共16轮的迭代加密。

加密原理

加密流程图:

image-20231228112440897

接收分组长度为64bit的明文,将其分为L和R各32bit。和P进行异或以及F函数加密然后交换迭代16轮,得到密文。

伪代码:

uint32_t P[18];
uint32_t S[4][256];

uint32_t f (uint32_t x) {
   uint32_t h = S[0][x >> 24] + S[1][x >> 16 & 0xff];
   return ( h ^ S[2][x >> 8 & 0xff] ) + S[3][x & 0xff];
}

void encrypt (uint32_t & L, uint32_t & R) {
   for (int i=0 ; i<16 ; i += 2) {
      L ^= P[i];
      R ^= f(L);
      R ^= P[i+1];
      L ^= f(R);
   }
   L ^= P[16];
   R ^= P[17];
   swap (L, R);
}

void decrypt (uint32_t & L, uint32_t & R) {
   for (int i=16 ; i > 0 ; i -= 2) {
      L ^= P[i+1];
      R ^= f(L);
      R ^= P[i];
      L ^= f(R);
   }
   L ^= P[1];
   R ^= P[0];
   swap (L, R);
}

  // ...
  //使用从 pi 派生的值初始化 P 数组和 S 盒; 示例中省略
  // ...
{
   for (int i=0 ; i<18 ; ++i)
      P[i] ^= key[i % keylen];
   uint32_t L = 0, R = 0;
   for (int i=0 ; i<18 ; i+=2) {
      encrypt (L, R);
      P[i] = L; P[i+1] = R;
   }
   for (int i=0 ; i<4 ; ++i)
      for (int j=0 ; j<256; j+=2) {
         encrypt (L, R);
         S[i][j] = L; S[i][j+1] = R;
      }
}

具体加密流程:

密钥扩展

如何生成长度为18的P数组(18个32bit的子密钥)?

最常用的方法就是使用常量π的小数部分,将其转换成为16净值,如下所示:

K1 = 0x76a301d3

K2 = 0xbc452aef

K18 = 0xd7acc4a5

而Blowfish算法的可变密钥长度为32bit到448bit,1到14个32位的数字。使用可变密钥和Pi进行依次异或,也就是伪代码中的:

 for (int i=0 ; i<18 ; ++i)
      P[i] ^= key[i % keylen];

这样就可以的到P数组了。

S-box是一个随机生成的替换盒子,一共有四个,用于F轮函数加密。类似于DES中的S盒将6bit的明文转换成4bit的大小,Blowfish中的S-box作用就是将8bit的数据转换成32bit。S-box的生成也可以和P数组一样使用常量π的小数部分。

之后,取一个全为0的64bits,然后P数组和S-box,应用blowfish算法,生成一个64bits。之后将这个64bits作为输入再次调用blowfish算法,这样最终生成了一个新的P数组:

 uint32_t L = 0, R = 0;
   for (int i=0 ; i<18 ; i+=2) {
      encrypt (L, R);
      P[i] = L; P[i+1] = R;
   }

数据加密

获得了最终的P数组和S-box后,就可以开始数据加密部分了。下面是Blowfish轮函数的处理

Blowfish的轮函数(Feistel)

image-20231228110236324

64bit的明文经过拆分成L和R后,L和P1异或后还是32bit;L异或后的值作为下一轮迭代的R,同时L会进行一次轮函数的加密,32bits会被划分为4个8bit大小的数据,经过S-box被替换成4个32bits大小的数据,之后进行相加和异或的操作,得到的新L会与R进行异或;异或后的值存储在R中,作为下一轮迭代的L。

这样一次迭代就完成了。经过了16次迭代后,P数组中还剩下俩个数据没有被使用。需要单独拿出来进行异或操作。

image-20231228124125441

void encrypt (uint32_t & L, uint32_t & R) {
   for (int i=0 ; i<16 ; i += 2) {
      L ^= P[i];
      R ^= f(L);
      R ^= P[i+1];
      L ^= f(R);
   }
   L ^= P[16];
   R ^= P[17];
   swap (L, R);
}

这样。Blowfish的全部流程就结束了。

python解密脚本

可以使用crypto库进行加解密。

from Crypto.Cipher import Blowfish
key=b'input your key'
bf=Blowfish.new(key,Blowfish.MODE_ECB)
enc=b"input your enc"
print(bf.decrypt(enc))
参考:
https://www.cnblogs.com/flydean/p/14911114.html
https://cloud.tencent.com/developer/article/1836650

http://www.niftyadmin.cn/n/5290209.html

相关文章

黑客又出击了!泄露索尼SIE内部数据

黑客泄露数据显示索尼 SIE 未来有望加强第一方“中型游戏”开发&#xff0c;填补大成本 3A 制作周期空洞 12 月 25 日消息称&#xff0c;黑客团队 Rhysida 近日泄露了大量来自索尼游戏工作室“失眠组”&#xff08;Insomniac Games&#xff09;的内部数据&#xff0c;其中显示…

H.264宏块(Macroblock)概念(运动估计、变换编码、环路滤波)

参考文章&#xff1a;音视频高手课系列5-h264编码基础(宏块原理) 参考文章&#xff1a;切片slice与宏块&#xff0c;运动矢量 文章目录 使用videoEye分析视频宏块示例H.264宏块概念1. 宏块的定义2. 运动估计3. 变换编码4. 环路滤波5. 注意&#xff1a;宏块的概念既适用于帧内编…

python 1200例——【12】选择排序

选择排序是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。选择排序是不稳定的排序方法。 选择排序的求解方法如下: 首先在未排序序列中找到最小(或最大)元素,存放…

[GKCTF 2021]easynode

[GKCTF 2021]easynode 打开题目发现有登录框&#xff0c;那么我们先分析下如何登录 app.post(/login,function(req,res,next){let username req.body.username;let password req.body.password;safeQuery(username,password).then(result >{if(result[0]){const token …

【TensorFlow 精简版】TensorFlow Lite

目录 一 TensorFlow Lite简介 二 开发 三 开始使用 一 TensorFlow Lite简介 TensorFlow Lite 是一组工具&#xff0c;可帮助开发者在移动设备、嵌入式设备和 loT 设备上运行模型&#xff0c;以便实现设备端机器学习。 针对设备端的机器学习进行的优化&#xff1a; ① 延时&…

【Java 进阶篇】Jedis 操作 Set 与 SortedSet 详解

Redis 是一个强大的键值存储系统&#xff0c;而 Jedis 是 Redis 的 Java 客户端&#xff0c;为 Java 开发者提供了方便的操作接口。在这篇博客中&#xff0c;我们将深入探讨 Jedis 如何操作 Redis 中的 Set 和 SortedSet 数据结构。无论你是初学者还是有一些经验的开发者&#…

ASUS华硕ROG幻16 2023款GU603VU VV VI笔记本电脑原厂Win11.22H2系统

链接&#xff1a;https://pan.baidu.com/s/1AgevUZleCHBJgCBcIp5CFQ?pwdhjxy 提取码&#xff1a;hjxy 华硕笔记本2023款幻16原厂Windows11系统自带所有驱动、出厂主题壁纸、Office办公软件、MyASUS华硕电脑管家、Armoury Crate奥创控制中心等预装程序 文件格式&#xff1…

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用UserSet功能保存和载入相机的各类参数(C++)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用UserSet功能保存和载入相机的各类参数&#xff08;C&#xff09; Baumer工业相机Baumer工业相机NEOAPISDK中UserSet的技术背景代码案例分享第一步&#xff1a;保存相机当前参数设置UserSet_Save第二步&#xff1a;载入已经保存…