微信小程序rsa分段加密
来源:互联网 发布:淘宝开店流程图解2016 编辑:程序博客网 时间:2024/06/03 15:16
前段时间公司要开发app配套的微信小程序,而app的接口是使用rsa加密的。
找了很多资料,发现rsa的秘钥长度限制了加密时明文的长度。又不能重新写一套接口。纠结了三天,终于集合各方资料弄出了一个微信小程序试用的rsa分段加密程序.
详见rsa.js
demo下载地址http://download.csdn.net/detail/u011731544/9908595
里面有好几种加密
这个是导出的签名方法,注释的两行是不分段的。不过我测试过,分段的encryptLong也可以兼容不分段的encrypt。
function sign(text) { //var encStr = encrypt_rsa.encrypt(text);//不分段的加密 //encStr = hex2b64(encStr);//不分段加密需要base64一下 var encStr = encrypt_rsa.encryptLong(text);//分段加密 console.log(text) console.log("加密结果:" + encStr) return encStr;}
配套的java端解密的代码如下:
import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.InputStream;import java.security.KeyFactory;import java.security.PrivateKey;import java.security.interfaces.RSAPublicKey;import java.security.spec.PKCS8EncodedKeySpec;import java.security.spec.X509EncodedKeySpec;import javax.crypto.Cipher;import org.apache.commons.codec.binary.Base64;/** * RSA算法 * */public class RSA { /** * SIGN_ALGORITHMS */ public static final String SIGN_ALGORITHMS = "SHA1WithRSA"; /** * 公钥加密 * * @param content * @param public_key * @return * @throws Exception */ public static String signWithPublicKey(String content, String public_key) throws Exception { byte[] buffer = Base64.decodeBase64(public_key); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); X509EncodedKeySpec keySpec = new X509EncodedKeySpec(buffer); RSAPublicKey publicKey = (RSAPublicKey) keyFactory.generatePublic(keySpec); Cipher cipher = Cipher.getInstance(publicKey.getAlgorithm()); cipher.init(1, publicKey); byte[] data = content.getBytes("utf-8"); int inputLen = data.length; ByteArrayOutputStream out = new ByteArrayOutputStream(); int offSet = 0; int key_len = publicKey.getModulus().bitLength() / 8 - 11; for (int i = 0; inputLen - offSet > 0; offSet = i * key_len) { byte[] cache; if (inputLen - offSet > key_len) { cache = cipher.doFinal(data, offSet, key_len); } else { cache = cipher.doFinal(data, offSet, inputLen - offSet); } out.write(cache, 0, cache.length); ++i; } byte[] encryptedData = out.toByteArray(); out.close(); return new String(Base64.encodeBase64(encryptedData)); } public static PrivateKey getPrivateKey(String key) throws Exception { byte[] keyBytes; keyBytes = Base64.decodeBase64(key); PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); PrivateKey privateKey = keyFactory.generatePrivate(keySpec); return privateKey; } /** * 私钥解密 * * @param content * @param private_key * @param input_charset * @return * @throws Exception */ public static String decryptByPrivateKey(String content, String private_key, String input_charset) throws Exception { PrivateKey prikey = getPrivateKey(private_key); Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.DECRYPT_MODE, prikey); InputStream ins = new ByteArrayInputStream(Base64.decodeBase64(content)); ByteArrayOutputStream writer = new ByteArrayOutputStream(); // rsa解密的字节大小最多是128,将需要解密的内容,按128位拆开解密 byte[] buf = new byte[128]; int bufl; while ((bufl = ins.read(buf)) != -1) { byte[] block = null; if (buf.length == bufl) { block = buf; } else { block = new byte[bufl]; for (int i = 0; i < bufl; i++) { block[i] = buf[i]; } } writer.write(cipher.doFinal(block)); } return new String(writer.toByteArray(), input_charset); }}
参考资料http://download.csdn.net/detail/yubin2009m/9862378
http://blog.csdn.net/ufo00001/article/details/72822907
阅读全文
1 0
- 微信小程序rsa分段加密
- RSA分段加密
- RSA分段加密(Python2.7)
- RSA加密解密以及内容超长时采用分段加密
- golang RSA加密解密程序
- java-RSA加密解密,支持分段加解密
- 微信小程序-RSA签名、验签、加密、解密
- 微信小程序 RSA加密 解密 加签 验签
- RSA分段加密分段解密以及密钥与.Net的转化
- 加密解密算法java实现(6)—RSA 分段加解密的例子
- RSA加密
- rsa 加密
- RSA加密
- RSA加密
- RSA加密
- RSA加密
- RSA 加密
- RSA 加密
- 欢迎使用CSDN-markdown编辑器
- Linux 设备树学习
- DOM模型
- 输入法泄露处理工具类
- F
- 微信小程序rsa分段加密
- 组合数取模(sdut3895+HDU3037)逆元法或Lucas
- ScrollView与ListView的嵌套冲突
- KMP算法原理
- 线索化二叉树
- POJ2891 Strange Way to Express Integers 同余式的合并操作(中国剩余定理两两不一定非素的替代)
- unity3d-2017.1.0f3版本初探-界面
- 设计模式之六大原则——接口隔离原则(ISP)
- redhat 配置本地yum源163yum源epel 源