-
-
[原创]一种专为硬件设计的加密算法[1]——MYF4
-
2017-3-16 17:10 4500
-
该算法专门为硬件设计,其特点是
1、硬件实现速度快。
2、简单,故可靠。能以文字的形式精确描述。
下边先用文字描述一下该算法。
该算法为分组算法,分组长度为64位、128位、256位、512位、1024位和2048位六级。
一次完整的加密过程进行8轮循环。
每一轮循环分为映射、换位[bit]、字节换位三步。
下边描述一下一轮算法的过程。
一、映射
映射操作,是把输入明文的每一个字节,按映射表换成另外一个值
映射表由密钥生成,共生成8份映射表,每轮的映射使用一份
二、换位[bit]
把映射后的数据,按64位[8字节]进行分组,在各组内:
把第M字节的第N位,换到第N字节的第M位
三、字节换位
把换位后的数据,按字节换位表,把每个字节调换了新的位置上去。
换位表由密钥生成,共生成8份换位表,每轮的换位使用一份
映射表与换位表的生成方式:
映射表是以密钥为原始变量,以MYF3经8轮运算而成的,每轮运算生成一份映射表
换位表是以密钥为原始变量,以仿RC4算法经8轮运算面成的,每轮运算生成一份换位表
以下的算法的完整VB源码,可直接运行,有兴起的同学,可以尝试改编成C代码,这样会更快
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
Dim Sbox4_1() As Byte 'MYF4 映射表
Dim Sbox4_2() As Byte 'MYF4 反映射表
Dim Sbox4_3() As Byte 'MYF4 换位表
'是否已经装载了密钥的标志
Dim State_4x64 As Boolean
Dim State_4x128 As Boolean
Dim State_4x256 As Boolean
Dim State_4x512 As Boolean
Dim State_4x1024 As Boolean
Dim State_4x2048 As Boolean
Public Function MYF4(SS() As Byte, BL As Boolean) As Byte() ' 加密模块 T加密 F解密
Dim S() As Byte
Dim I As Integer
DoEvents
ReDim S(0)
I = UBound(SS)
If (I <> 7) And (I <> 15) And (I <> 31) And (I <> 63) And (I <> 127) And (I <> 255) Then MYF4 = S: Exit Function '检查输入数据的格式是否正确
If (I = 7) And (State_4x64 = False) Then MYF4 = S: Exit Function '检查输入数据,与已经装载的密钥,两者间是否匹配
If (I = 15) And (State_4x128 = False) Then MYF4 = S: Exit Function '检查输入数据,与已经装载的密钥,两者间是否匹配
If (I = 31) And (State_4x256 = False) Then MYF4 = S: Exit Function '检查输入数据,与已经装载的密钥,两者间是否匹配
If (I = 63) And (State_4x512 = False) Then MYF4 = S: Exit Function '检查输入数据,与已经装载的密钥,两者间是否匹配
If (I = 127) And (State_4x1024 = False) Then MYF4 = S: Exit Function '检查输入数据,与已经装载的密钥,两者间是否匹配
If (I = 255) And (State_4x2048 = False) Then MYF4 = S: Exit Function '检查输入数据,与已经装载的密钥,两者间是否匹配
'---------------------------------------------------------------------------
S = SS
If BL Then '加密
For I = 0 To 7
S = Byte2Byte(S, I, True) '映射
S = BitChange(S) '换“位”
S = ByteChange(S, I, True) '字节换位重排
Next
Else '解密
For I = 7 To 0 Step -1
S = ByteChange(S, I, False) '字节换位重排
S = BitChange(S) '换“位”
S = Byte2Byte(S, I, False) '映射
Next
End If
MYF4 = S
End Function
Public Sub MYF4_KeyFormat(Key() As Byte) '将MYF4的密钥格式化,换句话,就是装载密钥
Dim K1() As Byte
Dim K2() As Byte
Dim I As Single
Dim J As Single
Dim L As Single
Dim X As Single
MYF4_KeyUnFormat '先卸载密钥,再载入密钥,以免前后两次装载的密钥冲突出错
I = UBound(Key)
If (I <> 7) And (I <> 15) And (I <> 31) And (I <> 63) And (I <> 127) And (I <> 255) Then Exit Sub '密钥长度限64、128、256、512、1024、2048这六种
ReDim Sbox4_1(7, 255)
ReDim Sbox4_2(7, 255)
ReDim Sbox4_3(7, I)
K2 = Key
'---------------------------------------------------------------------------
J = 0
ReDim K1(255)
For I = 0 To 255
K1(I) = I
Next
For X = 0 To 7
For I = 0 To 255 '这一段是RC4--------为了美感,与MYF3保持一致,多加了一个I------------------------------------
J = (I + J + K1(I) + K2(I And UBound(Key))) And 255
L = K1(I)
K1(I) = K1(J)
K1(J) = L
Next '这一段是RC4--------为了美感,与MYF3保持一致,多加了一个I------------------------------------
For I = 0 To 255
Sbox4_1(X, I) = K1(I) '将根据密钥产生的“乱数”装入S盒子,这个是映射表
Sbox4_2(X, K1(I)) = I '将根据密钥产生的“乱数”装入S盒子,这个是反映射表
Next
Next
'---------------------------------------------------------------------------
J = 0
ReDim K1(UBound(Key))
For I = 0 To UBound(Key)
K1(I) = I
Next
For X = 0 To 7
For I = 0 To UBound(Key) '这一段是RC4的变形--------为了美感,与MYF3保持一致,多加了一个I------------------------------------
J = (I + J + K1(I) + K2(I)) And UBound(Key)
L = K1(I)
K1(I) = K1(J)
K1(J) = L
Next '这一段是RC4的变形--------为了美感,与MYF3保持一致,多加了一个I------------------------------------
For I = 0 To UBound(Key)
Sbox4_3(X, I) = K1(I) '将根据密钥产生的“乱数”装入S盒子,这个是换位表
Next
Next
'---------------------------------------------------------------------------
I = UBound(Key)
If I = 7 Then State_4x64 = True
If I = 15 Then State_4x128 = True
If I = 31 Then State_4x256 = True
If I = 63 Then State_4x512 = True
If I = 127 Then State_4x1024 = True
If I = 255 Then State_4x2048 = True
End Sub
Public Sub MYF4_KeyUnFormat() '卸载密钥
State_4x64 = False
State_4x128 = False
State_4x256 = False
State_4x512 = False
State_4x1024 = False
State_4x2048 = False
ReDim Sbox4_1(0, 0)
ReDim Sbox4_2(0, 0)
ReDim Sbox4_3(0, 0)
End Sub
'以下是MYF4的部件:映射、换“位”[比特换位]、字节换位
Private Function Byte2Byte(S() As Byte, X As Integer, BL As Boolean) As Byte() ' 字节映射
'将每个字节按照映射表,映射为另外一个字节
'BL 真加密 假解密
'X为映射的轮次
Dim B() As Byte
Dim I As Single
ReDim B(UBound(S))
If BL Then '加密
For I = 0 To UBound(S)
B(I) = Sbox4_1(X, S(I)) '加密时,根据映射表,把B1当中的数值,换为Sbox4_1中的另外一个数值 注意:8轮当中,每一轮的映射表都是不同的
Next
Else '解密
For I = 0 To UBound(S)
B(I) = Sbox4_2(X, S(I)) '解密时,根据映射表,把B1当中的数值,换为Sbox4_2中的另外一个数值,这个映射表与加密时的Sbox4_1是相反互逆的
Next
End If
Byte2Byte = B
End Function
Private Function BitChange(S() As Byte) As Byte() ' 比特交换模块
'以8字节为一小组,对“位”进行调换重排
'把第M个字节的第N位与第N字节的第M位交换
Dim B() As Byte
Dim B1(7) As Byte
Dim B2() As Byte
Dim I As Single
Dim M As Single
Dim N As Single
B = S
For I = 0 To UBound(S) \ 8
CopyMemory B1(0), B(I * 8), 8
ReDim B2(7)
For M = 0 To 7
For N = 0 To 7
If B1(M) And 2 ^ N Then B2(N) = B2(N) Xor 2 ^ M '把第M字节的第N位,换到第N字节的第M位
Next
Next
CopyMemory B(I * 8), B2(0), 8
Next
BitChange = B
End Function
Private Function ByteChange(S() As Byte, X As Integer, BL As Boolean) As Byte() ' 字节交换模块
'对全部的字节,进行换位重排
'BL 真加密 假解密
'X为换位的轮次
Dim B() As Byte
Dim M As Single
Dim N As Single
ReDim B(UBound(S))
If BL Then '加密
For M = 0 To UBound(S)
B(M) = S(Sbox4_3(X, M)) '根据换位表,把B字节组当中的每个字节,调换一下“座位”,8轮换位的每一轮都使用不同的换位表
Next
Else '解密
For M = 0 To UBound(S)
B(Sbox4_3(X, M)) = S(M) '根据换位表,把B字节组当中的数据,调换一个“座位”,与加密时的换位正好是互逆的,即把换过的位置换回来
Next
End If
ByteChange = B
End Function
[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。