R := 1
A := N
B := E
WHILE Z != 0
IF B & 1 ;判断是否为奇数
B := B - 1
R := R * A
X := X % D
ELSE
B := B / 2
A := A * A
A := A % D
END IF
NEXT
===============================================
上面计算 R = N^E Mod D, 其中"Z != 0"中的Z是什么?"X := X % D"中的X又是什么?另外,A、B两个变量直
接用N和E不就行了吗?干吗要用2个中间变量,让人空转两个弯,造成更多理解上的困难?
2. 有一段VB的RSA源代码,诸多不解:
下面的代码是为了计算:
C = Msg ^ E (公钥) Mod N (模数)
C最后化成字符串的格式
C = Encode(Msg, e, n)
Public Function Encode(ByVal Msg As String, ByVal e As Long, ByVal n As Long) As String
Dim s As String
Dim i As Integer
s = ""
If Msg = "" Then Exit Function
For i = 1 To Len(Msg)
s = s & & Mult(CLng(Asc(Mid(Msg, i, 1))), e, n)
'为什么这里逐位求就可以了呢?
Next i
End Function
Private Function Mult(ByVal x As Long, ByVal ePub As Long, ByVal m As Long) As Long
Dim y As Long
y = 1
On Error GoTo error1
Do While ePub > 0
Do While (ePub / 2) = (ePub \ 2)
x = (x * x) Mod m
ePub = ePub / 2
Loop
y = (x * y) Mod m
ePub = ePub - 1
Loop
Mult = y
Exit Function
error1:
y = 0
End Function
上面的Mult是否就是蒙哥马利算法的实现?
3. 另外一段VB RSA代码,用的是Byte数组:
C = Msg ^ E (公钥) Mod N (模数)
C = aModExp(Msg, e, n)
英文注释是原来就有的:
Public Function aModExp(abBase() As Byte, abExponent() As Byte, abModulus() As Byte, nLen As
Integer) As Variant
' Computes a = b^e mod m and returns the result in a byte array as a VARIANT, a为密文
Dim a() As Byte
Dim e() As Byte
Dim msg() As Byte
Dim nBits As Long
' Perform right-to-left binary exponentiation
'1. Set A = 1, Msg = message
ReDim a(nLen - 1)
a(nLen - 1) = 1
' NB msg and e are trashed so use copies
msg = abBase
e = abExponent
Stop
'2. While e != 0 do:
For nBits = nLen * 8 To 1 Step -1
'2.1 if e is odd then A = A * msg Mod m
If (e(nLen - 1) And &H1) <> 0 Then
a = aModMult(a, msg, abModulus, nLen)
End If
'2.2 e = e \ 2
Call DivideByTwo(e)
' 2.3 if e != 0 then msg = msg * msg mod m
If aIsZero(e, nLen) Then Exit For
msg = aModMult(msg, msg, abModulus, nLen)
DoEvents
Next
'3. Return(A)
aModExp = a
End Function
Private Function aModMult(abX() As Byte, abY() As Byte, abMod() As Byte, nLen As Integer) As
Variant
'Returns w = (x * y) mod m
Dim w() As Byte 'Return value
Dim x() As Byte 'Copy of abX
Dim y() As Byte 'Copy of abY
Dim nBits As Integer
'1. Set w = 0, tmps x = abX, y = abY
ReDim w(nLen - 1)
x = abX
y = abY
Stop
'2. From LS bit to MS bit of X do:
'2.1 if x is odd then w = (w + y) mod m
'2.2 x = x / 2
'2.3 if x != 0 then y = (y + y) mod m
'这个过程又是为何?
For nBits = nLen * 8 To 1 Step -1
'2.1 if x is odd then w = (w + y) mod m
If (x(nLen - 1) And &H1) <> 0 Then
Call aModAdd(w, y, abMod, nLen)
End If
'2.2 x = x / 2
Call DivideByTwo(x)
'2.3 if x != 0 then y = (y + y) mod m
If aIsZero(x, nLen) Then Exit For
Call aModAdd(y, y, abMod, nLen)
Next
aModMult = w
End Function