RSA js加密 java解密

1. 首先你要拥有一对公钥、私钥;

```

pubKeyStr = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC1gr+rIfYlaNUNLiFsK/Knb54nQrCRTRMOdujTwkpqKLo4pNYj2StmryWETeFxOCFtCt/7ixTUrU2RGGjkIOlYC3144h0dJKDtPXw9+mFyW1VwWvtfoiSUeKTEbz1tSHghEcdEvVq6qlSQukiLAEZabiwfEE30TQ6g979X6YXhnQIDAQAB";

priKeyStr = "MIICeQIBADANBgkqhkiG9w0BAQEFAASCAmMwggJfAgEAAoGBALWCv6sh9iVo1Q0uIWwr8qdvnidCsJFNEw526NPCSmooujik1iPZK2avJYRN4XE4IW0K3/uLFNStTZEYaOQg6VgLfXjiHR0koO09fD36YXJbVXBa+1+iJJR4pMRvPW1IeCERx0S9WrqqVJC6SIsARlpuLB8QTfRNDqD3v1fpheGdAgMBAAECgYEArmr1w3zfCxOxpvitJUUV589aKl/rS7TEmyGomdQZrel1CPlczRXinsmvQ3OTLzjA5geNNCpx2eyunL7YDF+T2WgcvpPlM+TUrBnTI9gKYwLXiWPuWou8oZolHaTuQQuLfnJTZ+6cYjHA3S4xnrJaEvvs8xgy6/UAJWXUpm/dQAECQQDlW9LPOrWaaVFuZqftVTwhTjhVmBZ/AeuXcmmmF2KBGaujbXJuVHVE5rzW9/6TQoWinuK4J/UOLcFl3VTTEPgZAkEAypggJwgYq3uz0KX8YScHV/gUZa56l5gRofMrIpiek4uvt2JM1kqgIq9T9PIOnv7dz7buRk2GXi3GLgEuhDr2JQJBAJPAypZ7QMBfdnkDosyOqzTdegcR+fQJ3aZrq0m3KNr4GY0nlZ8jw4QGjMKDcjmVkhdH+dAe1Ywzx7ICmoF6HgkCQQCTo+lKiIvx7GROWahi5J5lbVTwBQcyEpBHBX8Z5z8pJ1MWwXxdbmTk4gC9MOmW1QWwqg9bDIQvfgw+2n2bv5xBAkEAhUaiDfOywrIB3VUZWTqeIlVfqXHd8a9AcellTgIjK8WIu9gNGIfkWUVoVeOq0GCFTVqwO5tlac+oeDHCCimLyQ==";

```

生成方法略;

2. js中加密

* 获取公钥的Exponent/Modulus 供js中使用

```

publicKey.getPublicExponent().toString(16);

publicKey.getModulus().toString(16);

```

* 依赖包地址

http://www.ohdave.com/rsa/

引入依赖文件后

```

var rsa_m = "b582bfab21f62568d50d2e216c2bf2a76f9e2742b0914d130e76e8d3c24a6a28ba38a4d623d92b66af25844de17138216d0adffb8b14d4ad4d911868e420e9580b7d78e21d1d24a0ed3d7c3dfa61725b55705afb5fa2249478a4c46f3d6d48782111c744bd5abaaa5490ba488b00465a6e2c1f104df44d0ea0f7bf57e985e19d";

var rsa_e = "10001";

setMaxDigits(131); //131 => n的十六进制位数/2+3

var key      = new RSAKeyPair(rsa_e, ‘‘, rsa_m); //e,m是从Java代码中获取的

var password = "123456";

password = encryptedString(key, password); //不支持汉字

// 将password传递到后台,在后台使用Java解密

```

3. java 解密

因为js加密时使用的是nopadding模式(每次加密结果一样),而java中默认是padding15,每次加密结果不一样,所以要依赖第三方包来解密

/*

// http://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15on

compile group: ‘org.bouncycastle‘, name: ‘bcprov-jdk15on‘, version: ‘1.54‘

*/

```

RSAUtil.decryptJSRsa(password);

```

java 代码工具类:

