📄 genratorvb.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 + -