加密程序(安全)

 

本文为自创文章

源码:https://codeload.github.com/Tanxiangzhong/jiami/zip/refs/heads/mainicon-default.png?t=N7T8https://codeload.github.com/Tanxiangzhong/jiami/zip/refs/heads/main

下载:(github.com)icon-default.png?t=N7T8https://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算法具有加密速度快、紧凑、密钥长度可变、可免费使用等特点,已被广泛使用于众多加密软件。

  1. 中文名
  2. Blowfish算法
  3. 分    类
  4. 对称密钥分组加密算法
  5. 提出者
  6. Bruce Schneier
  7. 提出时间
  8. 1993年11月
  9. Blowfish算法是一种对称的分组加密算法,算法核心在于子密钥生成,它将变长密钥扩展成总长4168 Byte的子密钥数组。算法中使用了大量的子密钥,而子密钥又依赖于用户密钥,实际加/解密过程中使用的是更新后的子密钥数组,子密钥即P数组和S盒。Blowfish算法有一个核心加密函数:BF_En(),该函数的输人是64位明文信息,经过运算,以64位密文信息的形式输出。用Blowfish算法加密信息,需要两个过程:密钥预处理和信息加密。同样,解密亦需要两个过程,密钥预处理和信息解密。
  10. Blowfish算法的源密钥——pbox和sbox是固定的,而我们要加密一个信息,需要自己选择一个key,用这个key对pbox和sbox进行变换,得到下一步信息加密所要用的key_pbox和key_sbox。解密亦是如此,由于Blowfish是对称加密算法,解密方在得到key后根据key生成解密所需的key_box和key_sbox。对同一个信息加密解密,选取的key的不同会导致密文的不同。因此,Blowfish算法的关键在于key的选择以及保密。
  11. 由于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,我们就可以真正的对要加密的文件进行加密操作了。

用个伪代码来表示整个流程:  

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);
}

  // ...
  // initializing the P-array and S-boxes with values derived from pi; omitted in the example
  // ...
{
   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;
      }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值