博客荒废很久了,最近遇到一个问题,看网上的说明比较少,所以写下来给大家一个参考

一般来说rsa算法都是使用公钥加密,私钥解密,或者私钥签名,公钥验签。但总有特别的时候会想要用私钥加密,公钥解密,但是js里面的框架没找到直接提供这种方式的。于是,只能自己来解决一下这个问题,我选择的是JSEncrypt这个框架(主要是写的比较简单好看懂)。一般使用rsa算法都是使用的ECB模式和pkcs1padding填充算法,因此,如果使用了其他算法的本文章不适用。

其实解决方式很简单,公钥加密就是用公钥对原文进行运算,那私钥其实就是用私钥对原文进行运算,解密也是反过来就行。但是JSEncrypt这个框架,将密钥对换之后,用私钥加密得到的密文自己能解开,放到java里就无法解开,原因在于:JSEncrypt直接将原文进行运算,而java里是将原文进行编码转换之后才进行运算,因此,只要修改JSEncrypt,将原文进行转换一次编码就可以和java兼容

将JSEncrypt中加密的方法贴出来说明一下,encrypt是原本的公钥加密的方法,encryptp是我加的私钥加密的方法(起名比较随意,见谅)。只要将填充部分和密钥运算修改即可。

因为rsa是分块加密的,所以对于1024位的公钥加密来说,输入的明文块小于117位时,在明文块前添加一位的0x02字节(代表公钥加密)然后后面的52位为随机的字节,在补位的最后一位,{即52(117-64-1),从零开始的},添加一位的字节0x00,在补位的后面添加实际的明文块。而对于1024位的私钥加密,如果输入的明文块小于117位,比如输入的明文块长度为64位,那么对这个明文块进行补位,在明文块千添加一位的0x01字节(代表私钥加密),然后在后面的52位为字节0xff,在最后一位{即52(117-64-1),从零开始),添加一位的字节0x00,在补位的后面添加时间的明文块。

正是由于公钥加密时填充的字节是随机的,所以每次加密出来的密文都是不同的,但是私钥加密时填充的字节是固定的,所以密文是相同的。也可以通过填充随机字节使私钥加密变为随机密文(没有意义,公钥是公开的,这种方式与java不兼容)。

接下来是填充的方法部分,因此要兼容java,所以使用asciitohex方法来对原文进行编码转换,之后按照填充算法来填充明文。因为我是用ascii码转换的,所以不支持中文,需要支持中文的朋友自行修改编码转换部分即可。

结尾,因为我比较懒所以只解决了一部分问题,还有其他问题未解决,比如不支持中文,还有没做循环加密因此只能加密一个块长度以下的密文,需要的朋友自行修改一下吧

源代码在csdn上,可以下载,麻烦施舍我一点积分,穷人没积分下资源啊。如果实在没积分可以联系我

下载地址:https://download.csdn.net/download/wsss_fan/11736982

后记:

其实JSEncrypt里加密时有做编码转换,把标红的这段复制出来做一个方法就可以了。

