65.9K
CodeProject 正在变化。 阅读更多。
Home

使用此简单的 M3 算法在 C# 中加密文本,文本加密变得简单

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.69/5 (46投票s)

2015 年 7 月 20 日

CPOL

5分钟阅读

viewsIcon

115332

downloadIcon

2102

基于密钥自变异的加密算法。完整的源代码和示例。

引言

您无需成为加密专家即可使用这种易于实现的对称加密算法在 C# 中加密您的文本。该算法本身非常复杂且安全,但使用起来却非常简单。

Using the Code

将下载源代码中的类插入到您的命名空间中,您就可以实例化该类的对象了。

加密

下面的代码块是一个简短的示例,演示了如何使用加密密钥变量 YourEncryptionKey 加密字符串变量 YourTextString

M3encryption.Key = YourEncryptionKey;
M3encryption objEncrypt = new M3encryption();
objEncrypt.ClearTekst = YourTextString; 
objEncrypt.Encrypt();
if (objEncrypt.errorState > -1) {       
    MessageBox.Show(objEncrypt.EncryptedTekst);
}

在您的代码中继续之前,请检查 objEncrypt.errorState 属性以了解错误。

errorState -1:

这意味着加密的文本包含超出 UTF-16 范围的字符。在加密之前,这些字符在明文中已更改为“?”。

errorState -2:

未提供加密密钥。加密过程已中止。

解密

M3encryption.Key = YourEncryptionKey;
M3encryption objEncrypt = new M3encryption();
objEncrypt.EncryptedTekst = YourTextString; 
objEncrypt.Decrypt();
if (objEncrypt.errorState > -1) {       
    MessageBox.Show(objEncrypt.ClearTekst);
}

随机化

将属性 Randomization 设置为 true 将在多次运行时,使用相同的密钥和明文产生不同的密文。

Randomization = false 是默认值。

M3encryption.Randomization = true;

快速模式

将属性 Fastmode 设置为 true 将使加密/解密过程更快,但安全性稍低。如果您加密的是像密码、卡号等短字符串,则不应使用快速模式,但如果您加密的是多页文档等长文本,则应使用快速模式。

Fastmode = false 是默认值。

注意!解密应以加密时的相同模式进行。

M3encryption.Fastmode = true;

算法的内部工作原理

左键单击 gadget 并拖动以移动它。左键单击 gadget 的右下角并拖动以调整其大小。右键单击 gadget 以访问其属性。

该算法的基本原理是基于密钥自变异的字符重映射。

密钥的生命周期等于密钥的长度。这意味着任何密钥状态只负责加密长度等于该版本密钥长度的明文部分,然后密钥会自变异成新版本。新版本将加密下一个明文部分,依此类推。

在整个过程中,您有一个由用户输入的明文密钥,它被分流到 4 个独立的“线程”中,每个线程都有不同且不断自变异的密钥。这 4 个不同的密钥负责通过 2 种不同的方法(数组重映射和一种动态的“替换密码”)同时将明文字母逐个转换为密文。整个过程会重复多次,在最终确定密文之前,会对所有内容进行多次重新加密。

潜在攻击者试图逆转该过程将需要同时向后推导 4 个不同密钥的最终状态,一次一个变异版本。由于其中 2 个密钥用于数组重映射,因此需要将这些密钥的整个字母集解码成明文。

引导过程

由于该算法使用自变异密钥,因此需要引导过程来安全地初始化明文密钥的第一次加密。这有点像“鸡生蛋还是蛋生鸡”的问题,要加密密钥,就需要一个由加密密钥生成的映射数组,但没有映射数组就无法加密密钥。或者,映射数组可以由明文密钥生成,也可以由静态硬编码的数组生成,但这会稍微降低安全性。

引导过程包含以下 4 个步骤:

  1. 将由明文密钥生成一个映射数组
  2. 明文密钥将由映射数组加密
  3. 将由新加密的密钥生成一个新的映射数组
  4. 将由新创建的映射数组加密一个新的密钥

最终结果将是一个由映射数组加密的密钥,该映射数组由加密密钥生成,还有一个用于加密密钥的映射数组,该映射数组由一个“未知”的加密密钥生成。

但这只是密钥的初始加密,在整个加密过程中,密钥会自变异多次。用于“自变异内部密钥”的映射数组同样会在生成最终密文之前被多次重新创建。

外层和内层循环

该算法由一个外层循环和一个内层循环组成。外层循环迭代轮数,内层循环一次一个字符地迭代整个明文。

自变异的外层和内层密钥

自变异的内层密钥

此密钥用于内层加密过程中的加密。密钥中的每个字母都用于加密明文中相应位置的字母。当密钥到达其字符串末尾时,过程将继续使用密钥的新变异版本。此过程将持续到整个明文字符串被加密。有关此过程的说明,请参见下面的图 1。自变异的内层密钥用蓝色标记。

Click to enlarge image

图 1。在上图所示的示例中,密钥模式在整个加密过程中将永远不会重复。

自变异的外层密钥

自变异的外层密钥由用户输入的密钥初始化。此密钥在外层循环中使用,并在每轮开始时进行自变异。该密钥的目的是为每轮生成一个唯一的映射数组,并在这些轮中初始化自变异的内层密钥。映射数组用于内层循环中的加密过程。

密钥在 6 轮迭代中自变异的示例

用户输入的密钥 xxxxxxxxxxxx
第 1 轮 xX7IOiI:Ie7N
第 2 轮 &8Xy4@obt $_W
第 3 轮 3cj`#sie391_?&
第 4 轮 +sp=VGjHV>~tQ|C
第 5 轮 J_fe2brc'3Rguxt^
第 6 轮 T2MV)X!CXV"2sUp{d

历史

  • 2015 年 12 月 20 日:初始版本
© . All rights reserved.