0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于M2加密算法深度解读

ADAS 来源:djl 作者:ADAS 2019-08-09 17:23 次阅读

这个加密类很容易实现和使用。如果你需要加密字符串,如密码、汽车牌号等,就可以使用这个个快捷、简单、安全的方式。只要不暴露加密 KEY, 就会很安全。建议KEY 的长度最少为 12 个包含大小写的字符。
使用代码

首先下载源代码,将其中的类插入你的命名空间。然后你可以初始化类的对象。
加密
以下代码块是如何使用 key 变量YourEncryptionKey 加密字符串变量 YourTextString 的简单例子。

M2encryption.Key = YourEncryptionKey;M2encryption objEncrypt = new M2encryption();objEncrypt.ClearTekst = YourTextString; objEncrypt.Encrypt(); if (objEncrypt.errorState != -2) { MessageBox.Show(objEncrypt.EncryptedTekst);}

在做进一步处理前检查属性 objEncrypt.errorState 有无错误
errorState-1:
这意味着加密的文本包含 ASCII 以外的字符。在加密前,这些字符被更改为 "?"
errorState-2:
没有提供加密 key。加密过程会中断。
解密:

M2encryption.Key = YourEncryptionKey;M2encryption objEncrypt = new M2encryption();objEncrypt.EncryptedTekst = YourTextString; objEncrypt.Decrypt(); if (objEncrypt.errorState != -2) { MessageBox.Show(objEncrypt.ClearTekst);}

随机化
将属性 Randomization 设置为 true,运行多次,同一个加密key 和平面文本会产生不同的加密文本

M2encryption.Randomization = true;

快捷模式
设置为Fastmode 模式会让加密/解密快捷,但是安全性会降低。如果你要加密小字符串,不应该启用该模式。如果加密很大的文件,可以。
注意,解密和加密的模式应该相同。

M2encryption.Fastmode = true;

算法的内部工作原理
外部循环和内部循环
算法包含外部和内部循环。外部循环迭代次数,内部循环迭代平面文本中每个字符。
自变异内部和外部 key
自变异内部key
此 key 在内部加密流程中使用。key 中每个字母都哟牛股加密平面文本中对应的位置。当 key 的字符串结束后,该流程会使用自变异的key 版本继续进行,直至所有平面文本都加密完。看图1 说明。子变异的内部 key 标记为蓝色。

基于M2加密算法深度解读

Fig1. 上述的key永远不会重复
自变异外部 key
用户输入key 后,自变异的外部key 会初始化。该key会用于外部循环并在每次开始自改变。该key的目的是为每轮生成唯一的映射矩阵并在这些轮中初始化自变异内部key。映射数组在内部循环中的加密流程中使用。
6 轮迭代的key 自变化的例子:

基于M2加密算法深度解读

函数 shuffleArr() 将自变异key作为输入。根据key, 它会在 arrayint[] 中得出类似随机顺序的映射数字。函数每次调用,key 就会自变异,从而创建出新的唯一映射数组。
函数 shuffleArr():

