关于ASP版的RSA签名算法, 高手来帮忙看下,问题出在哪里?有没有调试成功的?

在网上看到一篇“asp版 vbscript RSA公钥加密 / 私钥解密 / 私钥签名 / 公钥验签(支持中文)分段加密解密”的文章,然后按照他的步骤一步一步操作下来,但就是调试不成功,不知怎么回事?

具体代码如下:

<%
'@ ---------------------------------------------------------------
'@ title: xmasp_rsa
'@ author: ekede.com
'@ date: 2020-10-28
'@ description: RSA 公钥加密->私钥解密 , 私钥签名->公钥验签
'@ 支持 MD5withRSA,SHA1withRSA,SHA256withRSA,SHA384withRSA 和 SHA512withRSA
'@ ---------------------------------------------------------------
class xmasp_rsa
 
	private utf8,enc
	private privatekey_,publickey_
 
	'@ privatekey: your personal private key.  keep this hidden. need c# format.
	public property get privatekey
		privatekey = privatekey_
	end property
	public property let privatekey(value)
		privatekey_ = value
		enc.fromxmlstring(privatekey_)
		publickey_ = enc.toxmlstring(false)
	end property
 
	'@publickey: key for others to encrypt data with.
	public property get publickey
		publickey = publickey_
	end property
	public property let publickey(value)
		publickey_ = value
		enc.fromxmlstring(publickey_)
	end property
 
	private sub class_initialize()
		dim xmasp_rsa
		xmasp_rsa  = "xmasp应用框架 - 扩展包"
		set utf8   = server.createobject("system.text.utf8encoding")
		set enc = server.createobject("system.security.cryptography.rsacryptoserviceprovider")
		createkey()
	end sub
	private sub class_terminate()
		set enc = nothing
		set utf8   = nothing
	end sub
 
	'返回包含当前 RSA 对象的密钥的 XML 字符串
	public sub createkey()
		privatekey_ = enc.toxmlstring(true)	'表示同时包含 RSA 公钥和私钥[Modulus Exponent P Q DP DQ D InverseQ]
		publickey_  = enc.toxmlstring(false)	'表示仅包含公钥[ Modulus Exponent]
	end sub
 
	'@encrypt(byref str): 公钥加密
	public function encrypt(byref str)
		'dim bytes
		'bytes   = utf8.getbytes_4(str)
		'encrypt = bytes2base64(rsaencrypt((bytes)))
 
		'【分块加密】
		'.NET Framework 中提供的 RSA 算法规定:
		'待加密的字节数不能超过密钥的长度值除以 8 再减去 11(即:RSACryptoServiceProvider.KeySize / 8 - 11),
		'而加密后得到密文的字节数,正好是密钥的长度值除以 8(即:RSACryptoServiceProvider.KeySize / 8)。
		'所以,如果要加密较长的数据,则可以采用分段加解密的方式。
 
		if str="" then encrypt="" : exit function
		dim blocksize:blocksize = enc.keysize / 8 - 11	'分块的最大字节数,如:2048/8-11=245
 
		'得到字节数
		'dim na
		'na = ubound(bytes) + 1
		'na = lenb(bytes)
 
		dim i,s,sk,bytes
		dim k:k = 0
		dim n:n = len(str) - 1
		for i=0 to n
			dim a0:a0 = mid(str,i+1,1)
			dim a1:a1 = utf8.getbytes_4(a0)
			dim a2:a2 = lenb(a1)
			dim bk
			if (k + a2) < blocksize then
				s = s & a0
				k = k + a2
				if i = n then
					bytes = utf8.getbytes_4(s)
					bk = rsaencrypt((bytes))
					sk = sk & bytes2base64(bk)
				end if
			else
				bytes = utf8.getbytes_4(s)
				bk = rsaencrypt((bytes))
				sk = sk & bytes2base64(bk)
				k = 0
				s = a0
			end if
		next
		encrypt = sk
	end function
	private function rsaencrypt(byref bytes)
		rsaencrypt = enc.encrypt((bytes),false)
	end function
 
	'@decrypt(byref bytes): 私钥解密
	public function decrypt(byref str)
		'dim bytes
		'bytes   = rsadecrypt(base642bytes(str))
		'decrypt = utf8.getstring((bytes))
 
		'对分块进行解密
		decrypt = ""
		if str="" then exit function
		dim i,a,na,s
		a  = split(str,"==")
		na = ubound(a)
		for i=0 to na - 1
			dim a0:a0 = a(i) & "=="
			dim a1:a1 = rsadecrypt(base642bytes(a0))
			s = s & utf8.getstring((a1))
		next
		decrypt = s
	end function
	private function rsadecrypt(byref bytes)
		rsadecrypt = enc.decrypt((bytes), false)
	end function
 
	'@sign(byref str,byref hash): 私钥签名 hash(MD5 SHA1 SHA256)
	public function sign(byref str,byref hash)
		dim bytes
		bytes = utf8.getbytes_4(str)
		sign  = bytes2base64(signhash(bytes, hash))
	end function
	private function signhash(byref bytes,byref hash)
		dim mapnametooid
		hash = lcase(hash)
		if hash="md5" then
			mapnametooid = "1.2.840.113549.2.5"
			bytes        = md5(bytes)
			signhash     = enc.signhash((bytes),mapnametooid)
		end if
		if hash="sha1" then
			mapnametooid = "1.3.14.3.2.26"
			bytes        = sha1(bytes)
			signhash     = enc.signhash((bytes),mapnametooid)
		end if
		if hash="sha256" then
			mapnametooid = "2.16.840.1.101.3.4.2.1"
			bytes        = sha256(bytes)
			signhash     = enc.signhash((bytes),mapnametooid)
		end if
		if hash="sha384" then
			mapnametooid = "2.16.840.1.101.3.4.2.2"
			bytes        = sha384(bytes)
			signhash     = enc.signhash((bytes),mapnametooid)
		end if
		if hash="sha512" then
			mapnametooid = "2.16.840.1.101.3.4.2.3"
			bytes        = sha512(bytes)
			signhash     = enc.signhash((bytes),mapnametooid)
		end if
	end function
 
	'@verify(byref str,byref hash,byref strsign): 公钥验签
	public function verify(byref str,byref hash,byref strsign)
		dim bytes,bytessign
		bytes     = utf8.getbytes_4(str)
		bytessign = base642bytes(strsign)
		verify    = enc.verifydata((bytes),hash,(bytessign))
	end function
 
	'hash
	public function md5(byref bytes)
		dim en
		set en = server.createobject("system.security.cryptography.md5cryptoserviceprovider")
		md5    = en.computehash_2((bytes))
		set en = nothing
	end function
	public function sha1(byref bytes)
		dim en
		set en = server.createobject("system.security.cryptography.sha1cryptoserviceprovider")
		sha1   = en.computehash_2((bytes))
		set en = nothing
	end function
	public function sha256(byref bytes)
		dim en
		'set en = server.createobject("system.security.cryptography.sha1cryptoserviceprovider")
		set en = server.createobject("system.security.cryptography.sha256managed")
		sha256 = en.computehash_2((bytes))
		set en = nothing
	end function
	public function sha384(byref bytes)
		dim en
		set en = server.createobject("system.security.cryptography.sha384managed")
		sha384 = en.computehash_2((bytes))
		set en = nothing
	end function
	public function sha512(byref bytes)
		dim en
		set en = server.createobject("system.security.cryptography.sha512managed")
		sha512 = en.computehash_2((bytes))
		set en = nothing
	end function
 
	'base64
	public function base642bytes(str)
		dim xml,node
		set xml  = server.createobject("msxml2.domdocument")
		set node = xml.createelement("b64")
			node.datatype = "bin.base64"
			node.text     = str
			base642bytes  = node.nodetypedvalue
		set node = nothing
		set xml  = nothing
	end function
	public function bytes2base64(bytes)
		dim xml,node
		set xml  = server.createobject("msxml2.domdocument")
		set node = xml.createelement("b64")
			node.datatype       = "bin.base64"
			node.nodetypedvalue = bytes
			bytes2base64        = node.text
		set node = nothing
		set xml  = nothing
	end function
