VBS 加解密 For CAPICOM
程序员文章站
2022-04-10 13:41:42
复制代码 代码如下:'***************************************************************************...
复制代码 代码如下:
'******************************************************************************
'
' this code and information is provided "as is" without warranty of any kind,
' either expressed or implied, including but not limited to the implied
' warranties of merchantability and/or fitness for a particular purpose.
'
' copyright (c) 1999- 2002. microsoft corporation. all rights reserved.
'
'******************************************************************************
'
' cencrypt.vbs
'
' this is a sample script to illustrate how to use the capicom's encrypteddata
' to encrypt/decrypt text file.
'
' note: for simplicity, this script does not handle exception.
'
'******************************************************************************
option explicit
const forreading = 1, forwriting = 2
' command.
const unknown = 0
const encrypt = 1
const decrypt = 2
' capicom's constants.
const capicom_encryption_algorithm_rc2 = 0
const capicom_encryption_algorithm_rc4 = 1
const capicom_encryption_algorithm_des = 2
const capicom_encryption_algorithm_3des = 3
const capicom_encryption_algorithm_aes = 4
const capicom_encryption_key_length_maximum = 0
const capicom_encryption_key_length_40_bits = 1
const capicom_encryption_key_length_56_bits = 2
const capicom_encryption_key_length_128_bits = 3
const capicom_encryption_key_length_192_bits = 4
const capicom_encryption_key_length_256_bits = 5
' command line arguments.
dim command : command = unknown
dim password : password = null
dim algorithm : algorithm = capicom_encryption_algorithm_rc2
dim keylength : keylength = capicom_encryption_key_length_maximum
dim verbose : verbose = false
dim filenames()
' first make sure the script is executed by cscript.exe.
if instr(1, ucase(wscript.fullname), "cscript.exe", vbtextcompare) = 0 then
wscript.echo "this script can only be executed by cscript.exe." & vbcrlf & vbcrlf &_
"you can either:" & vbcrlf & vbcrlf & _
"1. set cscript.exe as the default (run cscript //h:cscript), or" & vbcrlf & _
"2. run cscript.exe directly as in, cscript " & wscript.scriptname & "."
wscript.quit(-1)
end if
' parse the command line.
parsecommandline
' now process the command.
select case command
case encrypt
doencryptcommand filenames, algorithm, keylength, password
case decrypt
dodecryptcommand filenames, password
end select
wscript.quit(0)
' end main
'******************************************************************************
'
' subroutine: doencryptcommand
'
' synopsis : encrypt content of text file filenames(0).
'
' parameter : filenames - array of filenames.
'
' algorithm - encryption algorithm
'
' keylength - key size.
'
' password - secret password.
'
'******************************************************************************
sub doencryptcommand (filenames, algorithm, keylength, password)
dim content
dim message
dim encrypteddata
' create the encrypteddata object.
set encrypteddata = createobject("capicom.encrypteddata")
' set algorithm, key size, and encryption password.
encrypteddata.algorithm.name = algorithm
encrypteddata.algorithm.keylength = keylength
encrypteddata.setsecret password
' display main title.
wscript.stdout.writeline "encrypting text file " & filenames(0) & "."
wscript.stdout.writeline
' display more detail for verbose operation.
if verbose then
displaydetail encrypteddata
end if
' load content of text file to be encrypted.
loadfile filenames(0), content
' now encrypt it.
encrypteddata.content = content
message = encrypteddata.encrypt
' finally, save encrypted message to filenames(1).
savefile filenames(1), message
wscript.stdout.writeline "successful - encrypted message saved to " & filenames(1) & "."
' free resources.
set encrypteddata = nothing
end sub ' end doencryptcommand
'******************************************************************************
'
' subroutine: dodecryptcommand
'
' synopsis : decrypt an encrypted file.
'
' parameter : filenames - array of filenames.
'
' password - secret password.
'
'******************************************************************************
sub dodecryptcommand (filenames, password)
dim message
dim encrypteddata
' create the encrypteddata object.
set encrypteddata = createobject("capicom.encrypteddata")
' set decryption password.
encrypteddata.setsecret password
' display main title.
wscript.stdout.writeline "decrypting encrypted text file " & filenames(0) & "."
wscript.stdout.writeline
' load the encrypted message.
loadfile filenames(0), message
' now decrypt it.
encrypteddata.decrypt(message)
' display more detail for verbose operation.
if verbose then
displaydetail encrypteddata
end if
' finally, save decrypted content to filenames(1).
savefile filenames(1), encrypteddata.content
wscript.stdout.writeline "successful - decrypted content saved to " & filenames(1) & "."
' free resources.
set encrypteddata = nothing
end sub ' end dodecryptcommand
'******************************************************************************
'
' subroutine: loadfile
'
' synopsis : read content of a text file.
'
' parameter : filename - input text filename.
'
' buffer - string buffer to receive the text file content.
'
'******************************************************************************
sub loadfile (filename, buffer)
dim fso
set fso = createobject("scripting.filesystemobject")
if not fso.fileexists(filename) then
wscript.stdout.writeline "error: file " & filename & " not found."
wscript.quit(-5)
end if
dim ts
set ts = fso.opentextfile(filename, forreading)
buffer = ts.readall
end sub ' end loadfile
'******************************************************************************
'
' subroutine: savefile
'
' synopsis : save string to file.
'
' parameter : filename - output filename.
'
' buffer - string buffer to be saved.
'
'******************************************************************************
sub savefile (filename, buffer)
dim fso
set fso = createobject("scripting.filesystemobject")
dim ts
set ts = fso.opentextfile(filename, forwriting, true)
ts.write buffer
end sub ' end savefile
'******************************************************************************
'
' subroutine: displaydetail
'
' synopsis : display detail information.
'
' parameter : encrypteddata - encrypteddata object.
'
'******************************************************************************
sub displaydetail (encrypteddata)
dim algonames(4)
algonames(0) = "rc2"
algonames(1) = "rc4"
algonames(2) = "des"
algonames(3) = "3des"
algonames(4) = "aes"
wscript.stdout.writeline "algorithm : " & algonames(encrypteddata.algorithm.name)
wscript.stdout.write "key length: "
select case encrypteddata.algorithm.keylength
case capicom_encryption_key_length_40_bits
wscript.stdout.writeline "40 bits"
case capicom_encryption_key_length_56_bits
wscript.stdout.writeline "56 bits"
case capicom_encryption_key_length_128_bits
wscript.stdout.writeline "128 bits"
case capicom_encryption_key_length_192_bits
wscript.stdout.writeline "192 bits"
case capicom_encryption_key_length_256_bits
wscript.stdout.writeline "256 bits"
case else
wscript.stdout.writeline "maximum"
end select
wscript.stdout.writeline
end sub ' end displaydetail
'******************************************************************************
'
' subroutine: parsecommandline
'
' synopsis : parse the command line, and set the options accordingly.
'
' parameter : none
'
'******************************************************************************
sub parsecommandline
' constants for command line parsing states.
const arg_state_command = 0
const arg_state_options = 1
const arg_state_algorithm = 2
const arg_state_length = 3
const arg_state_filename = 4
const arg_state_password = 5
const arg_state_end = 6
' parse command line.
dim arg
dim argstate : argstate = arg_state_command
for each arg in wscript.arguments
select case argstate
case arg_state_command
select case ucase(arg)
case "encrypt"
command = encrypt
case "decrypt"
command = decrypt
case else
displayusage
end select
argstate = arg_state_options
case arg_state_options
select case ucase(arg)
case "-alg", "/alg"
argstate = arg_state_algorithm
case "-length", "/length"
argstate = arg_state_length
case "-v", "/v"
verbose = true
case "-?", "/?"
displayusage
case else
if left(arg, 1) = "-" or left(arg, 1) = "/" then
displayusage
else
redim filenames(0)
filenames(0) = arg
end if
argstate = arg_state_filename
end select
case arg_state_algorithm
if left(arg, 1) = "-" or left(arg, 1) = "/" then
displayusage
else
select case ucase(arg)
case "rc2"
algorithm = capicom_encryption_algorithm_rc2
case "rc4"
algorithm = capicom_encryption_algorithm_rc4
case "des"
algorithm = capicom_encryption_algorithm_des
case "3des"
algorithm = capicom_encryption_algorithm_3des
case "aes"
algorithm = capicom_encryption_algorithm_aes
case else
displayusage
end select
end if
argstate = arg_state_options
case arg_state_length
if left(arg, 1) = "-" or left(arg, 1) = "/" then
displayusage
else
select case ucase(arg)
case "40"
keylength = capicom_encryption_key_length_40_bits
case "56"
keylength = capicom_encryption_key_length_56_bits
case "128"
keylength = capicom_encryption_key_length_128_bits
case "192"
keylength = capicom_encryption_key_length_192_bits
case "256"
keylength = capicom_encryption_key_length_256_bits
case "max"
keylength = capicom_encryption_key_length_maximum
case else
displayusage
end select
end if
argstate = arg_state_options
case arg_state_filename
if left(arg, 1) = "-" or left(arg, 1) = "/" then
displayusage
else
redim preserve filenames(ubound(filenames) + 1)
filenames(ubound(filenames)) = arg
end if
argstate = arg_state_password
case arg_state_password
if left(arg, 1) = "-" or left(arg, 1) = "/" then
displayusage
else
password = arg
end if
argstate = arg_state_end
case else
wscript.stdout.writeline "internal script error: unknown argument state (" & cstr(argstate) & ") encountered."
wscript.quit(-3)
end select
next
' make sure we are in good state.
if argstate <> arg_state_end then
displayusage
end if
end sub ' parsecommandline
'******************************************************************************
'
' subroutine: displayusage
'
' synopsis : display the usage screen, and then exit with a negative error
' code.
'
' parameter : none.
'
'******************************************************************************
sub displayusage
select case command
case unknown
wscript.stdout.writeline "usage: cencrypt command [options] infile outfile password"
wscript.stdout.writeline
wscript.stdout.writeline "command:"
wscript.stdout.writeline
wscript.stdout.writeline " encrypt -- encrypt a text file"
wscript.stdout.writeline " decrypt -- decrypt an encrypted text file"
wscript.stdout.writeline
wscript.stdout.writeline "for help on a specific command, enter ""cencrypt command -?"""
case encrypt
wscript.stdout.writeline "usage: cencrypt encrypt [options] contentfile encryptedfile password"
wscript.stdout.writeline
wscript.stdout.writeline "the encrypt command is used to encrypt a text file based on a secret password."
wscript.stdout.writeline "encrypting protects the data from being read by others except those who know"
wscript.stdout.writeline "the secret password."
wscript.stdout.writeline
wscript.stdout.writeline "options:"
wscript.stdout.writeline
wscript.stdout.writeline " -alg <algorithm> -- rc2, rc4, des, 3des, or aes (default to rc2)"
wscript.stdout.writeline " -length <key length> -- 40, 56, 128, 192, 256, or max (default to max,"
wscript.stdout.writeline " and ignored for des or 3des)"
wscript.stdout.writeline " -v -- verbose operation"
wscript.stdout.writeline " -? -- this help screen"
wscript.stdout.writeline
wscript.stdout.writeline " contentfile -- text file to be encrypted"
wscript.stdout.writeline
wscript.stdout.writeline " encryptedfile -- encrypted text file"
wscript.stdout.writeline
wscript.stdout.writeline "note: all non-fatal invalid options for this specific command will be ignored."
wscript.stdout.writeline
case decrypt
wscript.stdout.writeline "usage: cencrypt decrypt [options] encryptedfile contentfile password"
wscript.stdout.writeline
wscript.stdout.writeline "the decrypt command is used to decrypt an encrypted text file."
wscript.stdout.writeline
wscript.stdout.writeline "options:"
wscript.stdout.writeline
wscript.stdout.writeline " -v -- verbose operation"
wscript.stdout.writeline " -? -- this help screen"
wscript.stdout.writeline
wscript.stdout.writeline " encryptedfile -- encrypted text file"
wscript.stdout.writeline
wscript.stdout.writeline " contentfile -- decrypted text file"
wscript.stdout.writeline
wscript.stdout.writeline "note: all non-fatal invalid options for this specific command will be ignored."
wscript.stdout.writeline
case else
wscript.stdout.writeline "internal script error: unknown help state (command = " & cstr(command) & ")."
wscript.quit(-2)
end select
wscript.quit(-1)
end sub ' end displayusage