BlowFish加解密原理与代码实现

一丶简介

​ BlowFish 是一个对称加密的加密算法。由 Bruce Schneier,1993年设计的。是一个免费自由使用的加密算法。

了解的必要知识

  • BlowFish是一个对称区块加密算法。每次加密数据为 64位 (2个int)类型数据大小。八个字节
  • BlowFish 密钥采用32-448位
  • BlowFish是由一个16轮循环的Feistel结构进行加密的。

二丶原理与代码介绍

2.1 BlowFish算法流程

BlowFish 算法流程是由两部分组成 分别是密钥扩展以及数据加密

在数据加密中是一个16轮循环的Feistel网络。每一轮由一个密钥相关置换和一个密钥与数据相关的替换组成的。

先说一下BlowFish需要的子密钥。

BlowFish在加密或者初始化的过程中会使用两个盒来进行加密

分别是PBOX 以及SBOX

PBOX是 由18个32位的字的子密钥组成的。这些密钥可以通过预计算产生的。

其中PBOX记录的就是Π后面的小数位。转换成16进制存储到pBox中

例如:

关于数学中Π大家应该知道。这里不再累赘。关于如何计算Π后面的小数位以及将小数位转为十六进制存储到p[0]---p[18] 这里也不再赘述。 因为这些都是预计算好的。我们直接使用就可以。

关于小数转为16进制可以使用网站进行转换(不确保以后还能否使用):小数转换16进制

例子如下:

Sbox跟PBOX一样也是Π的小数位组成。sBox是4组8*32的数组。 如下

pBox与Sbox就是BlowFish算法进行加密的核心置换表

2.2 子密钥生成

​ 如果想进行数据加密。那么我们就要进行子密钥生成。也就是要将我们的Key 与 pbox进行 异或

那么说一下流程吧

  • 1.按顺序使用Π的小数部分初始化pbox与sbox (预先计算好了可以直接使用)

  • 2.使用key参数得出key_pbox, 具体流程为 将pbox中的数据 与 key进行 ^ 然后设置到key_pbox中,轮询key每次取出四个字节来与pbox[i]进行 异或

    如果Key不足的情况下 key从零开始补齐4个字节 继续与pbox[i]进行异或

    例子:

  • 3.使用当前的key_pbox数组 与s_box数组对一个64位0数据进行加密。 也就是 两个int 类型数据 8个字节 输出的结果 重新修改到key_pbox 与 key_sbox中。

    key_sbox就是当前的 使用s_box对64位数据进行加密,产生的输出修改的key_sbox中。

  • 一直循环直到修改完key_pbox与key_sbox为止

示例代码如下:

2.3 加密原理

​ BlowFish加密很简单。就是 将一个数 拆分为 左右各32位数值 (也就是 8个字节 左边四个字节,右边四个字节) 然后 左边进行 ^ key_pbox 当作下一次循环的右边。 右边 则是 右边 ^ F(左边) 下次当作循环的左边。

循环16轮。

说着挺难。看下图:

简单的加密流程图:

在这里我们只看加密

这里不得不介绍下F函数。 F函数的输入是一个32位数 也就是四个字节类型数据。 然后内部就是将32位数进行拆分成abcd

例如:

拆分后的a b c d然后去Key_sbox中查表 然后取出对应的值。

公式如下:

F函数明白了那么回头继续看一下加密操作。

图如下:

可以看到 首先计算 L ^Kr(Key_pbox[i]) 然后结果直接作为下一轮的右侧

右侧则是 经过论函数F 进行设置的。 最后变为下一轮循环的左侧。

R = R ^F(L)

最后一轮的话需要单独设置

其实加密函数就是循环16次。 然后每一轮都对 左侧32位 右侧32位进行操作。 操作之后直接作为下一轮循环的左右侧

核心代码如下:

至此我们的blowFish加密已经完成

2.4 BlowFish的解密

​ 解密与加密是相反操作。 加密的时候是从0开始遍历16轮 然后依次对xl xr进行操作。

解密的时候做事从16开始然后迭代16轮 对左右两侧做操作

最后16轮循环完毕之后还是进行一次^

代码如下:

至此解密完成

2.5.完成代码

经过测试加解密输出结果是对的。

参考链接


BlowFish加解密原理与代码实现

KiCad-V8.0.7制作收音机中周(中频变压器)封装

