首页
社区
课程
招聘
关于RSA问题
发表于: 2007-1-17 12:39 4688

关于RSA问题

hud 活跃值
2
2007-1-17 12:39
4688
最近阅读一篇关于RSA原理的文章,有几个问题不解,特来求教于各位。

原文:
-------------------------------
一、 费马小定理[1]的转化

费马小定理:有N为任意正整数,P为素数,且N不能被P整除,则有:

N ^ P mod P = N

费马小定理可变形为:

N ^ (P - N) mod P = 0

( N ( N ^ (P - 1) - 1 ) ) mod P = 0
-------------------------------

关于 N ^ P mod P = N:

5 ^ 7 mod 7 = 5 (正确)
5 ^ 11 mod 11 = 5 (正确)
5 ^ 3 mod 3 = 2 (?)
4 ^ 5 mod 5 = 4 (正确)
4 ^ 3 mod 3 = 1 (?)
随便试几个,不正确的情况很易碰到,是否是这个定理的叙述错了?

关于 N ^ (P - N) mod P = 0:

5 ^ (7-5) mod 7 = 4 (?)
5 ^ (11-5) mod 11 = 5 (正确)
5 ^ (3-5) mod 3 = 0 (?)
4 ^ (5-4) mod 5 = 4 (正确)
4 ^ (3-4) mod 3 = 0 (?)

请朋友们指教。谢谢!

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 370
活跃值: (78)
能力值: ( LV9,RANK:970 )
在线值:
发帖
回帖
粉丝
2
5 ^ 3 mod 3 = 5 mod 3 = 2
4 ^ 3 mod 3 = 4 mod 3 = 1
因为5,4都>3,mod后不可能比3大。

N ^ (P - N) mod P = 0这个定理是谁说的???
2007-1-17 13:03
0
雪    币: 221
活跃值: (161)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
3
谢谢您的解答,第一个问题已经明白了。那么是否说费马小定理还要加一句:N < P ?

第二个问题,N ^ (P - N) mod P = 0,我是在下面这篇文章里看到的:

http://blog.csdn.net/fireseed/archive/2005/03/23/327444.aspx
2007-1-17 13:21
0
雪    币: 370
活跃值: (78)
能力值: ( LV9,RANK:970 )
在线值:
发帖
回帖
粉丝
4
写错了
应该是N ^ P - N mod P = 0
你可以从( N ( N ^ (P - 1) - 1 ) ) mod P = 0
看出来的
下面就是N^P-N mod P = 0
2007-1-17 13:25
0
雪    币: 221
活跃值: (161)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
5
我经过部分数据测试,应该是:

( N ^ P - N ) mod P = 0

谢谢,现在前面部分明白了。我后面有问题再来请教。
2007-1-18 10:30
0
雪    币: 221
活跃值: (161)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
6
1. 还是我阅读下面这篇关于RSA的文章后有一些问题不解,希望有朋友能够继续指点:

http://blog.csdn.net/fireseed/archive/2005/03/23/327444.aspx

===============================================

算法三:蒙格马利法计算N的E次方再取D的模,令R为计算结果。
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



先感谢朋友们的帮助!
2007-2-5 09:21
0
雪    币: 221
活跃值: (161)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
7
有朋友能帮助解答吗?
2007-2-6 08:53
0
游客
登录 | 注册 方可回帖
返回
//