```

package com.wch.encrypt;

import java.security.KeyFactory;

import java.security.PrivateKey;

import java.security.interfaces.RSAPublicKey;

import java.security.spec.PKCS8EncodedKeySpec;

import java.security.spec.X509EncodedKeySpec;

import java.util.Base64;

import javax.crypto.Cipher;

import org.bouncycastle.jce.provider.BouncyCastleProvider;

import org.bouncycastle.util.encoders.Hex;

import com.netfinworks.util.RSA;

/**

* RSA 工具类。提供加密,解密,生成密钥对等方法。 需要bcprov-jdk16-140.jar包。

* js依赖http://www.ohdave.com/rsa/

* // http://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15on

compile group: ‘org.bouncycastle‘, name: ‘bcprov-jdk15on‘, version: ‘1.54‘

*/

public class RSAUtil {

private static final String pubKeyStr = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC1gr+rIfYlaNUNLiFsK/Knb54nQrCRTRMOdujTwkpqKLo4pNYj2StmryWETeFxOCFtCt/7ixTUrU2RGGjkIOlYC3144h0dJKDtPXw9+mFyW1VwWvtfoiSUeKTEbz1tSHghEcdEvVq6qlSQukiLAEZabiwfEE30TQ6g979X6YXhnQIDAQAB";

private static final String priKeyStr = "MIICeQIBADANBgkqhkiG9w0BAQEFAASCAmMwggJfAgEAAoGBALWCv6sh9iVo1Q0uIWwr8qdvnidCsJFNEw526NPCSmooujik1iPZK2avJYRN4XE4IW0K3/uLFNStTZEYaOQg6VgLfXjiHR0koO09fD36YXJbVXBa+1+iJJR4pMRvPW1IeCERx0S9WrqqVJC6SIsARlpuLB8QTfRNDqD3v1fpheGdAgMBAAECgYEArmr1w3zfCxOxpvitJUUV589aKl/rS7TEmyGomdQZrel1CPlczRXinsmvQ3OTLzjA5geNNCpx2eyunL7YDF+T2WgcvpPlM+TUrBnTI9gKYwLXiWPuWou8oZolHaTuQQuLfnJTZ+6cYjHA3S4xnrJaEvvs8xgy6/UAJWXUpm/dQAECQQDlW9LPOrWaaVFuZqftVTwhTjhVmBZ/AeuXcmmmF2KBGaujbXJuVHVE5rzW9/6TQoWinuK4J/UOLcFl3VTTEPgZAkEAypggJwgYq3uz0KX8YScHV/gUZa56l5gRofMrIpiek4uvt2JM1kqgIq9T9PIOnv7dz7buRk2GXi3GLgEuhDr2JQJBAJPAypZ7QMBfdnkDosyOqzTdegcR+fQJ3aZrq0m3KNr4GY0nlZ8jw4QGjMKDcjmVkhdH+dAe1Ywzx7ICmoF6HgkCQQCTo+lKiIvx7GROWahi5J5lbVTwBQcyEpBHBX8Z5z8pJ1MWwXxdbmTk4gC9MOmW1QWwqg9bDIQvfgw+2n2bv5xBAkEAhUaiDfOywrIB3VUZWTqeIlVfqXHd8a9AcellTgIjK8WIu9gNGIfkWUVoVeOq0GCFTVqwO5tlac+oeDHCCimLyQ==";

/**

* 解密js加密的rsa

*

* @param str

*            js加密后的字符串;

*            js加密参考http://blog.csdn.net/songxiaobing/article/details

*            /17505237

* @return

*/

public static String decryptJSRsa(String str) {

PrivateKey privateKey;

try {

privateKey = RSA.getPrivateKey(priKeyStr);

Cipher cipher = Cipher.getInstance("RSA/NONE/NoPadding",

new BouncyCastleProvider());

cipher.init(Cipher.DECRYPT_MODE, privateKey);

StringBuilder sb = new StringBuilder(new String(cipher.doFinal(Hex

.decode(str))));

return sb.reverse().toString();

} catch (Exception e) {

e.printStackTrace();

}

return null;

}

/**

* 原生加解密代码

*

* @throws Exception

*/

public static void rsaTest() throws Exception {

KeyFactory factory = KeyFactory.getInstance("RSA",

new BouncyCastleProvider());

byte[] bytes = Base64.getDecoder().decode(pubKeyStr);

X509EncodedKeySpec spec = new X509EncodedKeySpec(bytes);

RSAPublicKey publicKey = (RSAPublicKey) factory.generatePublic(spec);

System.out.println(publicKey.getPublicExponent().toString(16));

System.out.println(publicKey.getModulus().toString(16));

byte[] pirvateBytes = Base64.getDecoder().decode(priKeyStr);

PKCS8EncodedKeySpec privateSpec = new PKCS8EncodedKeySpec(pirvateBytes);

PrivateKey privateKey = factory.generatePrivate(privateSpec);

byte[] encode = RSA.encrypt("wch".getBytes(), privateKey);

System.out.println(Base64.getEncoder().encodeToString(encode));

System.out.println(new String(RSA.decrypt(encode, publicKey)));

byte[] publicEncode = RSA.encrypt("pubic".getBytes(), publicKey);

System.out.println(Base64.getEncoder().encodeToString(publicEncode));

System.out.println(new String(RSA.decrypt(publicEncode, privateKey)));

byte[] sign = RSA.sign("wch".getBytes(), privateKey);

System.out.println(Base64.getEncoder().encodeToString(sign));

System.out.println(RSA.verify("wch".getBytes(), sign, publicKey));

}

public static void main(String[] args) throws Exception {

rsaTest();

}

}

```

