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

一般来说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. SSM项目启动报错:Failed to read candidate component class

    SSM项目启动报错:Failed to read candidate component class 换成3.1又没有问题,换成3.2又不行,查看编译环境用的是1.8,将1.8降为1.7,问题解决,服 ...

  2. JAVA中HashMap相关知识的总结(一)

    Java中HashMap在jdk1.7和jdk1.8中的区别点: 在jdk1.7中是用数组+链表形式存储,1.8采用数组+链表/红黑树形式 Jdk1.8中由链表转为红黑树是长度大于8,由红黑树转为链表 ...

  3. 24. Jmeter GUI 及NON GUI实现分布式

    什么是分布式: Jmeter的集群模式可以让我们将多台机器联合起来一起产生负载,从而弥补单台机器负载生成能力不足的问题. 假设我们的测试计划会产生100个threads,我们使用6台机器进行分布式测试 ...

  4. PAT_A1050#String Subtraction

    Source: PAT A1050 String Subtraction (20 分) Description: Given two strings S​1​​ and S​2​​, S=S​1​​− ...

  5. 拾遗:Gentoo 使用笔记

    零.使用 Git 源 mkdir /etc/portage/repos.conf cd !$ vi gentoo.conf [DEFAULT] main-repo = gentoo [gentoo] ...

  6. 剑指offer——64和为s的数字

    题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 输出描述: 对应每个测试案例,输出两个数,小的先输出. 题解 ...

  7. Java8向后兼容

    toInstant()方法被添加到可用于将它们转换到新的日期时间的API原始日期和日历对象.使用ofInstant(Insant,ZoneId)方法得到一个LocalDateTime或ZonedDat ...

  8. apach hadoop2.6 集群利用Phoenix 4.6-hbase 批量导入并自动创建索引

    基础环境: 1.安装apach 版本hadoop2.6 2.部署hbase1.0.0 3.下载phoenix-4.6.0-HBase-1.0.下载地址(http://mirror.nus.edu.sg ...

  9. Python爬虫工程师必学APP数据抓取实战✍✍✍

    Python爬虫工程师必学APP数据抓取实战  整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问题,大 ...

  10. 移动端新建html页面

    这是一些头部设置 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> < ...