查看完整版本: 在asp中通过vbs类实现rsa加密与解密

豹子 2007-6-23 10:30

在asp中通过vbs类实现rsa加密与解密

本文章有两文件组成
"FK`?_ M aa2^!E test.asp 测试演示文件
^A3k ]DVK clsrsa.asp 实现rsa加密与解密的vbs类文件Q L^.{ H0\mZg
下面是代码:   
N M-}Cu*C T 5F.obr;P&p%j_.[@
  
!v[+D7}lkP6i6x
3bE? C$U/Af H 1. test.asp  -d1U!`#H W3x!M
;nV B T1G X0X
% vr#V%K5WG,a&_Ld
rem 文章标题:在asp中通过vbs类实现rsa加密与解密"Ik)aW0Q;B
rem 收集整理:yanek
g"[5s:X |,po@b } rem 联系:aspboy@263.net  
8vvjU%I4Kb1n
~?z.w8y5V3x5b ?@p %
};~?![y_ %Option Explicit%
:fS QU8L Xb!~'^]'o !--#INCLUDE FILE="clsRSA.asp"--Fw7i.C{)U[&~ `+~9v
%  nkqd-C LR&W
mu.{ o+PB
Dim LngKeyE
^}8doE@ Dim LngKeyD
YyX3jA|C5D Dim LngKeyN
\#K nD6W&J%v-ccF Dim StrMessageM$A`:VKD%[Va
Dim ObjRSAr9i2^I;b*Q8wr
If Not Request.Form = "" Then  
P/L3BK*\ E3} M !Pw C[ `(I
LngKeyE = Request.Form("KeyE")
m} cW$`T2I t LngKeyD = Request.Form("KeyD")
d5W'w.F8`%Epu| LngKeyN = Request.Form("KeyN")
y-s:Y3ca] StrMessage = Request.Form("Message")
;Q$g&b#H+g,Mk (o*Zj*L0pKw xSv
Set ObjRSA = New clsRSA9?FU%C-C.~

