|

楼主 |
发表于 2012-4-16 17:17
|
显示全部楼层
[原创]RSA公钥密码的破解
调用大数除法,试编的判断大数是否素数的程序:
Public Function DeleteSpace(Tmp As String) As String
Dim Inst As Integer
Do
Tmp = Replace(Tmp, " ", "")
DoEvents
Inst = InStr(Tmp, " ")
Loop While Inst > 0
DeleteSpace = Tmp
End Function
Private Sub Command1_Click()
Dim g, k As String
Dim i As Long
Do While Val(InStr(MPC(DeleteSpace(Text1.Text), Val(2 * i + 1)), ".")) = 0
For i = 1 To 5000
g = MPC(DeleteSpace(Text1.Text), Val(2 * i + 1))
Do While Val(InStr(g, ".")) = 0
If n = 0 Then
Text3.Text = Text3.Text & Val(2 * i + 1)
n = 1
Else
Text3.Text = Text3.Text & "*" & Val(2 * i + 1)
End If
g = MPC(Trim(g), Val(2 * i + 1))
Loop
Next
k = g
g = 1
Loop
If n = 1 Then
Text3.Text = Text3.Text & "*" & k
Else
Text3.Text = "这是一个质数"
End If
End Sub
Public Function MPC(aa1 As String, bb1 As String) As String
Open "相除结果111.txt" For Output As #1
Dim a1(100000) As Long ';……………… 被除数的各位数字
Dim ay(100000) As Long ';……………… 余数的各位数字(最后一次试商要修正时)
Dim ayy(100000) As Long ';………………余数的各位数字(最后一次试商不必修正时)
Dim b1(100000) As Long ';……………… 除数的各位数字
Dim c1(100000) As Long ';……………… 近似商与除数相乘后的各位数字
Dim d(10) As Long
Dim pp As String ';商的每一位
Dim ppp As String ';作为商的输出字符串
Dim s1(1000) As Long ';……………… 商的各位数字
Dim js As Long '; js 是商的位数加一
Dim ta, tb, j, e As Long
Dim fa As Long ';………………………… 被除数的位数
Dim fb As Long ';………………………… 除数的位数
aa1 = aa1
bb1 = bb1
GoSub sub1
999: Close
Exit Function
sub1:
Z = 8 ';100 ';需要计算的小数位数
Print: Print #1,
Print "aa1 = "; aa1: Print #1, "aa1 = "; aa1
Print "bb1 = "; bb1: Print #1, "bb1 = "; bb1
Print "ppp = ";: Print #1, "ppp = ";
pp = "": ppp = "": mv = 0
If Len(bb1) <= 2 Then aa1 = aa1 + "00": bb1 = bb1 + "00" ';除数小于 3 位时
mv = 0
If Val(aa1) < Val(bb1) And Val(aa1) <> 0 Then ';除数大于被除数时
ppp = "0."
Z = Z - 1
aa1 = aa1 + "0"
mv = 1
End If
If mv = 0 Then
GoTo 2
Else
1: If (Len(aa1) = Len(bb1) And aa1 < bb1) Or Len(Trim$(aa1)) < Len(Trim$(bb1)) Then ';被除数小于除数时
ppp = ppp + "0"
aa1 = aa1 + "0"
Z = Z - 1
GoTo 1
Else
GoSub sub3
If Val(sy$) * Val(aa1) = 0 Then GoTo 4 ';余数或被除数为零停止计算
GoTo 3
End If
End If
2:
GoSub sub3
If Val(sy$) * Val(aa1) = 0 Then GoTo 4 ';余数或被除数为零停止计算
ppp = ppp + "." ';以下计算小数部分
3: For iv = 1 To Z '; Z 是事先设定的小数位数
If Val(sy$) * Val(aa1) = 0 Then GoTo 4 ';余数或被除数为零停止计算
aa1 = sy$ + "0"
GoSub sub3
Next iv
4: Print ppp: Print #1, ppp
MPC = ppp
Return
sub3: ';大数相除
ccc = 0
vvv = 0 ';试余数不大于除数时的标志
If (Len(aa1) = Len(bb1) And aa1 = bb1) Then pp = "1": sy$ = "0": GoTo 50
If (Len(aa1) = Len(bb1) And aa1 < bb1) Or Len(Trim$(aa1)) < Len(Trim$(bb1)) Then ';被除数小于除数时
pp = "0"
sy$ = aa1
GoTo 50
End If
mv = 0 ';如果除数位数小于 3 位,则分子分母同放大 100 倍:
If Len(bb1) <= 2 Then aa1 = aa1 + "00": bb1 = bb1 + "00": mv = 1
fa = Len(aa1) ';把被除数的各位数码放在数组 a1(i)中
For i = 1 To fa ';a1(1)为最低位,a1(fa)为最高位
a1(i) = Mid(aa1, fa - i + 1, 1)
Next i
fb = Len(bb1) ';把除数的各位数码放在数组 b1(i)中
For i = 1 To fb ';b1(1)为最低位,b1(fb)为最高位
b1(i) = Mid(bb1, fb - i + 1, 1)
Next i
';以下取除数的近似数
e = b1(fb) * 1000 + (b1(fb - 1)) * 100 + b1(fb - 2) * 10 + b1(fb - 3) + 1
ta = fa: js = 0
For j = fa - fb + 1 To 1 Step -1 ';………… 做除法求商,求余数
js = js + 1
f = a1(ta) * 1000 + a1(ta - 1) * 100 + a1(ta - 2) * 10 + a1(ta - 3)
';取被除数的近似数
s1(js) = Int(f / e) ';…………………………………… 试商
For i = 1 To fb ';…………………………………… 求试商的积
c1(i) = b1(i) * s1(js) ';…… 近似商与除数相乘后的各位数字
Next i
d(0) = 0
For i = 1 To fb - 1 ';…………………………………… 满 10 进位
d(1) = Int((c1(i) + d(0)) / 10): c1(i) = c1(i) + d(0) - d(1) * 10
d(0) = d(1)
Next i
c1(fb) = c1(fb) + d(0)
qq$ = ""
For i = fb To 1 Step -1 ';……………… 求试商的精确积
qq$ = qq$ & c1(i) ';…… 试商与除数相乘后的精确积
Next i
For i = fb To 1 Step -1
a1(ta - fb + i) = a1(ta - fb + i) - c1(i)
Next i
For i = 1 To fb
If a1(ta - fb + i) < 0 Then
a1(ta - fb + i) = a1(ta - fb + i) + 10
a1(ta - fb + i + 1) = a1(ta - fb + i + 1) - 1
End If
Next i
a1(ta - 1) = a1(ta - 1) + a1(ta) * 10
ta = ta - 1
Next j ';至此,已初步算出最后的试商
a1(fb - 1) = a1(fb - 1) Mod (10)
For i = fb To 1 Step -1
ayy(i) = a1(i) ';试余数的各位数码
Next
ssy$ = "" ';以下做出试余数的字符串 ssy$
For i = fb To 1 Step -1
ssy$ = ssy$ & ayy(i)
11: Next i
If (Len(ssy$) = Len(bb1) And ssy$ > bb1) Or Len(Trim$(ssy$)) > Len(Trim$(bb1)) Then
vvv = 1 ';试余数大于除数时的标志
For i = 1 To fb ';试余数减去除数,得到正确余数 sy$
ay(i) = ayy(i) - b1(i)
If ay(i) < 0 Then
ay(i) = ay(i) + 10
ayy(i + 1) = ayy(i + 1) - 1
End If
Next i
sy$ = "" ';把 ay(i) 组装成 sy$
For i = 1 To fb
sy$ = Trim$(Str$(ay(i))) & sy$
Next i
71: If Mid$(sy$, 1, 1) = " " Or Mid$(sy$, 1, 1) = "0" Then sy$ = Mid$(sy$, 2) Else GoTo 72
GoTo 71 ';去掉结果中的多余 0
End If
72:
For i = 1 To fb - 1
c1(1) = a1(i) - b1(i)
ay(i) = c1(1) ';最后一次试商要修正时,这就是余数各位数(除最高位)
If c1(1) < 0 Then
ccc = -1
c1(1) = c1(1) + 10: a1(i + 1) = a1(i + 1) - 1
End If
Next i
c1(1) = a1(fb) - b1(fb)
ay(fb) = c1(1) ';最后一次试商要修正时,这就是余数的最高位
If c1(1) >= 0 Then '; c(1) 不是负数时最后一次试商要修正
s1(js) = s1(js) + 1 '; 所谓修正就是加一
End If
For i = js To 1 Step -1
If s1(i) >= 10 Then ';由于修正,商的某一位有大于10者,要调整进位
s1(i) = s1(i) - 10: s1(i - 1) = s1(i - 1) + 1
End If
Next i
If js = 1 Then ';以下做出商的字符串 pp
pp = s1(js)
End If
If js >= 2 Then
pp = 10 * s1(1) + s1(2)
End If
For i = 3 To js
pp = pp & s1(i)
Next i
If vvv = 1 Then GoTo 50 ';试余数大于除数
10: sy$ = "" ';以下做出余数的字符串 sy$
If ccc = -1 Then ';最后一次试商不必修正时的余数
For i = fb To 1 Step -1
If ayy(i) <> 0 Then yyy = 1
If ayy(i) = 0 And yyy = 0 Then GoTo 20
sy$ = sy$ & ayy(i)
20: Next i
End If
If ccc = 0 Then ';最后一次试商须修正时的余数
For i = fb To 1 Step -1
If ay(i) <> 0 Then yyy = 1
If ay(i) = 0 And yyy = 0 Then GoTo 30
sy$ = sy$ & ay(i)
30: Next
End If
If Mid(sy$, 1, 1) = "-" Then ccc = -1: GoTo 10 ';余数为负,重做余数
40: If Mid(sy$, 1, 1) = "0" Then sy$ = Mid(sy$, 2) ';去掉余数前面的多余零
If Mid(sy$, 1, 1) = "0" Then GoTo 40
50: If sy$ = "" Then sy$ = "0"
If mv = 1 And sy$ <> "0" Then sy$ = Mid(sy$, 1, Len(sy$) - 2)
If mv = 1 And sy$ = "0" Then sy$ = "0"
ppp = ppp + pp ';包括整数及小数的商
90: Return
End Function
Private Sub Command2_Click()
Text1.Text = ""
Text2.Text = ""
Text3.Text = ""
End Sub
实验
1153103961384478448404925715924378885327554202134226047348028294505040
7344673361246564525252797971663975673998509009851407680713917156735472
7268047500902273102554085125377896253703900452077670802123470134036823
1774597408929744933116431873027001298810225982471847
结果:这是素数,但由于程序没有编完,不能分解大数,把另外两种情况编出就可以了,
需要解2次方程的程序,复杂,没有完,
只能实验大数,小的整数是会出错的,只实验5000个因子,在20秒内,再多时间就长了,
分解素因数的小程序(10位内的数),网上复制的:
Dim x, a, b, k As String
Private Sub Command1_Click()
a = Val(Text1.Text)
x = 2
If a <= 1 Or a > Int(a) Then
If a = 1 Then
Text2.Text = "它既不是质数,也不是合数"
Else
MsgBox "请您先输入数据", vbOKOnly + vbInformation, "友情提示"
End If
Else
Do While a / 2 = Int(a / 2) And a >= 4
If b = 0 Then
Text2.Text = Text2.Text & "2"
b = 1
Else
Text2.Text = Text2.Text & "*2"
End If
a = a / 2
k = a
Loop
Do While a > 1
For x = 3 To Sqr(a) Step 2
Do While a / x = Int(a / x) And a >= x * x
If b = 0 Then
Text2.Text = Text2.Text & x
b = 1
Else
Text2.Text = Text2.Text & "*" & x
End If
a = a / x
Loop
Next
k = a
a = 1
Loop
If b = 1 Then
Text2.Text = Text2.Text & "*" & k
Else
Text2.Text = "这是一个质数"
End If
End If
End Sub
Private Sub Command2_Click()
Text1.Text = ""
Text2.Text = ""
End Sub
|
|