一个Base64编码解码的代码(未完成)

博主对网上多数不支持中文的编码解码进行修改,实现了支持中文的解码,编码部分尚未完成。文中给出了多个函数代码,包括生成密钥、欧拉函数计算、乘法计算、素数判断、Base64编码解码等函数。

从网上找的多数不支持中文的编码解码,做了一下修改,支持中文的解码,编码还没有完成。

Public key(1 To 3) As Long
Private Const base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"

Public Sub GenKey()
    Dim d As Long, phi As Long, e As Long
    Dim m As Long, x As Long, q As Long
    Dim p As Long
    Randomize
    On Error GoTo top
top:
    p = Rnd * 1000 / 1
    If IsPrime(p) = False Then GoTo top
Sel_q:
    q = Rnd * 1000 / 1
    If IsPrime(q) = False Then GoTo Sel_q
    n = p * q / 1
    phi = (p - 1) * (q - 1) / 1
    d = Rnd * n / 1
    If d = 0 Or n = 0 Or d = 1 Then GoTo top
    e = Euler(phi, d)
    If e = 0 Or e = 1 Then GoTo top
   
    x = Mult(255, e, n)
    If Not Mult(x, d, n) = 255 Then
        DoEvents
        GoTo top
    ElseIf Mult(x, d, n) = 255 Then
        key(1) = e
        key(2) = d
        key(3) = n
    End If
End Sub

Public Function Euler(ByVal a As Long, ByVal b As Long) As Long
    On Error GoTo error2
    r1 = a: r = b
    p1 = 0: p = 1
    q1 = 2: q = 0
    n = -1
    Do Until r = 0
        r2 = r1: r1 = r
        p2 = p1: p1 = p
        q2 = q1: q1 = q
        n = n + 1
        r = r2 Mod r1
        c = r2 / r1
        p = (c * p1) + p2
        q = (c * q1) + q2
    Loop
    s = (b * p1) - (a * q1)
    If s > 0 Then
        x = p1
    Else
        x = (0 - p1) + a
    End If
    Euler = x
    Exit Function
   
error2:
    Euler = 0
End Function

Public Function Mult(ByVal x As Long, ByVal p As Long, ByVal m As Long) As Long
    y = 1
    On Error GoTo error1
    Do While p > 0
        Do While (p / 2) = (p / 2)
            x = (x * x) Mod m
            p = p / 2
        Loop
        y = (x * y) Mod m
        p = p - 1
    Loop
    Mult = y
    Exit Function
   
error1:
    y = 0
End Function

Public Function IsPrime(lngNumber As Long) As Boolean
    Dim lngCount As Long
    Dim lngSqr As Long
    Dim x As Long

    lngSqr = Sqr(lngNumber) ' get the int square root

    If lngNumber < 2 Then
        IsPrime = False
        Exit Function
    End If

    lngCount = 2
    IsPrime = True

    If lngNumber Mod lngCount = 0& Then
        IsPrime = False
        Exit Function
    End If

    lngCount = 3

    For x& = lngCount To lngSqr Step 2
        If lngNumber Mod x& = 0 Then
            IsPrime = False
            Exit Function
        End If
    Next
End Function

Public Function Base64_Encode(DecryptedText As String) As String
    Dim c1, c2, c3 As Integer
    Dim w1 As Integer
    Dim w2 As Integer
    Dim w3 As Integer
    Dim w4 As Integer
    Dim n As Integer
    Dim retry As String
    For n = 1 To LenB(StrConv(DecryptedText, vbFromUnicode)) Step 3
        c1 = AscB(MidB$(DecryptedText, n, 1))
        c2 = AscB(Mid$(DecryptedText, n + 1, 1) + ChrB$(0))
        c3 = AscB(Mid$(DecryptedText, n + 2, 1) + ChrB$(0))
        w1 = Int(c1 / 4)
        w2 = (c1 And 3) * 16 + Int(c2 / 16)
        If LenB(StrConv(DecryptedText, vbFromUnicode)) >= n + 1 Then w3 = (c2 And 15) * 4 + Int(c3 / 64) Else w3 = -1
        If LenB(StrConv(DecryptedText, vbFromUnicode)) >= n + 2 Then w4 = c3 And 63 Else w4 = -1
       
        retry = retry + mimeencode(w1) + mimeencode(w2) + mimeencode(w3) + mimeencode(w4)
    Next
    Base64_Encode = retry
End Function

Public Function Base64_Decode(a As String) As String
    Dim w1 As Integer
    Dim w2 As Integer
    Dim w3 As Integer
    Dim w4 As Integer
    Dim n As Integer
    Dim retry As String

    For n = 1 To Len(a) Step 4
        w1 = mimedecode(Mid$(a, n, 1))
        w2 = mimedecode(Mid$(a, n + 1, 1))
        w3 = mimedecode(Mid$(a, n + 2, 1))
        w4 = mimedecode(Mid$(a, n + 3, 1))
        If w2 >= 0 Then retry = retry + ChrB$(((w1 * 4 + Int(w2 / 16)) And 255))
        If w3 >= 0 Then retry = retry + ChrB$(((w2 * 16 + Int(w3 / 4)) And 255))
        If w4 >= 0 Then retry = retry + ChrB$(((w3 * 64 + w4) And 255))
    Next
    Base64_Decode = StrConv(retry, vbUnicode)
End Function

Public Function mimeencode(w As Integer) As String
    If w >= 0 Then mimeencode = Mid$(base64, w + 1, 1) Else mimeencode = ""
End Function

Private Function mimedecode(a As String) As Integer
    If Len(a) = 0 Then mimedecode = -1: Exit Function
    mimedecode = InStr(base64, a) - 1
End Function

Public Function Encode(ByVal Inp As String, ByVal e As Long, ByVal n As Long) As String
    Dim s As String
    s = ""
    m = Inp
   
    If m = "" Then Exit Function
    s = Mult(CLng(Asc(Mid(m, 1, 1))), e, n)
    For i = 2 To Len(m)
        s = s & "+" & Mult(CLng(Asc(Mid(m, i, 1))), e, n)
    Next i
    Encode = Base64_Encode(s)
End Function

Public Function Decode(ByVal Inp As String, ByVal d As Long, ByVal n As Long) As String
    St = ""
    ind = Base64_Decode(Inp)
    For i = 1 To Len(ind)
        nxt = InStr(i, ind, "+")
        If Not nxt = 0 Then
            tok = Val(Mid(ind, i, nxt))
        Else
            tok = Val(Mid(ind, i))
        End If
        St = St + Chr(Mult(CLng(tok), d, n))
        If Not nxt = 0 Then
            i = nxt
        Else
            i = Len(ind)
        End If
    Next i
    Decode = St
End Function

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值