在asp中通过vbs类实现rsa加密与解密
本文章有两文件组成/ |7 r' d/ s: T
test.asp 测试演示文件9 P7 J" \' m; a
clsrsa.asp 实现rsa加密与解密的vbs类文件
9 F" a! L, m* t! n" h* g l7 P下面是代码:
3 D* f1 J3 I0 }# O2 I, b+ c# X7 B/ @1 D, d9 p7 l
8 ]1 C+ s# @$ [; z7 G* j+ N2 T* Q; _9 v! a. Y' p U+ I; G4 w. \+ ^* |3 |
1. test.asp , S8 b/ u: o- v J, \; R9 a
9 I5 Z- S. n( y& l& B% r
%; ~. r9 u0 ?) E4 Z1 K. I$ [6 v
rem 文章标题:在asp中通过vbs类实现rsa加密与解密
' b3 w1 ?5 E( K# }5 r" y7 ~rem 收集整理:yanek! G7 H5 E7 ]. O. h' l9 u1 q H
rem 联系:aspboy@263.net
1 Z4 o; a+ U* D# ^8 J8 t$ I) o4 |$ B: a
%7 c7 l3 g: R. L- f
%Option Explicit%
; j: E/ m0 x) g2 Y!--#INCLUDE FILE="clsRSA.asp"--# y2 K! l2 e" ]: ^1 E
% $ N# a3 D. T- \% z9 F/ L* _' z4 z9 l
6 l( q. ^6 Y$ v6 ?) Q" EDim LngKeyE D8 o: _9 o6 S! [2 w, h0 X( ^( P# i
Dim LngKeyD; ?% v V5 `$ }! K# k \: N
Dim LngKeyN
9 v4 Q7 B# @/ _0 G% dDim StrMessage
: j- s6 h* s( l' u* zDim ObjRSA
9 r v1 X8 V+ h3 U. gIf Not Request.Form = "" Then $ Q3 t6 s2 m/ H1 U3 n
) p6 x1 ^& x1 D1 ?
LngKeyE = Request.Form("KeyE")
: z- h, O( Q" i/ G2 o$ S1 SLngKeyD = Request.Form("KeyD")" A( D( B9 h( A* Y
LngKeyN = Request.Form("KeyN")
4 ^5 G: g/ J8 V1 O5 B& w* g+ YStrMessage = Request.Form("Message")
5 P! G3 [/ n7 ~
% |+ _6 ]% N. g6 P; T9 ~' H5 aSet ObjRSA = New clsRSA! [0 f% u8 B/ R
5 P m4 Y1 |* S1 q# H) XSelect Case Request.Form("Action")1 m' s+ ~- x% t, G
Case "Generate Keys"
' F" G' O8 D$ B& g3 h" f- jCall ObjRSA.GenKey()
3 y h& ~: n! S4 F! K8 QLngKeyE = ObjRSA.PublicKey
/ @7 s$ `0 S$ m9 |: U1 Y, |LngKeyD = ObjRSA.PrivateKey- {8 w* S! P4 M3 q
LngKeyN = ObjRSA.Modulus
7 {6 c4 R- j0 k- |! s6 j$ |Case "Encrypt"
4 W; D( [- K- f4 _# U7 S- `ObjRSA.PublicKey = LngKeyE, k* E' y3 W/ J; g& t7 x3 `+ I
ObjRSA.Modulus = LngKeyN, y" d8 e8 F8 p4 p( {
StrMessage = ObjRSA.Encode(StrMessage)
- R4 S3 U0 N0 I1 ~6 b7 E. FCase "Decrypt"" r9 @+ Z* y, e
ObjRSA.PrivateKey = LngKeyD7 U, v i: X" v/ q y
ObjRSA.Modulus = LngKeyN3 r) v& N( a5 d7 n0 ^3 U
StrMessage = ObjRSA.Decode(StrMessage)
5 W3 i" h* \+ V# {9 u' G" |4 b0 eEnd Select
% @% d9 G7 F! O# j5 s) ~
I" \$ y& {6 Y8 j5 g" uSet ObjRSA = Nothing
+ L ]: z7 N0 O- z' p9 M5 X1 H1 X# l6 R' b6 A( H7 H
End If
9 P" A" @! v, j" S, h2 ^%9 G% n2 x- n2 P; b0 ~
HTML
+ w! v) J7 m- l5 d) b- E8 {HEAD
: o8 i* w" q8 S$ n! R- l2 eTITLERSA Cipher Demonstration/TITLE
1 G0 E, V: d& }$ r/HEAD
0 E/ D4 j7 C0 D8 \" e$ W) a: kBODY8 ~& V( P- a3 A9 C8 y( e
H1RSA Cipher Demonstration/H1
8 [% u( r. g% I1 X1 O" PP0 V) w- V! c8 P; b1 r6 g
You will first need to generate your public/privage key-pair4 X6 F9 d4 _, K, D* P9 ^6 c+ u
before you can encrypt/decrypt messages.) K# j4 H$ u% \( J1 _7 {
/P1 r2 G. ~8 ?5 g& d
FORM method="post"
. c, E6 Y3 J/ Z8 w0 V& l0 UTABLE
; Z4 Q2 m' i! l$ H) VTR9 O, M7 O8 v0 B
TDPublic Key/TD
$ P6 O, G$ y* |) YTDINPUT name="KeyE" value="%=Server.HTMLEncode(LngKeyE)%"/TD
. i! F U* E0 u; aTD rowspan="3"
/ D$ z& u+ k/ y( W& P( q- \5 `INPUT type="Submit" name="Action" value="Generate Keys"2 S3 @. F$ }( @% T& d$ y
/TD& x6 `7 P. t m) I
/TR4 t; e! M2 P, Y2 o% h$ v, T7 u- p
TR* w2 X: T( u. o: I( Y! j$ f
TDPrivate Key/TD
( |2 a1 A5 r: d1 b. W9 ?+ [5 {TDINPUT name="KeyD" value="%=Server.HTMLEncode(LngKeyD)%"/TD8 U9 ]3 `8 j6 ~* Q( B3 M9 N
/TR
8 U6 e d% e4 [9 Q! HTR
& j! v9 p/ T* ^5 M# h) }TDModulus/TD
: W9 H* Y& | c4 y TTDINPUT name="KeyN" value="%=Server.HTMLEncode(LngKeyN)%"/TD
5 K W$ M3 ~: L2 i& [/TR+ B3 [% I. o$ {# X7 E! | }- W
TR
0 s' P$ F0 p1 d$ d- {0 n* NTD colspan="3"8 K) W4 M7 x' A) R+ V! E g8 Y; e
Test Message:BR
- E D8 O: `# r6 E) Q, V+ Y3 ~0 V& UTEXTAREA name="Message" cols="50" rows="7"%=Server.HTMLEncode(StrMessage)%/TEXTAREA7 E+ {. B4 N6 c- _% G Z" k5 ?' d0 _
/TD/ N; N: [ d8 s' N
/TR
9 m* f( G3 p5 V5 f" pTR
8 \! s# [# c [3 \. _; {TD align="right" colspan="3"
8 X; |* f3 N7 F9 B ]INPUT type="Submit" name="Action" value="Encrypt"
; I' e7 v" e1 j1 \* P( P0 [' JINPUT type="Submit" name="Action" value="Decrypt"9 F0 b6 |; Y* {
/TD& \- q$ A! E; `9 w
/TR9 r; ?$ C( y# ]% b
/TABLE/ x" _. s2 q( M3 l! {) f
/FORM
* S, d3 i$ e0 C8 @* \. {, o/BODY, A& r$ m: ]/ [' j; \) M$ o+ `- u
/HTML
: z& c* g; ]. G k, d+ l
. d8 x! o8 [8 Y; p7 L- N9 E- H' V7 ]8 Q+ v1 J
clsrsa.asp 3 O8 }3 R! X0 y4 S! M, b
' L$ l; o3 y/ ~/ h% {
%- x7 u }0 _6 X5 R8 V z. \6 K
rem 实现rsa加密与解密的vbs类文件. U/ i3 t2 L+ c [0 G- Q9 h& M3 ^
rem 文章标题:在asp中通过vbs类实现rsa加密与解密
+ w1 k X& C+ Rrem 收集整理:yanek q# E$ O, B1 H9 y
rem 联系:aspboy@263.net
% j3 J4 y" F2 Z5 H
2 k1 J5 e0 G* x" i! T, l3 W4 Y' RSA Encryption Class, [: h+ P3 O8 L$ X& F" M& V
'
/ g7 h# _8 S% G$ _0 J' .PrivateKey
! Q" A* g3 k2 Y0 W8 p' Your personal private key. Keep this hidden.: M" L! Y$ s' \& U' j$ F
'$ ]: @4 s2 c! D: A
' .PublicKey
% I, |: O& _: Z: y- y, P4 D- T' Key for others to encrypt data with.( ~, O2 l1 h' `- |( C* T( ]
'
% v# L6 w& l: {2 ]4 k. |6 K4 R' .Modulus, u+ N. x ^# Y- R P5 D
' Used with both public and private keys when encrypting3 `3 Y7 |# L R7 y
' and decrypting data.
' C9 P# N# d9 G6 o'
# C/ Q4 @0 k Q" ~6 ?% F, H' .GenKey()3 z1 |# b* p$ ]+ o% f
' Creates Public/Private key set and Modulus9 o' @: P6 j* W- }$ S5 s" n
'
& X# E# O) e; y' q9 E7 }% \1 ] Z' .Crypt(pLngMessage, pLngKey)
* O, s0 n( X! b( `$ ^& X' Encrypts/Decrypts message and returns
H; \* ?* ?" Z% l. B' as a string.
5 f$ X* I$ ?! [0 M'3 I% Q% t0 Y, @) d
' .Encode(pStrMessage)
0 V# O1 Z$ k2 {' Encrypts message and returns in double-hex format2 d& t6 `! x. p8 F( T+ |* p
') y7 s% J+ Z" ~: m+ Y& t
' .Decode(pStrMessage)
2 y+ `% \: d/ U& ^ r: [' Decrypts message from double-hex format and returns a string
{0 J6 ?& t! A8 F6 \! [, w'2 K6 P, B# V2 O+ {& _7 }9 R' Q; @
Class clsRSA
! [ x+ ?- v% [' W% l' \( t \# W; k& T# R4 r
Public PrivateKey
5 ^7 o" }0 h$ |6 P5 HPublic PublicKey
h% Z. c& [, x: G3 b) o' _Public Modulus
& O; w3 W* ~7 E! |( C2 @9 R% s# V5 W
Public Sub GenKey()- [( {$ j3 I% E3 u/ V
Dim lLngPhi) Z e( ~; q9 t
Dim q8 T4 i; h, j+ g: K! E
Dim p 8 m! U5 S9 }1 C. K( Q5 e8 |$ g1 K
) M T7 ]3 h; h) Y- y5 T( URandomize * I4 y6 b/ f, i' c) n
3 W' u6 Y1 u9 D2 NDo
/ ]4 f- ~; W2 M# L: W4 `& M" A) g6 QDo
4 ]' H, Z" X& M! @' H6 o
$ O) {6 E; \0 |# H+ E' ^6 V$ z' 2 random primary numbers (0 to 1000), `! D& o' }' F" A, ?/ ~
Do3 A3 a" h l) c! X) D8 Q
p = Rnd * 1000 \ 1
- f, }# ?% J* ], ?) ILoop While Not IsPrime(p)( V ]1 B) Y$ D) L
1 t3 ]# I3 l$ _- B1 g" C
Do* J+ ?6 y2 `/ d6 v- t, m- f, E
q = Rnd * 1000 \ 1" D* O+ N6 w& ]# H0 m- J! W
Loop While Not IsPrime(q) 7 r1 ^9 Q- l0 P" q. x
# u0 X& S$ b4 c2 p1 o6 I7 h! L* q( C! ]
' n = product of 2 primes
. Y0 v6 z9 Y+ P8 \* [6 MModulus = p * q \ 15 x) Y) O: m6 O3 D5 d8 J2 x8 U
~' G& R' {; ~4 l! R% q+ n' random decryptor (2 to n)
$ w2 g% i9 G* R' Q/ yPrivateKey = Rnd * (Modulus - 2) \ 1 2
0 {# j5 d' U) U1 n& E: _8 H% Y( D, ]
) l& p7 D) i1 R7 D! vlLngPhi = (p - 1) * (q - 1) \ 1
7 m, Y9 p( _7 Q9 @% yPublicKey = Euler(lLngPhi, PrivateKey)
9 ]( D" N7 o" z) g& a3 ]) e
! f! i. z2 m6 V% }2 k5 C9 OLoop While PublicKey = 0 Or PublicKey = 1
/ C/ ^3 }, ]. r7 g( y7 q+ p# J4 Z7 @) E
' Loop if we can't crypt/decrypt a byte , `0 }, ^2 i" @8 @9 }& w3 `: @
Loop While Not TestCrypt(255)
" u; |. Y0 s% }$ m
, i0 Y( E9 B, ]# i; HEnd Sub
6 Y: W3 x2 s* M; i$ }7 T* E/ X7 Y
Private Function TestCrypt(ByRef pBytData)
' B+ P8 q5 v3 rDim lStrCrypted
( N" [% G2 ]1 e* d) l) rlStrCrypted = Crypt(pBytData, PublicKey)
" ^$ J" u _8 \2 h qTestCrypt = Crypt(lStrCrypted, PrivateKey) = pBytData. C% Y( T- A9 Z. H
End Function 1 b2 a5 f+ C, u& r2 l
# J! Z9 k2 o b2 w0 a, |1 w* r6 |2 mPrivate Function Euler(ByRef pLngPHI, ByRef pLngKey)
& v! y3 o9 O; ?% ^2 g; y- F' W9 B: }# L7 Y! t
Dim lLngR(3)5 |- ^8 Y: ~$ ^% a
Dim lLngP(3)
. {) @: f2 T5 ?Dim lLngQ(3)
# O8 w1 v3 Z9 J/ G% Q- o& m/ w9 P7 u" A
Dim lLngCounter( k5 I' b) _4 u
Dim lLngResult
/ C I$ S! a/ _9 t z# \5 N ]: L, `0 E$ ]
Euler = 0 0 y5 P3 H& R% n/ v% L) h' I
& l2 ?& e6 j' h! v6 y3 K# L3 ?lLngR(1) = pLngPHI: lLngR(0) = pLngKey
/ i. C: `: q" p1 PlLngP(1) = 0: lLngP(0) = 15 `# \4 Q5 ^5 V' g0 C+ N) N7 s+ A! \
lLngQ(1) = 2: lLngQ(0) = 0
: c2 f* V" C. |. o
$ f* a9 F8 S* }& ylLngCounter = -1 0 _0 S1 x$ h$ \- u5 D+ k
# |4 q1 q' M) t: W* U0 r; iDo Until lLngR(0) = 0 % O" ~, \7 p& }. n1 Q
& t6 b" D9 u' u& }8 K% p: z% f& x
lLngR(2) = lLngR(1): lLngR(1) = lLngR(0)
0 q) b/ K) l) X, `0 U: n" QlLngP(2) = lLngP(1): lLngP(1) = lLngP(0)( Z4 a `. s7 ~
lLngQ(2) = lLngQ(1): lLngQ(1) = lLngQ(0)
* B3 Q# R% z" D5 V$ A% x5 }1 L# c Q+ ~) u. N% I
lLngCounter = lLngCounter 1
7 ]% Y7 v; \4 e$ k$ w
t Y# O: L, ] ^; i$ JlLngR(0) = lLngR(2) Mod lLngR(1)
; N5 I* M3 W$ t6 q. ]' YlLngP(0) = ((lLngR(2)\lLngR(1)) * lLngP(1)) lLngP(2)+ U4 f e$ t4 z7 K* C
lLngQ(0) = ((lLngR(2)\lLngR(1)) * lLngQ(1)) lLngQ(2) : \, y! D4 D( R- r
' @( e! Z2 J! F Y* ]6 Y4 W: r0 t
Loop m* I7 ^9 M$ C# o5 g/ n3 S0 D
R8 ^8 a6 ]4 _) MlLngResult = (pLngKey * lLngP(1)) - (pLngPHI * lLngQ(1)) . f* |! H$ C+ }; d- x) G% G. J
2 H; S% S i. d. L: b. C* I. jIf lLngResult 0 Then
- X7 P# E: }9 W" Z- UEuler = lLngP(1)
M# u$ V! U9 t( J, d B; UElse
) S) s8 ]; U' ^Euler = Abs(lLngP(1)) pLngPHI
j: Y& e4 B- [End If
) l/ u) t# ~" h
0 C% S* E# g, _8 y6 t/ HEnd Function
, V6 }9 ?6 B6 l# L0 N0 m, `0 d
& T7 T* g0 q+ ?Public Function Crypt(pLngMessage, pLngKey): G2 e6 S2 `( m, m5 @2 R
On Error Resume Next$ u. ^" X4 }- J( t
Dim lLngMod8 b" J! U" A; G: j
Dim lLngResult$ @" u- B& E- ~. B8 X
Dim lLngIndex" r9 b% O# K* W0 K' j2 |$ I, g
If pLngKey Mod 2 = 0 Then
% M0 N3 G" P0 [6 alLngResult = 19 @7 Y0 E2 e8 f+ V, o T! X: z
For lLngIndex = 1 To pLngKey / 2
7 |! }) `. K; c7 m( U9 R' m$ jlLngMod = (pLngMessage ^ 2) Mod Modulus X) V+ P& J \) b0 ~! }( k# A
' Mod may error on key generation
! e9 q- p. B4 p/ C: O3 |lLngResult = (lLngMod * lLngResult) Mod Modulus & |0 }0 l, K2 c) _ f
If Err Then Exit Function
F, f H$ g# t- G" l; ]2 yNext" ^+ a5 `3 [1 K n
Else& g5 f. J5 L' _- R$ x, a4 Q
lLngResult = pLngMessage2 W3 y0 h4 z* Y, l
For lLngIndex = 1 To pLngKey / 2
7 |# j/ }' r6 D9 d3 x2 \lLngMod = (pLngMessage ^ 2) Mod Modulus. X b2 l( a G3 a
On Error Resume Next
3 n Q; ~% z2 [! f2 M4 ]1 r$ q1 a' Mod may error on key generation
3 P! O+ s1 ]* U+ E4 `1 C e% e+ V# dlLngResult = (lLngMod * lLngResult) Mod Modulus: ~. b" D5 [/ h( m$ ~7 ^0 v
If Err Then Exit Function5 q' z2 F, K- X/ R' U" A0 j" O
Next! ?+ w8 C! F- a& [
End If
3 H9 v$ X @0 j6 ?& X& dCrypt = lLngResult
( x( p& D: f) q* rEnd Function 1 u$ S* [5 M7 L- V( _
0 h6 ]5 {5 k+ c Y" P4 ^1 ?6 ^
Private Function IsPrime(ByRef pLngNumber)% J Y1 ~. ]' a1 h: J1 y: x4 Q
Dim lLngSquare
0 ^ i2 u) T! s1 Q' G5 C) yDim lLngIndex
: q4 r9 j1 {- j ^4 BIsPrime = False
' ~- _ F' E' v8 p4 V8 N ~$ eIf pLngNumber 2 Then Exit Function) I, D$ Q- a& j+ C4 u3 }6 d
If pLngNumber Mod 2 = 0 Then Exit Function
+ I2 n0 J& k% n) U$ klLngSquare = Sqr(pLngNumber)
# u4 o, ]6 k" {$ S) Q1 A' ^For lLngIndex = 3 To lLngSquare Step 2
* M: _" h0 Y' y* ?) @; |If pLngNumber Mod lLngIndex = 0 Then Exit Function* z9 z& n7 l" e1 n2 T
Next
* w' z) u; A a. N. s2 Y8 P- TIsPrime = True
) Y3 `5 r8 i) m/ i) T* Z2 [End Function 3 e+ |5 l; c6 ?5 w$ I4 e* `
* I2 H. V; _+ d: g: D P
Public Function Encode(ByVal pStrMessage)
# F1 r& Q3 E4 J \8 U2 WDim lLngIndex
& s- n& d; j& d# q5 X+ |, Q7 \Dim lLngMaxIndex
, X& b' w" Q, m1 N: fDim lBytAscii
, I @( }! R/ P, Q0 ZDim lLngEncrypted
, O; g& W2 I# d2 ]: \6 glLngMaxIndex = Len(pStrMessage)* l6 t5 k. a7 Z
If lLngMaxIndex = 0 Then Exit Function- r5 G8 h$ c; a* h
For lLngIndex = 1 To lLngMaxIndex
% L4 o7 u o2 c6 T1 mlBytAscii = Asc(Mid(pStrMessage, lLngIndex, 1))8 R3 {: v2 F- g
lLngEncrypted = Crypt(lBytAscii, PublicKey). F& ~& J5 A, |6 _) i2 r* R
Encode = Encode NumberToHex(lLngEncrypted, 4) U) u) A% n! V7 |; U$ @7 g
Next' I# a9 O8 e/ P& S
End Function
( @7 b5 A. ~9 {6 A; D$ t. v. z
" l' e' j" G C0 `+ D+ s8 _Public Function Decode(ByVal pStrMessage)0 u1 t0 w* L( T9 D' h
Dim lBytAscii
1 z. j# \7 R2 N# H# W" aDim lLngIndex# \; y! x+ ]3 ^4 Z0 t
Dim lLngMaxIndex e% N, F" a2 X! O3 C
Dim lLngEncryptedData2 k# B$ Y1 R( B; [ z' W
Decode = ""4 d# g5 w1 B/ N& x$ {4 {4 ^5 e. q
lLngMaxIndex = Len(pStrMessage)0 `! B1 ^1 M/ G2 j( @( |( t& D/ r9 ^
For lLngIndex = 1 To lLngMaxIndex Step 4
1 y( B \* C, n1 R$ K' m. y5 slLngEncryptedData = HexToNumber(Mid(pStrMessage, lLngIndex, 4))$ s+ `+ R3 k! S$ e" c) n0 f) `& Z
lBytAscii = Crypt(lLngEncryptedData, PrivateKey): r. p8 i" L7 J. {3 |* d+ Q w- d3 p' U
Decode = Decode Chr(lBytAscii)
1 B) a Z n4 V3 e" NNext
0 Q4 g1 e6 A9 ]: }End Function6 v$ p6 l# X8 j: c z/ z" j& Z
" ^1 {( u$ Z& h+ q% s* Q) dPrivate Function NumberToHex(ByRef pLngNumber, ByRef pLngLength)5 ^* d+ f; S+ H# R
NumberToHex = Right(String(pLngLength, "0") Hex(pLngNumber), pLngLength)
2 N2 _& J# M _6 P Z4 a$ ~! HEnd Function
) c. |( z% @) X" p! \( q& h
4 r' k; t& |+ F0 JPrivate Function HexToNumber(ByRef pStrHex); t7 \# h6 H/ p
HexToNumber = CLng("h" pStrHex)
& e! @1 C9 c5 t) d& s9 g0 ~5 H7 pEnd Function [9 @& `- R" X
+ K3 L [ {# [( b+ t
End Class
0 O. z* P" }. M, y G8 N%% f# B" `/ {- I8 }
演示地址:http://www.cnaspol.com/myrsa/test.asp
点击图标进入精品网摘收藏 欢迎大家加入网络收藏夹