来自为知笔记(Wiz)

时间: 2024-10-16 21:08:35

RSA js加密 java解密的相关文章

RSA算法 JS加密 JAVA解密

有这样一个需求,前端登录的用户名密码,密码必需加密,但不可使用MD5,因为后台要检测密码的复杂度,那么在保证安全的前提下将密码传到后台呢,答案就是使用RSA非对称加密算法解决 . java代码 需要依赖 commons-codec 包 RSACoder.java import org.apache.commons.codec.binary.Base64; import javax.crypto.Cipher; import java.security.*; import java.securit

polarssl rsa & aes 加密与解密

上周折腾加密与解密,用了openssl, crypto++, polarssl, cyassl, 说起真的让人很沮丧,只有openssl & polarssl两个库的RSA & AES 加密和解密,我用起来了,crypto++各种模板,各种多继承,看的头大,而且对各种常用的加密算法也不了解,所以这个库我在折腾了一天之后就放弃了:cyassl这个库现在没什么印象了:openssl没什么好说的,用起来很方便,尤其是使用win32openssl,都不用自己编译,下载下来安装好了就能用,着实方便:

密码疑云 (3)——详解RSA的加密与解密

上一篇文章介绍了RSA涉及的数学知识,本章将应用这些知识详解RSA的加密与解密. RSA算法的密钥生成过程 密钥的生成是RSA算法的核心,它的密钥对生成过程如下: 1. 选择两个不相等的大素数p和q,计算出n=pq,n被称为RSA算法的公共模数: 2. 计算n的欧拉数φ(n),φ(n)=(p-1)(q-1): 3. 随机选择一个整数e作为公钥加密密钥指数,1< e < φ(n),且e与φ(n)互质: 4. 利用同余方程ed≡1 (mod φ(n))计算e对应的私钥解密指数d.由于GCD(e,

RSA JS 加密解密DEMO

<script src="Scripts/jquery-1.4.1.js" type="text/javascript"></script> <script src="Scripts/jQuery.md5.js" type="text/javascript" ></script> <script src="Scripts/BigInt.js" type=

RSA非对称加密Java实现

原文 加密基础方法类 1 import java.security.MessageDigest; 2 import sun.misc.BASE64Decoder; 3 import sun.misc.BASE64Encoder; 4 public class SecurityBase { 5 public static final String KEY_SHA="SHA"; 6 public static final String KEY_MD5="MD5"; 7

js加密php解密(CryptoJS)碰到的坑

今天做了一个功能,需要js传密码到php文件,对js密码 进行判断,为想为这个传输过程进行解密,参考了网上的一个方法(这个方法我只是使用了,并没有太深了解0.0) 首先要引入3个js文件 (在网上可搜索到) <script src="../public/js/aes.js"></script><script src="../public/js/md5.js"></script><script src="

RSA加密算法加密与解密过程解析

1.加密算法概述 加密算法根据内容是否可以还原分为 可逆加密和非可逆加密 . 可逆加密根据其加密解密是否使用的同一个密钥而可以分为 对称加密和非对称加密. 所谓对称加密即是指在加密和解密时使用的是同一个密钥:举个简单的例子,对一个字符串C做简单的加密处理,对于每个字符都和A做异或,形成密文S.解密的时候再用密文S和密钥A做异或,还原为原来的字符串C.这种加密方式有一个很大的缺点就是不安全,因为一旦加密用的密钥泄露了之后,就可以用这个密钥破解其他所有的密文. 非对称加密在加密和解密过程中使用不同的

关于rsa非对称加密、解密、签名、验签

测试数据: 1 var xmlprikey =""; 2 var xmlpubkey =""; 3 rsa = new RSACryption(); 4 //待处理字符串 5 var str="hello成功啊啊!¥%……&*([email protected]#$%^&*()@#$%^&*()_}::{>>?}{>?{?"; 6 var strlen= str.Length; 7 rsa.RSAKey(

RSA加密算法的加密与解密

转发原文链接:RSA加密算法加密与解密过程解析 1.加密算法概述 加密算法根据内容是否可以还原分为可逆加密和非可逆加密. 可逆加密根据其加密解密是否使用的同一个密钥而可以分为对称加密和非对称加密. 所谓对称加密即是指在加密和解密时使用的是同一个密钥:举个简单的例子,对一个字符串C做简单的加密处理,对于每个字符都和A做异或,形成密文S.解密的时候再用密文S和密钥A做异或,还原为原来的字符串C.这种加密方式有一个很大的缺点就是不安全,因为一旦加密用的密钥泄露了之后,就可以用这个密钥破解其他所有的密文