private void shuffleArr(int state){ int keyStep = 0; byte keyChar; bool emptyFound; int retning = 1; long refIndex = 1; double floatValue; int intPart; double fraPart; mutKey_o = selfMutateKey(mutKey_o, 3, state,1); for (int i = 0; i < 95; i++) map[i] = 0; //nulstil arr for (int i = 1; i < 96; i++) { if (retning == 1) retning = 0; else retning = 1; //håndter key if (keyStep > mutKey_o.Length - 1) keyStep = 0; keyChar = (byte)mutKey_o[keyStep]; refIndex = i + (int)keyChar; if (refIndex > 95) { if (refIndex - 95 <= 95) refIndex = refIndex - 95; else { floatValue = refIndex / 95.0; intPart = (int)floatValue; fraPart = floatValue - intPart; if (fraPart == 0.0) fraPart = 1.0; refIndex = Convert.ToInt32(95 * fraPart); } } refIndex--; //pga arr 0- 94 if (map[refIndex] == 0) map[refIndex] = i; else { emptyFound = false; do { if (retning == 1) { refIndex++; if (refIndex > 94) refIndex = 0; if (map[refIndex] == 0) { map[refIndex] = i; emptyFound = true; } } else { refIndex--; if (refIndex < 0) refIndex = 94; if (map[refIndex] == 0) { map[refIndex] = i; emptyFound = true; } } } while (emptyFound == false); } keyStep++; } for (int i = 0; i < 95; i++) { for (int k = 0; k < 95; k++) { if (map[k] == i + 1) { mapRev[i] = (k + 1); break; } } } }

内循环加密流程
Step 1:
整个文本都需要经过函数 chainChangeChars() 处理
文本会被从头到尾来回扫描,文本中每个字母都根据左边的相邻字符(在回来的时候根据右边的相邻字母)更改。如果一个字母更改,每个单独的字母也会随之更改。每个更改的字符会跟映射 arrayint[] 图重新映射。
这是我解决问题的公式:
示例文本 "ABCD"
A 是 B 的左边相邻字母

基于M2加密算法深度解读


在相反的流程中

基于M2加密算法深度解读

然后重新映射:
Y = map[X]
最后:
B 被替换为 Y
文本成为 "AYCD" (其中 Y 是个持有真正字母的变量)
原先的 B现在存储在 Y 内。可以通过 Y 和 A 还原
Step 2:
这个步骤是个流程的开始,会根据自变异的内部key 更改文本中每个字母,如图一所示。
首先生成一个种子。对于每个要更改的字母,下个文本的十进位 ascii 值会在 variabelseedC 中累计。看第一行代码:

seedC = seedC + (byte)Convert.ToChar(key[keyIndexC]);keyIndexC++; if (keyIndexC > lenKey - 1){ keyIndexC = 0; mutKey_i = selfMutateKey(key,2,1,2);}

Step 3:
生成引用索引号.
步骤 2 中的种子现在用作函数 createRefIndex() 的输入
在这个函数中,种子经过这个公式:
种子除以 95
将小数的整数部分更改为 0
结果乘以 95
代码如下:

refIndex = seed; if (refIndex > 95){ if (refIndex - 95 <= 95) refIndex = refIndex - 95; else { floatValue = refIndex / 95.0; intPart = (int)floatValue; fraPart = floatValue - intPart; if (fraPart == 0.0) fraPart = 1.0; refIndex = Convert.ToInt32(95 * fraPart); }}

得到的 refIndex 将总是一个 [1 - 95] 的整数。
Step 4:
在最后一个步骤中,字符更改为加密文本中的最终字符
字符的索引添加到 therefIndex-1
最后的结果通过 arrayint[] 图重新映射

tegnChanged = tegn + (refIndex - 1); if (tegnChanged > 95) tegnChanged = tegnChanged - 95;tegnChanged = map[tegnChanged - 1];

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 安全性
    +关注

    关注

    0

    文章

    89

    浏览量

    19061
  • 加密算法
    +关注

    关注

    0

    文章

    205

    浏览量

    25424
收藏 人收藏

    评论

    相关推荐

    汽车遥控加密算法

    本人在公司主要做国内整车厂的遥控器,主要是用keeloq,Hitag2 ,Hitag3 ,AES加密算法,想请教下论坛里的大牛,像奥迪,奔驰,宝马等豪车的遥控器用什么加密算法?
    发表于 02-17 21:04

    RSA加密算法

    哪位大神使用过labview实现过RSA加密算法,求指点。其中好像涉及到解二元一次方程,不知道有没有这一类控件或者vi支持这样的功能。
    发表于 08-22 11:07

    如何去实现DES加密算法

    DES算法的简单原理是什么?如何去实现DES加密算法
    发表于 04-26 07:14

    uid加密算法

    uid加密算法,1.STM32可以加密程序,不然可能有被窃取的可能JTAG 可以直接通过J-LINK-FLASH获取代码,首先新建工程,型号选好,read back即可save data fileUID加密函数,在我的链接里,一
    发表于 07-19 08:23

    DES加密算法是什么

    ,是要被加密或解密的数据,DES采用16轮运算,每轮产生一个轮密钥参与到运算中,密钥与明文运算时采用按位异或的方法(不仅仅是与密钥异或),但每一位存放的数据只有0或1,因此,DES的密钥空间仅仅只有2^56。2、3DES
    发表于 07-22 09:13

    对称加密算法是什么

    对称加密算法也叫私钥加密算法,其特征是收信方和发信方使用相同的密钥,即加密密钥和解密密钥是相同或等价的。非对称加密算法也叫公钥加密算法。其特
    发表于 07-22 07:09

    最强加密算法?AES加密算法的Matlab和Verilog实现 精选资料推荐

    目录背景AES加密的几种模式基本运算AES加密原理Matlab实现Verilog实现Testbench此文重点讲述了AES加密算法加密模式和原理,用MATLAB和Verilog进行加
    发表于 07-28 07:34

    软件加密算法都有哪些,这些算法在哪些方面得到了应用

    伴随着人工智能、物联网时代的到来,数据应用变得频繁起来,数据安全应该如何保护?软件加密算法都有哪些,这些算法在哪些方面得到了应用?慢慢读下去,你会发现围绕在我们身边的“小密码”。对称加密算法对称
    发表于 12-21 07:04

    浅谈对称加密算法与非对称密钥加密算法

    什么是对称密钥密码体制?对称密钥密码体制的缺点是什么?非对称加密算法又是什么?非对称加密算法的缺点是什么?
    发表于 12-23 06:05

    介绍一种有效的软件加密算法

    软件加密算法有何功能呢?如何对软件加密算法进行测试呢?
    发表于 01-20 07:31

    labview md5加密算法.llb

    md5加密算法 md5加密算法 md5加密算法 md5加密算法
    发表于 05-25 14:25 102次下载

    解读保护数据安全的八种软件加密算法

    对称加密算法是应用较早的加密算法,技术成熟。在对称加密算法中,数据发信方将明文(原始数据)和加密密钥一起经过特殊加密算法处理后,使其变成复杂
    的头像 发表于 11-28 10:18 9144次阅读
    <b class='flag-5'>解读</b>保护数据安全的八种软件<b class='flag-5'>加密算法</b>

    常见公钥加密算法有哪些

    RSA、ElGamal、背包算法、Rabin(Rabin的加密法可以说是RSA方法的特例)、Diffie-Hellman (D-H) 密钥交换协议中的公钥加密算法、Elliptic Curve
    发表于 12-10 09:41 4.3w次阅读

    详细解读Go加密解密算法

    本文介绍了常用的加密算法,并对这些加密算法结合实际 golang 代码段进行了详细解读。 前言 加密解密在实际开发中应用比较广泛,常用加解密分为:“对称式”、“非对称式”和”数字签名“
    的头像 发表于 07-29 17:37 2115次阅读

    Go常用的加密算法详细解读

    【导读】本文介绍了常用的加密算法,并对这些加密算法结合实际 golang 代码段进行了详细解读。 前言 加密解密在实际开发中应用比较广泛,常用加解密分为:“对称式”、“非对称式”和”数
    的头像 发表于 09-01 14:47 2586次阅读