T.X`%BE*Ok*o Select Case Request.Form("Action")
w{[2bG%ywg-E Case "Generate Keys"
STa$d.J6]X Call ObjRSA.GenKey() I7C\-I@q
LngKeyE = ObjRSA.PublicKey
o4m;N)lKM zr9B LngKeyD = ObjRSA.PrivateKey&f#v,G C!T&q:K s
LngKeyN = ObjRSA.Modulus#^/a'Y8ZIq
Case "Encrypt"
Y3wDTjW%P ObjRSA.PublicKey = LngKeyE.\.?#x*L&D"S9LnV1`y
ObjRSA.Modulus = LngKeyN
*D-mea:xg uH StrMessage = ObjRSA.Encode(StrMessage)
)t/d4z$Mwo Case "Decrypt"u{(U3Q-P+P$E"`
ObjRSA.PrivateKey = LngKeyD(B!t s4]J+d+j
ObjRSA.Modulus = LngKeyN
fjv aBm s6P StrMessage = ObjRSA.Decode(StrMessage)4tKv~B%_
End Select
R`/L"b P
d3mbcA!mq Set ObjRSA = Nothing"^*HV'S/Hd7l

E0v0As[U&T ],^ End If Iv7@\-V!{
%)|;nL#kg9Iu
HTMLPs0}Y| q
HEADK F1Z@ U,v;b I
TITLERSA Cipher Demonstration/TITLE
aI1Kh zG NN /HEAD
| [n)I D3g-A*CO^h7N BODYz(C(cKU)p
H1RSA Cipher Demonstration/H1
Y7zo.cH0d'k PA[ Uw6m
You will first need to generate your public/privage key-pair
N/w p+d/i![+\$Q'Z before you can encrypt/decrypt messages.
|(|``D9Dv.E /P
/ou#c6lTq FORM method="post"
4w'@ l } CgR HI5O TABLEog&chiu }Z:B
TR
w{uL0t,PGBM3^ TDPublic Key/TD"o#q-Ce7d S4Z#ZH!B
TDINPUT name="KeyE" value="%=Server.HTMLEncode(LngKeyE)%"/TDB @ x1Z:P BVSZ
TD rowspan="3"
n:egp T/xg#BFa INPUT type="Submit" name="Action" value="Generate Keys"
Fg)AAE"}T /TD]0y~6_0y q"`snE
/TR
f4S$CPS5Q-J TR
Ur X7Sa8`!afa TDPrivate Key/TD
5OD^ `b!U1M%O TDINPUT name="KeyD" value="%=Server.HTMLEncode(LngKeyD)%"/TD
&P(YDd"M]{$s8y /TR
J e R)[ez TR"f:U |0g O9UX
TDModulus/TDM(gX2hrPH&e {
TDINPUT name="KeyN" value="%=Server.HTMLEncode(LngKeyN)%"/TD
sA|w,x+b /TRf#{#h5IG
TR'NIH:h&a1A
TD colspan="3"
FYP)RoI Test Message:BR
IwOl2N[ TEXTAREA name="Message" cols="50" rows="7"%=Server.HTMLEncode(StrMessage)%/TEXTAREA&E4{!a6O1j?4W
/TD-R h kT/@&af*x
/TRQH cy,Zw
TR%oN5W e!NG~
TD align="right" colspan="3" ~8g5E'i$b7l
INPUT type="Submit" name="Action" value="Encrypt"UTzZS:W"pv
INPUT type="Submit" name="Action" value="Decrypt"3^%E,U v^+`
/TD
WL_/hj /TRnh9x"O7U n!aXH
/TABLE
,xHR}MQU*W4y2Y(o5z /FORM)MR8Z#ns*KrV
/BODYd uf+IFxH`4sp
/HTML
YFZ(E!a C @+_c   
Lp-|-H&A.[ (\1QTk_&A;G'^
clsrsa.asp   
xcwxD.V J
Wi v6YeGBG@9H:J:U %T2Wuq${0c"KP
rem 实现rsa加密与解密的vbs类文件
*Y*CAG^ rem 文章标题:在asp中通过vbs类实现rsa加密与解密8`V1u)R?1i
rem 收集整理:yanekL L;BfOd7ke
rem 联系:aspboy@263.net  H }W1@ S8N

zW ?+OrV!ws ' RSA Encryption Class
-U5rEhD '
.R sWtHZ ' .PrivateKey
1JQZ1x{ |{@'v,J ' Your personal private key. Keep this hidden.
-dv,cV.ih '6CTa!J.?6J
' .PublicKey.UBC4I/r@`@
' Key for others to encrypt data with.
J|kd!S '
z'O6``0^Ek ' .Modulus
jmoML;j+aF#Y ' Used with both public and private keys when encrypting%x-u^ ie5`pv
' and decrypting data.
!? eD0N;x '
&na]6Pb)g;d8c5?(x ' .GenKey()*LW$|,C.W k$}2j/L
' Creates Public/Private key set and Modulus9B$x/w"R|*E
'
I`v?!BU9LP ' .Crypt(pLngMessage, pLngKey) d,io1~FJ
' Encrypts/Decrypts message and returns
v.Q ~|BH4y p:k ' as a string.
9lr6[ lV '
M9r6P vJD0Z ' .Encode(pStrMessage)
)C4q(O!a)E7nq ' Encrypts message and returns in double-hex format}$BO:Tk3i
'
*Vo&N4d'Y2K ' .Decode(pStrMessage)$YU\O f*fi
' Decrypts message from double-hex format and returns a string
A#FO1\&l `CPc _ '
4?yI3bf8b Class clsRSA  _,j4c6`T.F'eE
|7H,hMT!FPv+U
Public PrivateKey
%j K!w:o2Q S Public PublicKey
5Z h8D4r p Public Modulus,@-w ^-a$Pr6T wjr

U)s @"il&R+Y'}}/wT Public Sub GenKey()bR.B ~?#M$F
Dim lLngPhi
OULAEt#e@2fW Dim q
\Ln7U:C5l Dim p  
V3?!_.[D 9U4{&J7uz%Ka
Randomize  |:N,x#?3]hOKI

6P'{H m1Y#y7X~V g Do
R+jV:`v Do   qg0wMfY

q_zrKe ' 2 random primary numbers (0 to 1000)
(Z/` b u:S)|8HQ Do
$?3N3F*fE4qY p = Rnd * 1000 \ 1
MW$V$~ p6o#u!m(k Loop While Not IsPrime(p)
2Qj+M;{j "]g3~!\As3Y
Do$JU'j fW:Fi
q = Rnd * 1000 \ 1(n!J6P#sk/PC
Loop While Not IsPrime(q)  
#Cx_4er3T5H$l
1@1\c x#mH7^_
F)IR9oQ5S4k ' n = product of 2 primes
Z/].d7c$uOoFbg Modulus = p * q \ 1
&eOW&h_d
)_MS0wOn}O Q)| ' random decryptor (2 to n)K/^c0Y#T:Hl\
PrivateKey = Rnd * (Modulus - 2) \ 1   2GO&qm;ocCf;fBS;O%R

7[U } UQ*NQ lLngPhi = (p - 1) * (q - 1) \ 1_ fVGQi9S8|
PublicKey = Euler(lLngPhi, PrivateKey)  
t$mRy'C3nP Y;r
K J1Hf2tL5JTc Loop While PublicKey = 0 Or PublicKey = 1  n@ Owy!~ h:Z
P^#ukHE)f
' Loop if we can't crypt/decrypt a byte "c&["X6D,v
Loop While Not TestCrypt(255)  q zfV~|+LrfL
8b6ezPD I
End Sub   RrQ-vu KEWx

4A$C,g.a8p*h#Q Private Function TestCrypt(ByRef pBytData)\7Pli)] ~
Dim lStrCrypted
WzP+G vw lStrCrypted = Crypt(pBytData, PublicKey)#Uw+B%z#^
TestCrypt = Crypt(lStrCrypted, PrivateKey) = pBytDatarZG4`t7bg)]}
End Function  
L1v)f8Q#M6UF 5EI,b?Z1M2b
Private Function Euler(ByRef pLngPHI, ByRef pLngKey)  
:qZ.|a y$X8V'O
^A7]+A [y+K Dim lLngR(3)7qRc eS
Dim lLngP(3)
x:L.F[+dm?x Dim lLngQ(3)  
Ae(}*K$zM7I4`| gK I\*C[N
Dim lLngCounter
?:QT Et Yn3V tF Dim lLngResultj:\^.s.@ji-pC ~9y

[P0r,{3X Euler = 0  
{$J/k)y_b *dP if$^r Pr(j
lLngR(1) = pLngPHI: lLngR(0) = pLngKey
O9{Q [W lLngP(1) = 0: lLngP(0) = 1
^-H1|B(a@)K lLngQ(1) = 2: lLngQ(0) = 0  +Fccu%y Ndm xK
*g/g'g.AC;o
lLngCounter = -1  
4a,[ w$vLx)l nZ
%_6?+~8_$~ Do Until lLngR(0) = 0  
O5\E-Q;e8D@_f T bM.~n eF
lLngR(2) = lLngR(1): lLngR(1) = lLngR(0)ZxX)g8[D$W3L
lLngP(2) = lLngP(1): lLngP(1) = lLngP(0)
n-k!P-SPAzw lLngQ(2) = lLngQ(1): lLngQ(1) = lLngQ(0)
c.\@2z UWD4@$@u w`c%ngr| u
lLngCounter = lLngCounter   1  
`2}&RB2A
PE7H!~xP3l lLngR(0) = lLngR(2) Mod lLngR(1)W:eYPl9n}
lLngP(0) = ((lLngR(2)\lLngR(1)) * lLngP(1))   lLngP(2)
,R_h&B NL| lLngQ(0) = ((lLngR(2)\lLngR(1)) * lLngQ(1))   lLngQ(2)  "Xc _ dwJT
m Z!U d;v|
Loop  $zPa7W:h9Ew3Z
3x _@&yV:X Nb\ k
lLngResult = (pLngKey * lLngP(1)) - (pLngPHI * lLngQ(1))  
X#LE;y9Wd3K-F9Rm8Z 5L$u\]9~!sn*N1q
If lLngResult  0 Thenja"I7k }1N TCq^
Euler = lLngP(1)
"nN\b a Else&XJw;Do3HpY
Euler = Abs(lLngP(1))   pLngPHI3R'v(R3]?%?w^7r h
End If  m uvJy } [`O ^
H*GR2~;bN2r
End Function
!nlUL+M3?+E2e'U
1PCFl's{3[ Public Function Crypt(pLngMessage, pLngKey)
(VU7Us%Zv(s(k On Error Resume Next
0_os{7`m g'[;YE\ Dim lLngMod
&ui0{$Jm1h0c5E Dim lLngResult
)RhcM;kZ+w Dim lLngIndex
rp.[bw+y If pLngKey Mod 2 = 0 Then(yN0^)|X
lLngResult = 1Q:Th^ L D&o
For lLngIndex = 1 To pLngKey / 2u2^^ n`%}kE
lLngMod = (pLngMessage ^ 2) Mod Modulus
;];tr ~2C ' Mod may error on key generation
F?H]#mz"B lLngResult = (lLngMod * lLngResult) Mod Modulus jx6Qr/\,`+e
If Err Then Exit Function
1Q^ b H}%pQ,_ Kv"e Next
6F-h%n1a n)` Else
+M| nxJ5KN~z lLngResult = pLngMessage7c(TF;[]D
For lLngIndex = 1 To pLngKey / 2,{#VA'se3m![
lLngMod = (pLngMessage ^ 2) Mod Modulus
^,]%pH^,i&l On Error Resume Next+o+d+@J Wn,kh
' Mod may error on key generation
'm }0a2\x lLngResult = (lLngMod * lLngResult) Mod Modulus
$Q([%h2_T0po If Err Then Exit Function
r9|"I"pI;a Next
l2W-B"ZS.F5~ End If
.OymT%n4ea$C Crypt = lLngResult
+uY|4^/r i_&x7e [ End Function  
!Z1om!wD1T -g+d UhN%Kn:L
Private Function IsPrime(ByRef pLngNumber)
*d'G9q/iI ] Dim lLngSquare
n},x TW;OrK Dim lLngIndex
ZY:a+F;k ` IsPrime = False }7]:\{w_%u]0q#X
If pLngNumber  2 Then Exit Function
-?y[5Qu?l3_S If pLngNumber Mod 2 = 0 Then Exit Function%T#x ^.l AYVQW
lLngSquare = Sqr(pLngNumber)
#m`8P"] [-FW&z[;z j For lLngIndex = 3 To lLngSquare Step 2 Y$jaQ+W)]5~kB
If pLngNumber Mod lLngIndex = 0 Then Exit Function{5_)_h:E\*Kw
Next
/z D g$z [3_ hC IsPrime = True
t7J!K)m7{1i End Function  xI e P0?"Q&^C

(h'O yC l6R Public Function Encode(ByVal pStrMessage)
XV8|w|$X Dim lLngIndex @!KEv!b N| Vp+ua
Dim lLngMaxIndex+lFy.s3_?
Dim lBytAscii
7ea5B*MP V%Fj Dim lLngEncrypted
o8t4NI%`-KU lLngMaxIndex = Len(pStrMessage):aL l4~S&Zd*q,@
If lLngMaxIndex = 0 Then Exit Function
.BK E/pM Q1u#@z E For lLngIndex = 1 To lLngMaxIndexW.oQ&k2D4J&{:]qKg
lBytAscii = Asc(Mid(pStrMessage, lLngIndex, 1))2m9@{.b.\Y:nI
lLngEncrypted = Crypt(lBytAscii, PublicKey)QS3F @ t{-KU UI
Encode = Encode  NumberToHex(lLngEncrypted, 4)
O;p0n#A Z Next
U A1m6zD'm1{ G;n End Function L2K-G D(`"H-[,\F
w p3[%e8r+s
Public Function Decode(ByVal pStrMessage)
6@({)i^N#o$O Dim lBytAscii
K},n3P3ME Dim lLngIndex
;c2|4T3BqS(e6e$m Dim lLngMaxIndex!cj m+I'C}kxb@
Dim lLngEncryptedData U xJ9\t8Q%u W
Decode = ""
o^Kj*U!oF X!h~@ lLngMaxIndex = Len(pStrMessage)2Cb!Y3s)} J
For lLngIndex = 1 To lLngMaxIndex Step 4
j~hQS/y!~ lLngEncryptedData = HexToNumber(Mid(pStrMessage, lLngIndex, 4))evf^nP'|
lBytAscii = Crypt(lLngEncryptedData, PrivateKey)
0S x iGL5@ Decode = Decode  Chr(lBytAscii)$F R v tY3]#`6n
Next
7sz%DqZ End Function
J I$jP0Z P5N%G W P/@fKS:a2Etw5r-U
Private Function NumberToHex(ByRef pLngNumber, ByRef pLngLength).h)a3G-~H@!o&`I9Q
NumberToHex = Right(String(pLngLength, "0")  Hex(pLngNumber), pLngLength)
1v wU,@_\ End Function  
i7c {f|
@J)P PX)r]4E Private Function HexToNumber(ByRef pStrHex)$pS Y#Dc*vq-a"R\
HexToNumber = CLng("h"  pStrHex) P+?/o R?P
End Function  
R'PZ|ZAGb^J 9ld]-`Ye
End Class
a4HR(]t!ETKb!b"W.^ %
"P0p$uD/b } 演示地址:http://www.cnaspol.com/myrsa/test.asp
页: [1]
查看完整版本: 在asp中通过vbs类实现rsa加密与解密