前置条件

  • macOS Sequoia (15.2) 
  • MacBook Pro 2023-Apple M2 Pro (4能效核、8性能核、32GB内存、2TB磁盘)
  • OpenSCAD 2024.12.13 (或更高版本)
  • FreeCAD 1.0.0 (或更高版本)
  • KiCad 8.0.7 (或更高版本)

由于 KiCad 缺少国产零件的封装,所以部分封装库我们需要自己创建。

继续阅读KiCad-V8.0.7制作收音机中周(中频变压器)封装

Flutter Web 调试问题: Assertion Failed on Text Input Click in Chrome (Flutter 3.27.0, Dart 3.6.0)

前置条件

  • Flutter 版本: 3.27.0 / 3.27.1
  • Dart 版本: 3.6.0
  • 编译器: Android Studio Ladybug | 2024.2.1 Patch 3
  • 操作系统: macOS Sequoia 15.2 (Apple M2) / Windows 11 专业版 23H2
  • 浏览器: Chrome (131.0.6778.205)

问题描述

直接从 Flutter API 官方页面(Form Class Documentation)复制 Form 示例,并使用 Flutter 的 Web 调试模式运行。

尝试用鼠标单击文本输入时,遇到以下错误:

这个问题是 Flutter 3.27.0 / 3.27.1 的缺陷,官方已经在 Flutter 3.28 版本修复,后续升级到 Flutter 3.28 即可解决此问题。

目前(2024/12/23master 通道已经修复这个问题,可以通过切换到 master 通道来解决:

参考链接


启动C:\Windows\System32\logiLDA.DLL时出现问题,找不到指定模块

Windows 11 每次开机都会弹出下图所示的信息:

经过查找是罗技鼠标驱动的问题,驱动卸载之后,系统重启还是会弹对话框。

具体做法是:

1. 运行、输入 regedit

2. 找到 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run 目录下的 Logitech Download Assistant

3. 右键删除即可

参考链接


Windows 11 Version 21H2 更新提示 “你的设备缺少重要的安全更新。”

最近 (2024/12/24) 家里的电脑在 Windows 更新界面提示 “你的设备缺少重要的安全更新。请确保设备保持打开状态并接通电源,以便更新可以完成。”

如下图:

不管如何点击刷新重试,都会出现上述提示。

系统版本为 Windows 11 Version 21H2,详细信息参考下图:

原因为 Windows 11 Version 21H2 已经在 2023/10/10 终止服务,所以已经无法更新系统补丁。如下图:

解决方法就是安装依旧提供支持的系统版本 Windows 11 Version 23H2 或者 Windows 11 Version 24H2

需要注意的是,升级到  24H2 无法保留已经安装的软件,因此当前 (2024/12/24) 只能升级到 23H2  。

对于不支持的硬件进行升级安装,可以通过 Rufus 写入到 U盘后,不重启电脑,直接点击 U 盘上的安装文件进行安装,可以正常完成系统升级。

如下图:

点击开始会弹出如下信息,保持信息不变即可,如下图:

参考链接


OpenSCAD圆角矩形

OpenSCAD实现圆角矩形,可以参考如下代码:

参考链接


Way to round edges of objects opensCAD

Could not find a command named "/data/Android/flutter/bin/cache/dart-sdk/bin/snapshots/frontend_server.dart.snapshot"

经过多次的 Flutter 版本升级,以前的老项目脚本在执行 flutter pub get 相关的命令时候报错如下:

解决方法为删除项目下的所有 pubspec.lock 文件即可。

参考链接


Flutter 错误:找不到名为 frontend_server.dart.snapshot 的命令

Caught error: Unsupported operation: Platform._operatingSystem

Flutter 代码运行在 Chrome 上的时候报错 “Caught error: Unsupported operation: Platform._operatingSystem”。

报错的原因是因为代码中使用了 Platform.isIOSPlatform.isAndroid 等函数判断系统类型,可惜的是,这些函数并不能在 Chrome 上运行。 

修改方法就是自己封装一个自定义工具类,先使用 kIsWeb 排除一下浏览器。参考如下:

参考链接


Flutter Web 警告 Local variable for "serviceWorkerVersion" is deprecated

升级到 Flutter 3.22.0 之后,在 Chrome 上运行 Flutter Web 应用程序时收到以下警告:

这个警告的原因是,新版本的 Flutter Web 应用加载 service_worker.js 的方式发生了变化,原来的加载脚本被 {{flutter_bootstrap_js}} 替代。

调整为新的初始化代码即可解决此问题。

原始的代码如下:

调整后的代码如下:

参考链接