RSA加密解密算法 asp源码
发布时间:2009-08-28 13:10:00
它是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作,也很流行。算法的名字以发明者的名字命名:Ron Rivest, Adi Shamir 和Leonard Adleman。但RSA的安全性一直未能得到理论上的证明。
它经历了各种攻击,至今未被完全攻破。
<%
' Compiled by Lewis Edward Moten III
' lewis@moten.com
' http://www.lewismoten.com
' Wednesday, May 09, 2001 05:42 PM GMT +5
' RSA Encryption Class
'
' .KeyEnc
' Key for others to encrypt data with.
'
' .KeyDec
' Your personal private key. Keep this hidden.
'
' .KeyMod
' Used with both public and private keys when encrypting and decrypting data.
'
' .KeyGen
' Used to generate both public and private keys for encrypting and decrypting data.
'
' .Encode(pStrMessage)
' Encrypts message and returns in numeric format
'
' .Decode(pStrMessage)
' Decrypts message and returns a string
'
Class TRSA
Public KeyEnc
Public KeyDec
Private Function Mult(ByVal x, ByVal pg, ByVal m)
dim y : y=1
Do While pg > 0
Do While (pg / 2) = Int((pg / 2))
x = nMod((x * x), m)
pg = pg / 2
Loop
y = nMod((x * y), m)
pg = pg - 1
Loop
Mult = y
End Function
Private Function nMod(x, y)
nMod = 0
if y = 0 then Exit Function End If
nMod = x - (Int(x / y) * y)
End Function
Private Function Euler(E3, PHI3)
'genetates D from (E and PHI) using the Euler algorithm
On Error Resume Next
Dim u1, u2, u3, v1, v2, v3, q
Dim t1, t2, t3, z, vv, inverse
u1 = 1
u2 = 0
u3 = PHI3
v1 = 0
v2 = 1
v3 = E3
Do Until (v3 = 0)
q = Int(u3 / v3)
t1 = u1 - q * v1: t2 = u2 - q * v2: t3 = u3 - q * v3
u1 = v1: u2 = v2: u3 = v3
v1 = t1: v2 = t2: v3 = t3
z = 1
Loop
If (u2 < 0) Then
inverse = u2 + PHI3
Else
inverse = u2
End If
Euler = inverse
End Function
Private Function GCD(nPHI)
On Error Resume Next
Dim nE, y
Const N_UP = 99999999 'set upper limit of random number For E
Const N_LW = 10000000 'set lower limit of random number For E
Randomize
nE = Int((N_UP - N_LW + 1) * Rnd + N_LW)
Do
x = nPHI Mod nE
y = x Mod nE
If y <> 0 And IsPrime(nE) Then
GCD = nE
Exit Function
Else
nE = nE + 1
End If
Loop
End Function
Private Function IsPrime(lngNumber)
On Error Resume Next
Dim lngCount, ngSqr
Dim x
lngSqr = Int(Sqr(lngNumber)) ' Get the int square root
If lngNumber < 2 Then
IsPrime = False
Exit Function
End If
lngCount = 2
IsPrime = True
If lngNumber Mod lngCount = 0 Then
IsPrime = False
Exit Function
End If
lngCount = 3
For x = lngCount To lngSqr Step 2
If lngNumber Mod x = 0 Then
IsPrime = False
Exit Function
End If
Next
End Function
Private Function NumberToHex(ByRef pLngNumber, ByRef pLngLength)
NumberToHex = Right(String(pLngLength, "0") & Hex(pLngNumber), pLngLength)
End Function
Private Function HexToNumber(ByRef pStrHex)
HexToNumber = CLng("&h" & pStrHex)
End Function
Public Function Encrypt(ByVal tIp)
Dim encSt, z
Dim strMult
Dim iEnc, iMod
Dim aKey : aKey=Split(KeyEnc,",")
If tIp = "" Then Exit Function End If
iEnc=Int(aKey(0))
iMod=Int(aKey(1))
For z = 1 To Len(tIp)
encSt = encSt & NumberToHex(Mult(CLng(Asc(Mid(tIp, z, 1))), iEnc, iMod),8)
Next
Encrypt = encSt
End Function
Public Function Decrypt(ByVal tIp)
Dim decSt, z
Dim iDec, iMod
Dim aKey : aKey=Split(KeyDec,",")
if Len(tIp) Mod 8 <> 0 then Exit Function End If
iDec=Int(aKey(0))
iMod=Int(aKey(1))
For z = 1 To Len(tIp) Step 8
decSt = decSt + Chr(Mult(HexToNumber(Mid(tIp, z, 8)), iDec, iMod))
Next
Decrypt = decSt
End Function
Public Function genKey()
'Generates the keys for E, D and N
Dim E, D, N, p, q
Const PQ_UP = 9999 'set upper limit of random number
Const PQ_LW = 3170 'set lower limit of random number
Const KEY_LOWER_LIMIT = 10000000 'set For 64bit minimum
p = 0: q = 0
Randomize
Do Until D > KEY_LOWER_LIMIT 'makes sure keys are 64bit minimum
Do Until IsPrime(p) And IsPrime(q) ' make sure q and q are primes
p = clng((PQ_UP - PQ_LW + 1) * Rnd + PQ_LW)
q = clng((PQ_UP - PQ_LW + 1) * Rnd + PQ_LW)
Loop
N = clng(p * q)
PHI = (p - 1) * (q - 1)
E = clng(GCD(PHI))
D = clng(Euler(E, PHI))
Loop
KeyEnc = E & "," & N
KeyDec = D & "," & N
genKey=E & "," & D & "," & N
End Function
Public Function setKey(ByVal a_sKey)
Dim aKeys : aKeys=Split(a_sKey,",")
setKey=false
KeyEnc=null
KeyDec=null
If UBound(aKeys)<2 Then Exit Function End If
KeyEnc=aKeys(0) & "," & aKeys(2)
KeyDec=aKeys(1) & "," & aKeys(2)
setKey=true
End Function
End Class
%><%
' Compiled by Lewis Edward Moten III
' lewis@moten.com
' http://www.lewismoten.com
' Wednesday, May 09, 2001 05:42 PM GMT +5
' RSA Encryption Class
'
' .KeyEnc
' Key for others to encrypt data with.
'
' .KeyDec
' Your personal private key. Keep this hidden.
'
' .KeyMod
' Used with both public and private keys when encrypting and decrypting data.
'
' .KeyGen
' Used to generate both public and private keys for encrypting and decrypting data.
'
' .Encode(pStrMessage)
' Encrypts message and returns in numeric format
'
' .Decode(pStrMessage)
' Decrypts message and returns a string
'
Class TRSA
Public KeyEnc
Public KeyDec
Private Function Mult(ByVal x, ByVal pg, ByVal m)
dim y : y=1
Do While pg > 0
Do While (pg / 2) = Int((pg / 2))
x = nMod((x * x), m)
pg = pg / 2
Loop
y = nMod((x * y), m)
pg = pg - 1
Loop
Mult = y
End Function
Private Function nMod(x, y)
nMod = 0
if y = 0 then Exit Function End If
nMod = x - (Int(x / y) * y)
End Function
Private Function Euler(E3, PHI3)
'genetates D from (E and PHI) using the Euler algorithm
On Error Resume Next
Dim u1, u2, u3, v1, v2, v3, q
Dim t1, t2, t3, z, vv, inverse
u1 = 1
u2 = 0
u3 = PHI3
v1 = 0
v2 = 1
v3 = E3
Do Until (v3 = 0)
q = Int(u3 / v3)
t1 = u1 - q * v1: t2 = u2 - q * v2: t3 = u3 - q * v3
u1 = v1: u2 = v2: u3 = v3
v1 = t1: v2 = t2: v3 = t3
z = 1
Loop
If (u2 < 0) Then
inverse = u2 + PHI3
Else
inverse = u2
End If
Euler = inverse
End Function
Private Function GCD(nPHI)
On Error Resume Next
Dim nE, y
Const N_UP = 99999999 'set upper limit of random number For E
Const N_LW = 10000000 'set lower limit of random number For E
Randomize
nE = Int((N_UP - N_LW + 1) * Rnd + N_LW)
Do
x = nPHI Mod nE
y = x Mod nE
If y <> 0 And IsPrime(nE) Then
GCD = nE
Exit Function
Else
nE = nE + 1
End If
Loop
End Function
Private Function IsPrime(lngNumber)
On Error Resume Next
Dim lngCount, ngSqr
Dim x
lngSqr = Int(Sqr(lngNumber)) ' Get the int square root
If lngNumber < 2 Then
IsPrime = False
Exit Function
End If
lngCount = 2
IsPrime = True
If lngNumber Mod lngCount = 0 Then
IsPrime = False
Exit Function
End If
lngCount = 3
For x = lngCount To lngSqr Step 2
If lngNumber Mod x = 0 Then
IsPrime = False
Exit Function
End If
Next
End Function
Private Function NumberToHex(ByRef pLngNumber, ByRef pLngLength)
NumberToHex = Right(String(pLngLength, "0") & Hex(pLngNumber), pLngLength)
End Function
Private Function HexToNumber(ByRef pStrHex)
HexToNumber = CLng("&h" & pStrHex)
End Function
Public Function Encrypt(ByVal tIp)
Dim encSt, z
Dim strMult
Dim iEnc, iMod
Dim aKey : aKey=Split(KeyEnc,",")
If tIp = "" Then Exit Function End If
iEnc=Int(aKey(0))
iMod=Int(aKey(1))
For z = 1 To Len(tIp)
encSt = encSt & NumberToHex(Mult(CLng(Asc(Mid(tIp, z, 1))), iEnc, iMod),8)
Next
Encrypt = encSt
End Function
Public Function Decrypt(ByVal tIp)
Dim decSt, z
Dim iDec, iMod
Dim aKey : aKey=Split(KeyDec,",")
if Len(tIp) Mod 8 <> 0 then Exit Function End If
iDec=Int(aKey(0))
iMod=Int(aKey(1))
For z = 1 To Len(tIp) Step 8
decSt = decSt + Chr(Mult(HexToNumber(Mid(tIp, z, 8)), iDec, iMod))
Next
Decrypt = decSt
End Function
Public Function genKey()
'Generates the keys for E, D and N
Dim E, D, N, p, q
Const PQ_UP = 9999 'set upper limit of random number
Const PQ_LW = 3170 'set lower limit of random number
Const KEY_LOWER_LIMIT = 10000000 'set For 64bit minimum
p = 0: q = 0
Randomize
Do Until D > KEY_LOWER_LIMIT 'makes sure keys are 64bit minimum
Do Until IsPrime(p) And IsPrime(q) ' make sure q and q are primes
p = clng((PQ_UP - PQ_LW + 1) * Rnd + PQ_LW)
q = clng((PQ_UP - PQ_LW + 1) * Rnd + PQ_LW)
Loop
N = clng(p * q)
PHI = (p - 1) * (q - 1)
E = clng(GCD(PHI))
D = clng(Euler(E, PHI))
Loop
KeyEnc = E & "," & N
KeyDec = D & "," & N
genKey=E & "," & D & "," & N
End Function
Public Function setKey(ByVal a_sKey)
Dim aKeys : aKeys=Split(a_sKey,",")
setKey=false
KeyEnc=null
KeyDec=null
If UBound(aKeys)<2 Then Exit Function End If
KeyEnc=aKeys(0) & "," & aKeys(2)
KeyDec=aKeys(1) & "," & aKeys(2)
setKey=true
End Function
End Class
%>
猜你喜欢
- 在这里给出是的WindowsXP操作系统下的安装过程一、下载安装文件到MySQL官方网站找到ZIP文件提示:有些是安装文件,安装时会有提示,
- 内容摘要:统计在线人数的方法很多,可以使用Application来统计在线人数,也可以使用IP来统计在线人数。各有优点。本文介绍了通过判断S
- 注册模块default.asp 代码如下:<!DOCTYPE html PUBLIC "-//
- 在VBScript中,有一个On Error Resume Next语句,它使脚本解释器忽略运行期错误并继续脚本代码的执行。接着该脚本可以检
- 八月的UCDChina书友会主题是“信息分类和方法”,在会场中的内容是不足以简单的概述的,而这次交流至少对于分类、属性、关键词与Tag的定义
- 这不是什么原创,是我跟据OReilly.JavaScript.The.Definitive.Guide.5th.Edition.Aug.20
- 因为要做移动梦网WAP的一些接口,所以要用到这种方式,接下来会有ASP.net版本的,这个是ASP版本的,利用了MSXML2.XMLHTTP
- 他们是如何不让我的Teleport和Webzip工作的?你也可以做得到哦: <%dim UserAgentUser
- 以下介绍用数据库实现简单计数器,功能实现统计网站每日访问,每周访问及总访问量的统计,使用js调用下面存为count.asp<%&nbs
- 如何提高SQL Server数据库的性能,该从哪里入手呢?笔者认为,该遵循从外到内的顺序,来改善数据库的运行性能。如下图: 第一层
- 很久之前就对jQuery.animate的实现非常感兴趣,不过前段时间很忙,直到前几天端午假期才有时间去研究。jQuery.animate的
- position属性可以让你让你随意控制一个特定元素在浏览器何处以及如何显示。比方说我们用position:fixed 让一个图片显示在浏览
- 启发式评估法(Heuristic Evaluation)是一种用来发现用户界面设计中的可用性问题从而使这些问题作为再设计过程中的一部分被重视
- 前面已经介绍了关于Dreamweaver MX 2004的基本操作
- 如何编写CSS代码才能更有效率?这是许多网页制作者与开发者都关心的问题。大概没有什么魔法,可以保证一下就把你的样式表缩小到百分之多少,但合理
- 如果你是一名Web Developer,而且还知道CSS Sprite这个词,请先去搜索一下,也许你正在使用这个技术,但只是不知道它的名字罢
- 我对定格动画非常喜爱,也曾经在大学毕业时期制作过一部个人定格动画MV.恰当给CDC博客写文之机,给大家介绍下定格动画,分享下这门独特的拍摄艺
- 和大多数的语言脚本一样,学习ASP最好的方法就是亲身尝试ASP,使用你自己的系统安装PWS或者IIS。你可以边学习边在你自己的服务器上测试A
- 假如一个页面中的文本采用的都是同样的字体、同样的字号、同样的颜色,做为读者的你能轻易的区分出哪里是标题,哪里是正文内容吗?所以通常情况下,设
- 七夕节简介每年农历七月初七这一天是我国汉族的传统节日七夕节。因为此日活动的主要参与者是少女,而节日活动的内容又是以乞巧为主,故而人们称这天为