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

📄 genratorvb.bas

📁 一个VB小程序,能够进行大数的计算,可以作为学习的参考
💻 BAS
字号:
Attribute VB_Name = "Genrator"
Attribute VB_Description = "Cryptography: probable primes and crypto key generation. Prints relevant values to public & private key-files."
'Author : Sjoerd.J.Schaper - vspickelen@zonnet.nl
'URL    : http://largeint.sourceforge.net/index.html
'Date   : 05-05-2004
'Code   : Visual Basic for Windows 5.0
Option Explicit
Dim Keynr As Integer

Sub Generate(BLen As Integer)
  Dim c As Long, df As Integer, g As String
  Dim h As String, i0 As Integer, i1 As Integer
  Dim i2 As Integer, ik As String, k As Integer
  Dim lp As Integer, lq As Integer, lx As Integer
  Dim p As Integer, q As Integer, s As Integer
  Dim t As Integer, tim As Double
  On Error GoTo errhand
  Data = "": Key = 0: tim = Timer
  p = 1: q = 2: i0 = 3: i1 = 4: i2 = 5
  Randomize Timer: Const w = 10 '      number of witnesses

  lx = 2 ^ Val(BLen) * 64
  lx = 1 + Int(0.301 * lx) '           length decimal(N)
  lp = 1 + lx \ 2
  lq = 1 + Int(0.667 * lx)
  lp = lp + Int(Rnd * (lq - lp)) '     length primes P & Q
  lq = lx - lp

  lx = lp
  For t = 1 To 2
    k = 1 + Int(Rnd * 9): s = k
    g = LTrim$(Str$(k))
    For lp = 3 To lx '                 random sequence of digits
      k = Int(Rnd * 10): s = s + k
      g = g + LTrim$(Str$(k))
    Next lp
    Do
      k = Int(Rnd * 10)
    Loop Until -(k And 1) '            odd(N)
    g = g + LTrim$(Str$(k))
    s = (4 * s + k) Mod 6 '            check divisibility by 6
    Readst i1, g: df = 4
    If s = 1 Then df = 2
    If s = 3 Then Inc i1, 2
    '
    g = " searching Q... "
    If t = 1 Then g = " searching P... "
    Do '                               strong pseudoprime-test
      Slate.Box.Text = g & DecLSB(i1)
      DoEvents: If Key Then GoTo break
      If IsPPrm(i1, i0, w) Then
        If t = 1 Then Copyf i1, p
        Exit Do
      End If
      df = 6 - df: Inc i1, df
    Loop: lx = lq
  Next t
  Copyf p, i0: Copyf i1, q

  Keynr = FreeFile
  Open WrkD + "public.key" For Output As Keynr
    h = "65537" '                       fixed public key k = F4
    Mult p, q, i2: Swp p, i2 '          N = P * Q in i2
    Print #Keynr, h
    Printp i2, 1
  Close Keynr

  Lognr = FreeFile
  Open WrkD + "genrator.log" For Output As Lognr
    Printn p, "    P = ", "", 3
    Printn q, "    Q = ", "", 3
    Printn i2, "    N = ", "", 3
    Dcr i0, 1: Dcr i1, 1
    Mult i0, i1, i2 '                  fi(N) = (P-1)*(Q-1) in i0
    Printn i0, "fi(N) = ", "", 3
    Readst i1, h
    Printn i1, "    k = ", "", 3
    Euclid i1, i0, i2 '                l = k^ -1 Mod fi(N) in i1
    Printn i1, "k^ -1 = ", " Mod fi(N)", 3
    If Not Isf(i2, 1) Then '           gcd > 1
      g = "Error: gcd(k, fi(N)) = "
      h = "  * No private key generated *"
      Printn i2, g, h, 2
      Print #Lognr, Data: GoTo eind
    End If
    Print #Lognr, Data
    Print #Lognr, "Timer:"; CSng(Timer - tim); "s"
    Slate.Box.Text = Data
  Close Lognr

  Keynr = FreeFile
  Open WrkD + "private.key" For Output As Keynr
    Printp i1, 1
    Printp p, 0
    Printp q, 0
  Close Keynr

eind:
  Close: Data = ""
  On Error GoTo 0
  Exit Sub
break:
  Slate.Box.Text = Slate.Box.Text + vbCrLf + " break"
  GoTo eind
errhand:
  MsgBox "Generator error", 48, "Error"
  Resume eind
End Sub

Private Sub Printp(n, sw)
Dim g As String, k As Integer, k2 As Integer
   k = Decf(n)
   g = String$(k, "0")
   CnvSt g
   If sw Then
      k2 = k \ 2: k = k - k2
      Print #Keynr, Right$(g, k) '     split n low
      Print #Keynr, Left$(g, k2) '     & high
   Else
      Print #Keynr, g '                plain print
   End If
End Sub

⌨️ 快捷键说明

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