关于js私钥加密公钥解密的问题的更多相关文章

  1. 基于私钥加密公钥解密的RSA算法C#实现

    RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作. RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一 ...

  2. 银联手机支付(.Net Csharp),3DES加密解密,RSA加密解密,RSA私钥加密公钥解密,.Net RSA 3DES C#

    前段时间做的银联支付,折腾了好久,拼凑的一些代码,有需要的朋友可以参考,本人.Net新手,不保证准确性! 这个银联手机支付没有SDK提供,技术支持也没有.Net的,真心不好搞! RSA加解密,这里有个 ...

  3. RSA不对称加密,公钥加密私钥解密,私钥加密公钥解密

    RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作. RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一 ...

  4. golang 私钥"加密"公钥"解密"

    ---恢复内容开始---   之前工作主要使用C/C++与银行/第三方支付对接,但C/C++无法满足客户"当天给协议明天实盘上载"的开发速度以及现公司一些特殊情况,所以决定用go来 ...

  5. RSA 加密算法 Java 公钥加密私钥解密 和 私钥加密公钥解密 的特点

    package com.smt.cipher.unsymmetry; import org.apache.commons.codec.binary.Base64; import org.apache. ...

  6. 求求你们不要再用 RSA 私钥加密公钥解密了,这非常不安全!

    最近经常在网上看到有人说巨硬的 CNG(Cryptography Next Generation 即下一代加密技术) 只提供 RSA 公钥加密私钥解密,没有提供 RSA 私钥加密公钥解密,他们要自己封 ...

  7. NetCore 生成RSA公私钥对,公钥加密私钥解密,私钥加密公钥解密

    using Newtonsoft.Json; using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Encodings; using ...

  8. RSA加解密 私钥加密公钥解密 私加公解 && C++ 调用openssl库 的代码实例

    前提:秘钥长度=1024 ============================================== 对一片(117字节)明文加密  私加 ===================== ...

  9. C# 基于大整数类的RSA算法实现(公钥加密私钥解密,私钥加密公钥解密)

    但是C#自带的RSA算法类RSACryptoServiceProvider只支持公钥加密私钥解密,即数字证书的使用. 所以参考了一些网上的资料写了一个RSA的算法实现.算法实现是基于网上提供的一个大整 ...

随机推荐

  1. JVM 源码分析之 javaagent 原理完全解读

    转载:https://infoq.cn/article/javaagent-illustrated 本文重点讲述 javaagent 的具体实现,因为它面向的是我们 Java 程序员,而且 agent ...

  2. 2 USB标准请求

    2 USB标准设备请求的结构 2.1 标准请求 bmRequestType 的D6~D5为00的请求,USB协议定义了11个标准请求(bRequest),其名字与相应的bRequest的值如下表: 表 ...

  3. 前端通过url页面传值

    例子:从A页面将‘myId’传到B页面 1.A页面传值 var url = encodeURI("html/editPostcard.html?myId="+ myId); win ...

  4. sed 删除含有某个字符串的行 (在文件txt)

    #删除a.txt中含有“aaa”的行 sed -i “/aaa/d” a.txt

  5. layui的选项卡(tab)的问题

    当页面打开单个tab时,操作栏显示: 当页面打开多个tab时,会发现操作栏与下面第一个tab显示的操作栏类型一样,并且操作栏的按钮无作用 第一个标签操作栏显示: 产生这样的原因:使用layui时,每个 ...

  6. 记录一次工作中jvm被linux杀死的调查

    首先,以后碰到任何jvm的错误,先看日志!!!!!!!! web项目在tomcat目录下的log里,或者自己设定的errorfile目录下.总之,找到一切可以运用的日志,比如crash日志,cored ...

  7. java.lang.ThreadLocal的作用和原理?列举在哪些程序中见过ThreadLocal的使用?

    java.lang.ThreadLocal的作用和原理?列举在哪些程序中见过ThreadLocal的使用? 说明类java.lang.ThreadLocal的作用和原理.列举在哪些程序中见过Threa ...

  8. 29. StringBuilder

    1.字符串变量.StringBuffer.StringBulid的区别:           字符串是一个常量,不能被修改   字符串一旦被修改,那么会再创建一个对象,浪费空间           而 ...

  9. Quick BI 支持多种数据源进行多维分析

    一.摘要 随着互联网的高速发展,数据量爆发式增长的同时,数据的存储形式也开始呈现出多样性,有结构化存储,如 Mysql, Oracle, SQLServer 等,半结构化甚至非结构化存储,如HBase ...

  10. Android中的SrollView滚动详解

    今天开发遇到一个需求就是ScrollView中嵌套一个ListView,同时需要实现滑动到底部自动加载更多,我们知道ListView滑动到底部简单实现onScrollListener()监听器即可,但 ...