end class
%>

使用方法:

dim s0
s0 = "<RSAKeyValue>"
s0 = s0 & "<Modulus>u8CS+voY3IVwm2QjJFg4uyU4TX/H/cCuG+8UgGr0qsvX6OUnxKu8YG18hKGB/7y/nBwlc0mYH8PSkDmT2SGR50LMz2e/r7yBkvazlykul0zqVTwJHAOrtXDVK8QZMH/vFzRPZrvr1SbwCMPrJ5ZGRtffPmT/7MVk8yWQo9XlAq2ABz62axwO1FC6TZc3PpmE+8pr18+AnzEai0TCjq3NaC28QWr3LGJDO/fGtT/bWz0uBrYPhCAxeYyWsDokiX0NU0ixUB2PulGqvsztjrxZYQPsZIIgZ1lMz/43rrfHGkrtmOeCS25+U/blzfZSRF6WDVIhTwBK1cFRb4tVgd107w==</Modulus>"
s0 = s0 & "<Exponent>AQAB</Exponent>"
s0 = s0 & "<P>9C9bAbM87egP+dLaA8IQA2lJEBG6b5pJidw40lm0E2Ey1v2NMCEhd3stEUSrS0QfVN9S0N0aPZmsBNkbm7P7nSviq53n2Qo/mEP06dhx7+MI1nKlmTrgqH0HvCYK7+55vxojZsuvj9E9Q7tE5KXJsKZ8syLrWbLPvrPPF4TVwjc=</P>"
s0 = s0 & "<Q>xNY0H25RbMJGFUaZ/a4b6/yPXECdFX7LeFxFAiJ4ds+zavenRMacm4MNjY91m90t7p0UZYvytk39YeX2/J6x0C2U/gQE3VS5ER+NAOqrl9UgBxZeb0e5Cz3TcU4w/zT+sQedYqG4p/ldT4UnBKXleI/+l6H86Qnix1O9Xae25wk=</Q>"
s0 = s0 & "<DP>d46YKITx2Co/aDpstFpYLNNoCo4jknEggHdq+tMg8DwvAES01FPkZvPQZRwSIpAAJzYQ/mLDblXHe7gxZFMDZzkNiqmN0x7JdGwRhk2Lu8CVmyoXGqdRSC2vk9eskz1YLtFFdBdWpjv0my0d1jW2Qt/BPpRiV1DNlrnDM+i+IJE=</DP>"
s0 = s0 & "<DQ>muDs7FpSaWBH4s/FtSz9PWdhqjYRI+u7z/3SMsbKwLnXM/Cfxeb9LQQmct+Rq82SKbGhbfF7TeT53cEj4UxBH0vucxzYcwsJ/6Yyvajo0bRZ2hnIvojR2j2QlRPwS674RHV4ajZT5J+6wypDNE4QzBeJPOix5u/nZ+3FD986dHk=</DQ>"
s0 = s0 & "<InverseQ>KPlNyd7bdTwL3eJ9MzSbOXHdUSKUvjWVtLekiIAGJX4KOT971ipiYR2TDAKTyDaYuYFibNEKcJMIlsQ5ou7hg8ja/WpuCjdZxOmh23bHteyQA8LyLgpvsj1vWQy8VdCXEyUsZji7PskpLOnnyNrl0VXZvivUqUR3rHggsX05PgQ=</InverseQ>"
s0 = s0 & "<D>sRhXS2bGNpOjgN82ipywfk4ASpGiGcc6M10S8IJyX/xAnwwvs8HtwOLlFdGl5oyqC908sf8T/7pdDe9RdvjEP+fxeh05YNElQ3NyOL3+lXZWfqlPSl5oA4/3cv3YaLfz1OZhktzk+TxuI0Zxs/h6N259w8PO5w3WR8cCJJeoGRngb8WnwiZob0RjYp1nrlwNQc9vHvzqgjhT9RhxDYFh3m2MfQDZZVedrU6TpDPnWBLmHyl6faBrbgVmfki4aCb1ldVGMlcfXpuYvP0HGPuodWaTIBRTA1B6W8aeakXQkp8++znKHJq8w+oScDHDC/ekaQ1idgVu9fvPfzuZbL/2MQ==</D>"
s0 = s0 & "</RSAKeyValue>"
 
dim RSA
dim a0,a1,a2,a3,a4,a5
a0 = "Hello World!"
a0 = a0 & "RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)"
a0 = a0 & "一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。"
 
set RSA= new xmasp_rsa
	RSA.privatekey = s0			'设置私钥
	'RSA.publickey = "xxxx"			'设置公钥
	'publickey = RSA.publickey		'也可通过私钥获得公钥
	a1 = RSA.encrypt(a0)			'加密
	a2 = RSA.decrypt(a1)			'解密
	a3 = RSA.sign(a1,"SHA512")		'签名支持SHA1 SHA256 SHA512 MD5
	a4 = RSA.verify(a1,"SHA512",a3)		'验签
set RSA = nothing
 
response.write "字符串:" & a0 & "</br>"
response.write "加密后:" & a1 & "</br>"
response.write "加密后字符长:" & len(a1) & "</br>"
response.write "解密后:" & a2 & "</br>"
response.write "签名后:" & a3 & "</br>"
response.write "验签后:" & a4 & "</br>"

最后报错:

Microsoft VBScript 运行时错误 错误 '800a0005'

无效的过程调用或参数: 'enc.encrypt'

/1/rsa2.asp,行 98

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值