⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 modoperation.bas

📁 用visual basic语言开发的进行RSA加密的代码
💻 BAS
📖 第 1 页 / 共 2 页
字号:

Public Function ArrADC(ByRef Num1() As Long, ByRef Num2() As Long) As Long() '加法
Dim Ans() As Long
Dim LNum1 As Long
Dim LNum2 As Long
Dim TNum1() As Long
Dim TNum2() As Long
Dim Result() As Long
Dim i As Long
Dim j As Long
Dim kk As Long

Dim IsN As Boolean

LNum1 = UBound(Num1)
LNum2 = UBound(Num2)

If LNum1 > LNum2 Then
    i = LNum1
    ReDim TNum2(i)
    TNum1() = Num1
    kk = LongToLong(Num2(), TNum2(), LNum2)
Else
    i = LNum2
    ReDim TNum1(i)
    kk = LongToLong(Num1(), TNum1(), LNum1)
    TNum2() = Num2
End If

ReDim Ans(i)

For j = 0 To i

    Ans(j) = TNum1(j) + TNum2(j)

    If IsN = True Then Ans(j) = Ans(j) + 1

    If Ans(j) >= &H1000 Then
        Ans(j) = Ans(j) - &H1000
        IsN = True
    Else
        IsN = False
    End If
Next

If IsN = True Then
    ReDim Result(i + 1)
    Result(i + 1) = 1
    kk = LongToLong(Ans(), Result(), i)
Else
    ReDim Result(i)
    Result() = Ans
End If
ArrADC = Result
End Function

Public Function ArrSBB(ByRef Num1() As Long, ByRef Num2() As Long) As Long() '减法
Dim Ans() As Long
Dim LNum1 As Long
Dim LNum2 As Long
Dim TNum1() As Long
Dim TNum2() As Long
Dim Result() As Long
Dim i As Long
Dim j As Long
Dim kk As Long
Dim IsN As Boolean

LNum1 = UBound(Num1)
LNum2 = UBound(Num2)

If ArrMt(Num1(), Num2()) = True Then
    i = LNum1
    ReDim TNum2(i)
    TNum1() = Num1
    kk = LongToLong(Num2(), TNum2(), LNum2)
Else
    i = LNum2
    ReDim TNum2(i)
    TNum1() = Num2
    kk = LongToLong(Num1(), TNum2(), LNum1)
End If

ReDim Ans(i)
For j = 0 To i
    Ans(j) = TNum1(j) - TNum2(j)
    If IsN = True Then Ans(j) = Ans(j) - 1
    If Ans(j) < 0 Then
        Ans(j) = Ans(j) + &H1000
        IsN = True
    Else
        IsN = False
    End If
Next

i = UBound(Ans)
If i <> 0 Then
    For j = i To 1 Step -1
        If Ans(j) <> 0 Then Exit For
    Next
Else
    j = 0
End If

ReDim Result(j)
kk = LongToLong(Ans(), Result(), j)
ArrSBB = Result
End Function

Public Function ArrMUL(ByRef Num1() As Long, ByRef Num2() As Long) As Long() '乘法
Dim LNum1 As Long
Dim LNum2 As Long
Dim Tmp As Long
Dim Ans() As Long
Dim Result() As Long
Dim i As Long
Dim j As Long

LNum1 = UBound(Num1)
LNum2 = UBound(Num2)
Tmp = LNum1 + LNum2 + 1
ReDim Ans(Tmp)
For i = 0 To LNum1
    For j = 0 To LNum2
        Ans(i + j) = Ans(i + j) + Num1(i) * Num2(j)
        If Ans(i + j) >= &H1000 Then
            Ans(i + j + 1) = Ans(i + j + 1) + Int(Ans(i + j) / &H1000)
            Ans(i + j) = Ans(i + j) Mod &H1000
        End If
    Next
Next

i = UBound(Ans)
If i <> 0 Then
    For j = i To 1 Step -1
        If Ans(j) <> 0 Then Exit For
    Next
Else
    j = 0
End If

ReDim Result(j)
i = LongToLong(Ans(), Result(), j)
ArrMUL = Result
End Function

Public Function ArrDIV(ByRef Num1() As Long, ByRef Num2() As Long, ModResult() As Long) As Long() '除法
Dim LNum1 As Long
Dim LNum2 As Long
Dim Ans() As Long
Dim TNum1() As Long
Dim Result() As Long
Dim i As Long
Dim kk As Long
Dim Tmp() As Long
Dim Tmp2() As Long

LNum2 = UBound(Num2)
ReDim Ans(0)
Ans(0) = 0
Do While kk = 0

    TNum1() = ArrSBB(Num1(), ArrMUL(Ans(), Num2()))

    If ArrMt(Num2(), TNum1()) Then Exit Do
    
    LNum1 = UBound(TNum1)
    
    ReDim Tmp(0)
    Tmp(0) = Int(TNum1(LNum1) / (Num2(LNum2) + 1))
    
    If Tmp(0) = 0 And LNum1 <> 0 Then
        Tmp(0) = Int((TNum1(LNum1) * &H1000 + TNum1(LNum1 - 1)) / (Num2(LNum2) + 1))
        LNum1 = LNum1 - 1
    ElseIf Tmp(0) = 0 And LNum1 = 0 Then
        Tmp(0) = Int(TNum1(LNum1) * &H1000 / (Num2(LNum2) + 1))
        LNum1 = LNum1 - 1
    End If
    
    If LNum1 - LNum2 <> -1 Then
        Tmp() = ArrShl(Tmp(), LNum1 - LNum2)
    Else
        Tmp(0) = 1
    End If
    Ans() = ArrADC(Ans(), Tmp())

