最近有空在把自己的asp站点后端函数全部整理了下,在弄RSA的时候遇到了坑了,然后找到下面这位兄弟刚好发布的文章:

https://blog.csdn.net/todaygods/article/details/109383438

用了他的demo在本机win7,IIS环境测试,一切正常,然后传到服务器windows server 2008 R2 IIS环境下测试,IIS站点的应用程序池用的默认.net 2.0的,上demo,直接提示 mscorlib 错误,估计是没有调起.net的类,在服务器的安装程序里面看到有装.net 4.6,然后把IIS对应的应用程序池设为.NET 4.0,重启IIS,前面这个错误没有了,但提示 .encrypt 参数错误(就这个坑搞了1天多),检查代码,找微软的官方文档接口说明,也没发现问题,官方是c#演示,勉强看懂一点原理,测试其他的API接口,以前没有看过微软这些文档,就感觉里面的接口说明绕来绕去的。

研究了大半天没结果,后面想着还是从服务器上检查原因吧,再次检查系统的应用程序列表,卸掉4.6重新安装4.8的,IIS应用程序池再设置一遍,按照网上的资料又是设置程序池的权限,C盘里面相关读写权限试过,还是不行啊。

后面偶然间在系统的 服务器管理 里面 功能 模块里面有个 .NET3.5.1 ,好家伙,我记得我安装4.8新版之前4.6版都卸掉了,怎么还有3.5.1呢,然后进【删除功能】删掉之后重启,结果这里进去用【添加功能】准备把新版的添加进去,发现但添加的时候仍然只有 3.5.1的选项。【图中箭头位置之前是显示的.NET3.5.1】

估计就是这里的问题了,在系统程序管理把后面装的.NET全部删掉,重新装4.8试试,结果这里还是显示只有3.5.1,后来查询资料才知道这个是系统内置的.NET3.5.1,最终按下方法操作:

1、下载一个工具:.NET Framework cleanup_tool 清空系统全部的.net安装缓存
 2、运行services.msc或者再计算机上点右键,选择管理,找到服务 Windows update 停止它的运行;
 3、删除C:\Windows\SoftwareDistribution这个目录;
 4、把第一步中停止的服务重新启动;
 5、重新安装新版;

经过上面步骤操作,再开demo,一下就通过了,加密解密全部ok。

这里要注意:经过上面的操作后,我就 没有在 服务器管理 里面 添加功能 这个操作了,进去添加的话还会显示是内置的3.5.1版,当时应该直接在这里把3.5.1的这个功能移除,然后下载.NET4+的版本安装好应该也就可以了。

这个是被系统内置的.NET3.5.1坑的,因为看表面系统应用程序里面和IIS的应用程序池都是NET 4+新版,但实际上通过 server.createobject("system. 这类还是优先通过内置的3.5功能调用的。

好了,下面上demo代码:

<%
'@ ---------------------------------------------------------------
'@ title: xmasp_rsa
'@ author: ekede.com
'@ date: 2020-10-28
'@ description: RSA 公钥加密->私钥解密 , 私钥签名->公钥验签
'@ 支持 MD5withRSA,SHA1withRSA,SHA256withRSA,SHA384withRSA 和 SHA512withRSA
'@ ---------------------------------------------------------------
class xmasp_rsaprivate utf8,encprivate privatekey_,publickey_'@ privatekey: your personal private key.  keep this hidden. need c# format.public property get privatekeyprivatekey = privatekey_end propertypublic property let privatekey(value)privatekey_ = valueenc.fromxmlstring(privatekey_)publickey_ = enc.toxmlstring(false)end property'@publickey: key for others to encrypt data with.public property get publickeypublickey = publickey_end propertypublic property let publickey(value)publickey_ = valueenc.fromxmlstring(publickey_)end propertyprivate sub class_initialize()dim xmasp_rsaxmasp_rsa  = "xmasp应用框架 - 扩展包"set utf8   = server.createobject("system.text.utf8encoding")set enc = server.createobject("system.security.cryptography.rsacryptoserviceprovider")createkey()end subprivate sub class_terminate()set enc = nothingset utf8   = nothingend 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 functiondim blocksize:blocksize = enc.keysize / 8 - 11    '分块的最大字节数,如:2048/8-11=245'得到字节数'dim na'na = ubound(bytes) + 1'na = lenb(bytes)dim i,s,sk,bytesdim k:k = 0dim n:n = len(str) - 1for i=0 to ndim a0:a0 = mid(str,i+1,1)dim a1:a1 = utf8.getbytes_4(a0)dim a2:a2 = lenb(a1)dim bkif (k + a2) < blocksize thens = s & a0k = k + a2if i = n thenbytes = utf8.getbytes_4(s)bk = rsaencrypt((bytes))sk = sk & bytes2base64(bk)end ifelsebytes = utf8.getbytes_4(s)bk = rsaencrypt((bytes))sk = sk & bytes2base64(bk)k = 0s = a0end ifnextencrypt = skend functionprivate 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 functiondim i,a,na,sa  = split(str,"==")na = ubound(a)for i=0 to na - 1dim a0:a0 = a(i) & "=="dim a1:a1 = rsadecrypt(base642bytes(a0))s = s & utf8.getstring((a1))nextdecrypt = send functionprivate 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 bytesbytes = utf8.getbytes_4(str)sign  = bytes2base64(signhash(bytes, hash))end functionprivate function signhash(byref bytes,byref hash)dim mapnametooidhash = lcase(hash)if hash="md5" thenmapnametooid = "1.2.840.113549.2.5"bytes        = md5(bytes)signhash     = enc.signhash((bytes),mapnametooid)end ifif hash="sha1" thenmapnametooid = "1.3.14.3.2.26"bytes        = sha1(bytes)signhash     = enc.signhash((bytes),mapnametooid)end ifif hash="sha256" thenmapnametooid = "2.16.840.1.101.3.4.2.1"bytes        = sha256(bytes)signhash     = enc.signhash((bytes),mapnametooid)end ifif hash="sha384" thenmapnametooid = "2.16.840.1.101.3.4.2.2"bytes        = sha384(bytes)signhash     = enc.signhash((bytes),mapnametooid)end ifif hash="sha512" thenmapnametooid = "2.16.840.1.101.3.4.2.3"bytes        = sha512(bytes)signhash     = enc.signhash((bytes),mapnametooid)end ifend function'@verify(byref str,byref hash,byref strsign): 公钥验签public function verify(byref str,byref hash,byref strsign)dim bytes,bytessignbytes     = utf8.getbytes_4(str)bytessign = base642bytes(strsign)verify    = enc.verifydata((bytes),hash,(bytessign))end function'hashpublic function md5(byref bytes)dim enset en = server.createobject("system.security.cryptography.md5cryptoserviceprovider")md5    = en.computehash_2((bytes))set en = nothingend functionpublic function sha1(byref bytes)dim enset en = server.createobject("system.security.cryptography.sha1cryptoserviceprovider")sha1   = en.computehash_2((bytes))set en = nothingend functionpublic 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 = nothingend functionpublic function sha384(byref bytes)dim enset en = server.createobject("system.security.cryptography.sha384managed")sha384 = en.computehash_2((bytes))set en = nothingend functionpublic function sha512(byref bytes)dim enset en = server.createobject("system.security.cryptography.sha512managed")sha512 = en.computehash_2((bytes))set en = nothingend function'base64public function base642bytes(str)dim xml,nodeset xml  = server.createobject("msxml2.domdocument")set node = xml.createelement("b64")node.datatype = "bin.base64"node.text     = strbase642bytes  = node.nodetypedvalueset node = nothingset xml  = nothingend functionpublic function bytes2base64(bytes)dim xml,nodeset xml  = server.createobject("msxml2.domdocument")set node = xml.createelement("b64")node.datatype       = "bin.base64"node.nodetypedvalue = bytesbytes2base64        = node.textset node = nothingset xml  = nothingend function
end class
%>

1、在原作的基础上修正了一处【注释掉的那句是原作的,我这测试的时候要用下面这句才能调起】:

 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 = nothingend function

2、增加了 SHA384withRSA 和 SHA512withRSA 的支持。

3、增加了分块加密解密功能,原因:

        .NET Framework 中提供的 RSA 算法规定:
        待加密的字节数不能超过密钥的长度值除以 8 再减去 11(即:RSACryptoServiceProvider.KeySize / 8 - 11),
        而加密后得到密文的字节数,正好是密钥的长度值除以 8(即:RSACryptoServiceProvider.KeySize / 8)。
        所以,如果要加密较长的数据,则可以采用分段加解密的方式。

其他:对于分块加密解密可功能处理过程可能还有更好的优化方案,还望大师们给指定。

在使用的时候,要先想办法把 pem证书转成xml格式,

可参考第三方在线转换:https://superdry.apphb.com/tools/online-rsa-key-converter

原作者刚也出了一个tools工具,可以看文首的链接。

下面是使用方法:

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_rsaRSA.privatekey = s0            '设置私钥'RSA.publickey = "xxxx"           '设置公钥'publickey = RSA.publickey      '也可通过私钥获得公钥a1 = RSA.encrypt(a0)           '加密a2 = RSA.decrypt(a1)           '解密a3 = RSA.sign(a1,"SHA512")       '签名支持SHA1 SHA256 SHA512 MD5a4 = RSA.verify(a1,"SHA512",a3)      '验签
set RSA = nothingresponse.write "字符串:" & a0 & "</br>"
response.write "加密后:" & a1 & "</br>"
response.write "加密后字符长:" & len(a1) & "</br>"
response.write "解密后:" & a2 & "</br>"
response.write "签名后:" & a3 & "</br>"
response.write "验签后:" & a4 & "</br>"

运行结果:

asp版 vbscript RSA公钥加密 / 私钥解密 / 私钥签名 / 公钥验签(支持中文)分段加密解密相关推荐

  1. 数字证书应用综合揭秘(包括证书生成、加密、解密、签名、验签)

    引言 数字证书是一个经证书授权中心数字签名的包含公开密钥拥有者信息以及公开密钥的文件.为现实网络安全化标准如今大部分的 B2B.B2C.P2P.O2O 等商业网站含有重要企业资料个人资料的信息资信网站 ...

  2. ASP VBSCRIPT VBA RSA 公钥加密 私钥解密 私钥签名 公钥验签

    <% '@title: Class_Crypt_Rsa '@author: ekede.com '@date: 2020-10-28 '@description: RSA 公钥加密->私钥 ...

  3. 分享一个RSA加解密工具类,公钥加密私钥解密、私钥加密公钥解密、私钥签名公钥验签、生成公钥私钥

    测试: public static void main(String[] args) {try {//生成公钥私钥Map<String, Object> map = RSAUtil.ini ...

  4. RSA加密、解密、签名、验签介绍

    参考链接:https://www.cnblogs.com/pcheng/p/9629621.html RAS简介 RSA加密是非对称加密,由一对秘钥进行完成加密解密,分别称为公钥和私钥,公钥加密,私钥 ...

  5. Java开发中的加密、解密、签名、验签,密钥,证书,这篇就够了,赶紧收藏起来

    OpenSSL和keytool 先说一下两个重要的工具 OpenSSL:OpenSSL整个软件包大概可以分成三个主要的功能部分:SSL协议库libssl.应用程序命令工具以及密码算法库libcrypt ...

  6. PHP 支付宝SDK加密与解密、签名与验签(含php原生写法)

    1.使用支付宝SDK,本次使用的SDK是老版 支付宝文档:https://opendocs.alipay.com/open/54/103419 首先下载或使用新上线的Web在线加密,生成应用私钥与应用 ...

  7. RSA公私钥生成、加解密、签名及验签的原理及工具类

    目录 一.RSA简介 二.加密.签名区别 三.公私钥生成 四.RSA工具类 一.RSA简介 非对称加密算法,由一对密钥(公钥-私钥)来进行加密-解密.签名-验签的过程.公钥-私钥的生成与数学相关,算法 ...

  8. RSA加密、解密、签名、验签(验证签名)RSA算法原理

    转载链接:https://www.jianshu.com/p/8dc4a5f64e06 https://www.cnblogs.com/pcheng/p/9629621.html RSA原理:http ...

  9. RSA加密、解密、签名、验签的原理及方法

    目录 一.RSA加密简介 二.公钥与私钥的理解 三.RSA加密解密 四.RSA签名和验证 五.加密的作用 六.两种不同的加密与解密 七.RSA加密.签名区别 八.RSA加密.签名的方法,代码例子如下: ...

最新文章

  1. PostgreSQL 的 MVCC 机制解析
  2. DOM和Diff算法你应该知道的那些事,快收藏!
  3. python调用winrar解压_批量文件解压缩脚本(Python3.5 + WinRAR)
  4. 面试必备:多线程学习(一)
  5. 微信公众号使用Chrome插件:Markdown Nice优化微信公众号排版教程
  6. 长沙戴维营教育iOS开发面试题周刊
  7. 关于从Activity A跳转到Activity B ,其中Activity A中有一个VideoView,Activity B中有一个MediaPlayer。...
  8. shell mysql 取值_shell 脚本中获取mysql多个字段的值
  9. Laravel报错:Whoops, looks like something went wrong.
  10. 计算机打印机停止运行命令,打印机一直在打印应该怎样停止?
  11. 数据分析 --- 如何处理脏数据
  12. 7. 测度论-有限维乘积测度和Fubini定理
  13. 在centos7上编译EDK2
  14. vue:单文件组件模板
  15. [香橙派]win10使用简短的cmd命令实现ssh快速登录
  16. java中的依赖是啥意思_java – “ – ”(箭头)在gradle的依赖图中是什么意思?
  17. 升级gradle版本报错
  18. 再见,北京,你好,沈阳
  19. APP被黑客攻击如何解决
  20. Revit教程免费下载——Revit建筑施工图初级培训

热门文章

  1. Vue中使用v-for生成dom删除元素错乱的问题
  2. web前端(HTML5)
  3. 在Unity中制作高质量的光照效果(上)
  4. 这个好玩!用Python识别花卉种类,并自动整理分类!
  5. 几种混沌系统混沌模型
  6. SX1278、SX1276、SX1262的简单详解
  7. 西门子S7200plc通信不上实际问题和解决方法
  8. 互联网公司那些价值观-阿里巴巴
  9. 测试抑郁症的20道题(三)
  10. 积分-钉钉考勤-告警