看雪论坛
发新帖

[原创]一种专为硬件设计的加密算法[1]——MYF4

贸易飞 2017-3-16 17:10 388

该算法专门为硬件设计,其特点是

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








本主题帖已收到 0 次赞赏,累计¥0.00
最新回复 (0)
返回



©2000-2017 看雪学院 | Based on Xiuno BBS | 知道创宇带宽支持 | 微信公众号:ikanxue
Time: 0.011, SQL: 8 / 京ICP备10040895号-17