Loop

LNum1 = UBound(Ans)

If LNum1 <> 0 Then
    For i = LNum1 To 1 Step -1
        If Ans(i) <> 0 Then Exit For
    Next
Else
    i = 0
End If

ReDim Result(i)
kk = LongToLong(Ans(), Result(), i)
ModResult() = TNum1
ArrDIV = Result
End Function

Public Function ArrShl(Num() As Long, n As Long) As Long() '左位移
Dim i As Long, Result() As Long
ReDim Result(UBound(Num) + n)
For i = 0 To UBound(Num)
  Result(i + n) = Num(i)
Next i
ArrShl = Result
End Function

Public Function ArrShr(Num() As Long, n As Long) As Long() '右位移
Dim i As Long, Result() As Long
ReDim Result(UBound(Num) - n)
For i = 0 To UBound(Num)
  Result(i - n) = Num(i)
Next i
ArrShr = Result
End Function

Public Function ArrMutMod(ByRef Num1() As Long, ByRef Num2() As Long, ByRef ModNum() As Long) As Long() '模乘
Dim Num() As Long
Dim Result() As Long
ArrDIV ArrMUL(Num1(), Num2()), ModNum(), Result()
ArrMutMod = Result
End Function

Public Function ArrMiMod(ByRef Num1() As Long, ByRef NumT() As Long, ByRef ModNum() As Long) As Long() '模幂
Dim Numb0() As Long
Dim Numb1() As Long
Dim Numb2() As Long
Dim e() As Long
Dim c() As Long
Dim d() As Long
Dim TmpNum() As Long


ReDim Numb0(0)
ReDim Numb1(0)
ReDim Numb2(0)
Numb0(0) = 0
Numb1(0) = 1
Numb2(0) = 2

e = NumT
c = Num1
ReDim d(0)
d(0) = 1
Do While ArrMt(e, Numb0)

    If e(0) Mod 2 = 0 Then
        c() = ArrMutMod(c(), c(), ModNum())
        e = ArrDIV(e, Numb2, TmpNum())
    Else
        d() = ArrMutMod(d(), c(), ModNum())
        e = ArrSBB(e, Numb1)
    End If
Loop

ArrMiMod = d

End Function

Public Function LongToLong(ByRef Num1() As Long, Num2() As Long, ByVal L1 As Long) As Long
Dim i As Long
For i = 0 To L1
    Num2(i) = Num1(i)
Next
End Function

Private Function ArrMt(ByRef Num1() As Long, Num2() As Long) As Boolean
Dim LNum1 As Long
Dim LNum2 As Long
Dim i As Long

LNum1 = UBound(Num1)
LNum2 = UBound(Num2)
If LNum1 > LNum2 Then
    ArrMt = True
ElseIf LNum2 > LNum1 Then
    ArrMt = False
Else
    For i = LNum1 To 0 Step -1
        If Num1(i) > Num2(i) Then
            ArrMt = True
            Exit For
        ElseIf Num1(i) < Num2(i) Then
            ArrMt = False
            Exit For
        End If
    Next
End If
End Function

Private Function ArrIs0(ByRef Num1() As Long) As Boolean
If UBound(Num1) = 0 And Num1(0) = 0 Then
    ArrIs0 = True
Else
    ArrIs0 = False
End If
End Function

Public Function ArrDelSpace(Num() As Long) As Boolean
Dim i As Long, MaxArr As Long
For i = UBound(Num) To 0 Step -1
  If Num(i) > &H0 Then
    MaxArr = i
    Exit For
  End If
Next i
ReDim Preserve Num(MaxArr)
End Function

Public Function HexToArr(ByVal Str As String) As Long()
Dim LNum As Long
Dim i As Long
Dim Str2 As String
Dim ReStr() As Long

LNum = Len(Str) Mod 3
If LNum = 0 Then
    Str2 = Str
Else
    Str2 = String(3 - LNum, "0") & Str
End If
LNum = Len(Str2) / 3
ReDim ReStr(LNum - 1)
For i = 0 To LNum - 1
    ReStr(i) = Val("&H" & Mid(Str2, LNum * 3 - i * 3 - 2, 3) & "&")
Next
HexToArr = ReStr()
End Function

Public Function ArrToHex(ByRef Num() As Long) As String
Dim LNum As Long
Dim i As Long
Dim s As String

Dim Ans As String

LNum = UBound(Num) - 1
For i = 0 To LNum
    s = Hex(Num(i))
    s = String(3 - Len(s), "0") & s
    Ans = s & Ans
Next
Ans = Hex(Num(LNum + 1)) & Ans
ArrToHex = Ans
End Function

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -