加密步伐(安全)

[复制链接]
发表于 2026-1-24 01:33:39 | 显示全部楼层 |阅读模式
 

本文为自创文章
源码:https://codeload.github.com/Tanxiangzhong/jiami/zip/refs/heads/main
https://codeload.github.com/Tanxiangzhong/jiami/zip/refs/heads/main

下载:(github.com)
https://github.com/Tanxiangzhong/jiami?tab=readme-ov-file



媒介
嘿,各人好!在这个数字信息满天飞的期间,你是不是常常担心自己的小秘密大概紧张文件被非法分子窥伺?别担心,我为各人带来了一款全新的加密软件!
说实话,我自己也是个数字期间的“小透明”,深知在网络天下里掩护隐私有多紧张。以是,我决文定主动手,用我学到的技能和热情,打造这款简朴易懂、安全可靠的加密软件。
这款软件,不须要你是技能大神,也能轻松上手。我们接纳了超酷的加密算法,让你的数据就像被装进了保险箱,纵然是最锋利的黑客也难以破解。而且,我们还特意筹划了轻巧的界面和流通的使用,让你在掩护数据的同时,也能享受使用的兴趣。
固然啦,我也明白,安全这事儿不能马虎。以是,我们软件团队但是日夜兼程,不绝测试、优化,确保每一个细节都做到最好。我们就是要让这款加密软件成为你数字天下里的“保卫神”,让你的数据安全无忧!
末了,我想说,这款加密软件不光仅是一个工具,它更是我们团队对各人的一份心意。我们盼望通过它,让每个人都能享受到数字期间的便利,同时也可以或许掩护好自己的隐私和安全。以是,快来试试吧,让我们一起打造一个更加安全、更加风趣的数字天下吧!


本文使用:python      3.10      v11(python3.11)






这次先容的加密算法为Blowfish。它的有点很显着:
名称
数据巨细(MB)
时间(s)
匀称速率MB/S
评价
DES
256
10.5
22.5

3DES
256
12
12

AES(256-bit)
256
5
51.2

Blowfish
256
3.7
64


加快率快、安全性高。原理如下:
Blowfish算法是一个64位分组及可变密钥长度的对称密钥分组暗码算法,可用来加密64比专长度的字符串。32位处理惩罚器诞生后,Blowfish算法因其在加密速率上逾越了DES而引起人们的关注。Blowfish算法具有加密速率快、紧凑、密钥长度可变、可免费使用等特点,已被广泛使用于浩繁加密软件。

  • 中文名
  • Blowfish算法
  • 分    类
  • 对称密钥分组加密算法
  • 提出者
  • Bruce Schneier
  • 提出时间
  • 1993年11月
  • Blowfish算法是一种对称的分组加密算法,算法焦点在于子密钥天生,它将变长密钥扩展成总长4168 Byte的子密钥数组。算法中使用了大量的子密钥,而子密钥又依靠于用户密钥,实际加/解密过程中使用的是更新后的子密钥数组,子密钥即P数组和S盒。Blowfish算法有一个焦点加密函数:BF_En(),该函数的输人是64位明文信息,颠末运算,以64位密文信息的情势输出。用Blowfish算法加密信息,须要两个过程:密钥预处理惩罚和信息加密。同样,解密亦须要两个过程,密钥预处理惩罚和信息解密。
  • Blowfish算法的源密钥——pbox和sbox是固定的,而我们要加密一个信息,须要自己选择一个key,用这个key对pbox和sbox举行变更,得到下一步信息加密所要用的key_pbox和key_sbox。解密亦是云云,由于Blowfish是对称加密算法,解密方在得到key后根据key天生解密所需的key_box和key_sbox。对同一个信息加密解密,选取的key的差别会导致密文的差别。因此,Blowfish算法的关键在于key的选择以及保密。
  • 由于Blowfish算法接纳变长密钥,这在给用户带来极大便利的同时也有隐患。由于算法加/解密焦点在于密钥的选择和保密,但在实际应用中常常使用一些弱密钥对信息资源举行加密,导致存在着很大的安全隐患。以是,他并不是特别安全
而且,它的布局比力特别:
blowfish和DES一样,使用的是feistel暗码来举行分组加密。blowfish的分组块巨细是64bits,可变密钥长度可以从32bits到448bits不等。
blowfish须要举行16轮的feistel加密使用,我们先从下图大抵感受一下blowfish算法的加密流程:

大概的流程就是将P(原始数据)分成左右两部分,先拿左边的部分和Kr 做异或使用,得出的结果调用F函数,末了将F函数的输出结果和右半部分举行异或使用。
变更左右部分的位置,继承举行如许的使用,统共举行16轮就得到了终极的加密结果。
各人可以看到整个加密过程中最紧张的两个变量就是Kr 和 F函数。

密钥数组和S-box

密钥数组

从图上我们可以看到,Kr 的范围是从K1 到 K18 。统共有18个密钥构成的数组。 每个密钥的长度是32位。
我们来看一下密钥数组是怎么天生的。
起首我们使用随机数来对密钥数组举行初始化。怎么才气天生一个充足随机的32位数字呢?
一个很常用的方法就是使用常量π的小数部分,将其转换成为16净值,如下所示:
K1 = 0x76a301d3
K2 = 0xbc452aef
...
K18 = 0xd7acc4a5
还记得blowfish的可变密钥的长度吗?是从32bits到448bits,也就是从1到14个32位的数字。我们用Pi来体现,那么就是从P1到P14统共14个可变密钥。
接下来我们须要使用K和P举行使用,从而天生终极的K数组。
我们使用K1和P1举行异或使用,K2和P2举行异或使用,不绝到K14和P14。
由于P只有14个值,而K有18个值,以是接下来我们须要重复使用P的值,也就是K15和P1举行异或,K16和P2举行异或,直到K18和P4。
将异或之后的值作为新的K数组的值。
如今我们得到了一个新的K数组。
   留意,这个K数组并不是终极的数组,我们接下来看。
  S-box

在天生终极的P数组之前,我们还要先容一个概念叫做S-box。
在暗码学中,s-box的全称是substitution-box,也就是一个更换盒子,可以将输入更换成差别的输出。
S-box 吸收 n个bits的输入,然后将其转换成m个bits的输出。
这里n和m可以是不等的。
我们看一下DES中S-box的例子:

上面的S-box将6-bits的输入转换成为4-bits的输出。
S-box可以是固定的,也可以是动态的。好比,在DES中S-box就是静态的,而在Blowfish和Twofish中S-box就是动态天生的。
Blowfish算法中的F函数须要用到4个S-box,F函数的输入是32bits,起首将32bits分成4份,也就是4个8bits。
S-box的作用就是将8bits转换成为32bits。
我们再详细看一下F函数的工作流程:

S-box天生的值会举行相加,然后举行异或使用。终极得到终极的32bits。
S-box的初始值也可以跟K数组一样,使用常量π的小数部分来初始化。
天生终极的K数组

在上面两节,我们天生了初始化的K数组和S-box。
blowfish以为如许还不敷安全,不敷随机。
我们还须要举行一些使用来天生终极的K数组。
起首我们取一个全为0的64bits,然后K数组和S-box,应用blowfish算法,天生一个64bits。
将这个64bits分成两部分,分别作为新的K1 和 K2。
然后将这个64bits作为输入,再次调用blowfish算法,作为新的K3 和 K4。
依次类推,终极天生全部K数组中的元素。
4个S-box的数组也按照上面的流程来举行天生。从而得到终极的S-box。

(重点:它将变长密钥扩展成总长4168 Byte的子密钥数组。 算法中使用了大量的子密钥,而子密钥又依靠于用户密钥,实际加/解密过程中使用的是更新后的子密钥数组,子密钥即P数组和S盒。)

blowfish

有了终极的K数组和S-box,我们就可以真正的对要加密的文件举行加密使用了。
用个伪代码来体现整个流程:  
  1. uint32_t P[18];
  2. uint32_t S[4][256];
  3. uint32_t f (uint32_t x) {
  4.    uint32_t h = S[0][x >> 24] + S[1][x >> 16 & 0xff];
  5.    return ( h ^ S[2][x >> 8 & 0xff] ) + S[3][x & 0xff];
  6. }
  7. void encrypt (uint32_t & L, uint32_t & R) {
  8.    for (int i=0 ; i<16 ; i += 2) {
  9.       L ^= P[i];
  10.       R ^= f(L);
  11.       R ^= P[i+1];
  12.       L ^= f(R);
  13.    }
  14.    L ^= P[16];
  15.    R ^= P[17];
  16.    swap (L, R);
  17. }
  18. void decrypt (uint32_t & L, uint32_t & R) {
  19.    for (int i=16 ; i > 0 ; i -= 2) {
  20.       L ^= P[i+1];
  21.       R ^= f(L);
  22.       R ^= P[i];
  23.       L ^= f(R);
  24.    }
  25.    L ^= P[1];
  26.    R ^= P[0];
  27.    swap (L, R);
  28. }
  29.   // ...
  30.   // initializing the P-array and S-boxes with values derived from pi; omitted in the example
  31.   // ...
  32. {
  33.    for (int i=0 ; i<18 ; ++i)
  34.       P[i] ^= key[i % keylen];
  35.    uint32_t L = 0, R = 0;
  36.    for (int i=0 ; i<18 ; i+=2) {
  37.       encrypt (L, R);
  38.       P[i] = L; P[i+1] = R;
  39.    }
  40.    for (int i=0 ; i<4 ; ++i)
  41.       for (int j=0 ; j<256; j+=2) {
  42.          encrypt (L, R);
  43.          S[i][j] = L; S[i][j+1] = R;
  44.       }
  45. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表