知识大全 用javascript与java进行RSA加密与解密
Posted 知
篇首语:胸怀万里世界, 放眼无限未来。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 用javascript与java进行RSA加密与解密相关的知识,希望对你有一定的参考价值。
用javascript与java进行RSA加密与解密 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
这几天一直做安全登录 网上查了好多资料 不尽如意
具体实现思路如下
服务端生成公钥与私钥 保存
客户端在请求到登录页面后 随机生成一字符串
后此随机字符串作为密钥加密密码 再用从服务端获取到的公钥加密生成的随机字符串
将此两段密文传入服务端 服务端用私钥解出随机字符串 再用此私钥解出加密的密文
这其中有一个关键是解决服务端的公钥 传入客户端 客户端用此公钥加密字符串后 后又能在服务端用私钥解出
此文即为实现此步而作
加密算法为RSA
服务端的RSA java实现
/** * */ package sunsoft struts util;
import java io ByteArrayOutputStream; import java io FileInputStream; import java io FileOutputStream; import java io ObjectInputStream; import java io ObjectOutputStream; import java math BigInteger; import java security KeyFactory; import java security KeyPair; import java security KeyPairGenerator; import java security NoSuchAlgorithmException; import java security PrivateKey; import java security PublicKey; import java security SecureRandom; import java security interfaces RSAPrivateKey; import java security interfaces RSAPublicKey; import java security spec InvalidKeySpecException; import java security spec RSAPrivateKeySpec; import java security spec RSAPublicKeySpec;
import javax crypto Cipher;
/** * RSA 工具类 提供加密 解密 生成密钥对等方法 * 需要到下载bcprov jdk jar * */ public class RSAUtil /** * * 生成密钥对 * * * @return KeyPair * * @throws EncryptException */ public static KeyPair generateKeyPair() throws Exception try KeyPairGenerator keyPairGen = KeyPairGenerator getInstance( RSA new bouncycastle jce provider BouncyCastleProvider()); final int KEY_SIZE = ;// 没什么好说的了 这个值关系到块加密的大小 可以更改 但是不要太大 否则效率会低 keyPairGen initialize(KEY_SIZE new SecureRandom()); KeyPair keyPair = keyPairGen generateKeyPair(); saveKeyPair(keyPair); return keyPair; catch (Exception e) throw new Exception(e getMessage());
public static KeyPair getKeyPair()throws Exception FileInputStream fis = new FileInputStream( C:/RSAKey txt ); ObjectInputStream oos = new ObjectInputStream(fis); KeyPair kp= (KeyPair) oos readObject(); oos close(); fis close(); return kp;
public static void saveKeyPair(KeyPair kp)throws Exception
FileOutputStream fos = new FileOutputStream( C:/RSAKey txt ); ObjectOutputStream oos = new ObjectOutputStream(fos); //生成密钥 oos writeObject(kp); oos close(); fos close();
/** * * 生成公钥 * * * @param modulus * * @param publicExponent * * @return RSAPublicKey * * @throws Exception */ public static RSAPublicKey generateRSAPublicKey(byte[] modulus byte[] publicExponent) throws Exception KeyFactory keyFac = null; try keyFac = KeyFactory getInstance( RSA new bouncycastle jce provider BouncyCastleProvider()); catch (NoSuchAlgorithmException ex) throw new Exception(ex getMessage());
RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(new BigInteger( modulus) new BigInteger(publicExponent)); try return (RSAPublicKey) keyFac generatePublic(pubKeySpec); catch (InvalidKeySpecException ex) throw new Exception(ex getMessage());
/** * * 生成私钥 * * * @param modulus * * @param privateExponent * * @return RSAPrivateKey * * @throws Exception */ public static RSAPrivateKey generateRSAPrivateKey(byte[] modulus byte[] privateExponent) throws Exception KeyFactory keyFac = null; try keyFac = KeyFactory getInstance( RSA new bouncycastle jce provider BouncyCastleProvider()); catch (NoSuchAlgorithmException ex) throw new Exception(ex getMessage());
RSAPrivateKeySpec priKeySpec = new RSAPrivateKeySpec(new BigInteger( modulus) new BigInteger(privateExponent)); try return (RSAPrivateKey) keyFac generatePrivate(priKeySpec); catch (InvalidKeySpecException ex) throw new Exception(ex getMessage());
/** * * 加密 * * * @param key * 加密的密钥 * * @param data * 待加密的明文数据 * * @return 加密后的数据 * * @throws Exception */
public static byte[] encrypt(PublicKey pk byte[] data) throws Exception try Cipher cipher = Cipher getInstance( RSA new bouncycastle jce provider BouncyCastleProvider()); cipher init(Cipher ENCRYPT_MODE pk); int blockSize = cipher getBlockSize();// 获得加密块大小 如 加密前数据为 个byte 而key_size= // 加密块大小为 // byte 加密后为 个byte;因此共有 个加密块 第一个 // byte第二个为 个byte int outputSize = cipher getOutputSize(data length);// 获得加密块加密后块大小 int leavedSize = data length % blockSize; int blocksSize = leavedSize != ? data length / blockSize + : data length / blockSize; byte[] raw = new byte[outputSize * blocksSize]; int i = ; while (data length i * blockSize > ) if (data length i * blockSize > blockSize) cipher doFinal(data i * blockSize blockSize raw i * outputSize); else cipher doFinal(data i * blockSize data length i * blockSize raw i * outputSize); // 这里面doUpdate方法不可用 查看源代码后发现每次doUpdate后并没有什么实际动作除了把byte[]放到 // ByteArrayOutputStream中 而最后doFinal的时候才将所有的byte[]进行加密 可是到了此时加密块大小很可能已经超出了 // OutputSize所以只好用dofinal方法
i++; return raw; catch (Exception e) throw new Exception(e getMessage());
/** * * 解密 * * * @param key * 解密的密钥 * * @param raw * 已经加密的数据 * * @return 解密后的明文 * * @throws Exception */ public static byte[] decrypt(PrivateKey pk byte[] raw) throws Exception try Cipher cipher = Cipher getInstance( RSA new bouncycastle jce provider BouncyCastleProvider()); cipher init(cipher DECRYPT_MODE pk); int blockSize = cipher getBlockSize(); ByteArrayOutputStream bout = new ByteArrayOutputStream( ); int j = ;
while (raw length j * blockSize > ) bout write(cipher doFinal(raw j * blockSize blockSize)); j++; return bout toByteArray(); catch (Exception e) throw new Exception(e getMessage());
/** * * * * * @param args * * @throws Exception */ public static void main(String[] args) throws Exception RSAPublicKey rsap = (RSAPublicKey) RSAUtil generateKeyPair() getPublic(); String test = hello world ; byte[] en_test = encrypt(getKeyPair() getPublic() test getBytes()); byte[] de_test = decrypt(getKeyPair() getPrivate() en_test); System out println(new String(de_test));
/** * */ package sunsoft struts util;
import java io ByteArrayOutputStream; import java io FileInputStream; import java io FileOutputStream; import java io ObjectInputStream; import java io ObjectOutputStream; import java math BigInteger; import java security KeyFactory; import java security KeyPair; import java security KeyPairGenerator; import java security NoSuchAlgorithmException; import java security PrivateKey; import java security PublicKey; import java security SecureRandom; import java security interfaces RSAPrivateKey; import java security interfaces RSAPublicKey; import java security spec InvalidKeySpecException; import java security spec RSAPrivateKeySpec; import java security spec RSAPublicKeySpec;
import javax crypto Cipher;
/** * RSA 工具类 提供加密 解密 生成密钥对等方法 * 需要到下载bcprov jdk jar * */ public class RSAUtil /** * * 生成密钥对 * * * @return KeyPair * * @throws EncryptException */ public static KeyPair generateKeyPair() throws Exception try KeyPairGenerator keyPairGen = KeyPairGenerator getInstance( RSA new bouncycastle jce provider BouncyCastleProvider()); final int KEY_SIZE = ;// 没什么好说的了 这个值关系到块加密的大小 可以更改 但是不要太大 否则效率会低 keyPairGen initialize(KEY_SIZE new SecureRandom()); KeyPair keyPair = keyPairGen generateKeyPair(); saveKeyPair(keyPair); return keyPair; catch (Exception e) throw new Exception(e getMessage());
public static KeyPair getKeyPair()throws Exception FileInputStream fis = new FileInputStream( C:/RSAKey txt ); ObjectInputStream oos = new ObjectInputStream(fis); KeyPair kp= (KeyPair) oos readObject(); oos close(); fis close(); return kp;
public static void saveKeyPair(KeyPair kp)throws Exception
FileOutputStream fos = new FileOutputStream( C:/RSAKey txt ); ObjectOutputStream oos = new ObjectOutputStream(fos); //生成密钥 oos writeObject(kp); oos close(); fos close();
/** * * 生成公钥 * * * @param modulus * * @param publicExponent * * @return RSAPublicKey * * @throws Exception */ public static RSAPublicKey generateRSAPublicKey(byte[] modulus byte[] publicExponent) throws Exception KeyFactory keyFac = null; try keyFac = KeyFactory getInstance( RSA new bouncycastle jce provider BouncyCastleProvider()); catch (NoSuchAlgorithmException ex) throw new Exception(ex getMessage());
RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(new BigInteger( modulus) new BigInteger(publicExponent)); try return (RSAPublicKey) keyFac generatePublic(pubKeySpec); catch (InvalidKeySpecException ex) throw new Exception(ex getMessage());
/** * * 生成私钥 * * * @param modulus * * @param privateExponent * * @return RSAPrivateKey * * @throws Exception */ public static RSAPrivateKey generateRSAPrivateKey(byte[] modulus byte[] privateExponent) throws Exception KeyFactory keyFac = null; try keyFac = KeyFactory getInstance( RSA new bouncycastle jce provider BouncyCastleProvider()); catch (NoSuchAlgorithmException ex) throw new Exception(ex getMessage());
RSAPrivateKeySpec priKeySpec = new RSAPrivateKeySpec(new BigInteger( modulus) new BigInteger(privateExponent)); try return (RSAPrivateKey) keyFac generatePrivate(priKeySpec); catch (InvalidKeySpecException ex) throw new Exception(ex getMessage());
/** * * 加密 * * * @param key * 加密的密钥 * * @param data * 待加密的明文数据 * * @return 加密后的数据 * * @throws Exception */ public static byte[] encrypt(PublicKey pk byte[] data) throws Exception try Cipher cipher = Cipher getInstance( RSA new bouncycastle jce provider BouncyCastleProvider()); cipher init(Cipher ENCRYPT_MODE pk); int blockSize = cipher getBlockSize();// 获得加密块大小 如 加密前数据为 个byte 而key_size= // 加密块大小为 // byte 加密后为 个byte;因此共有 个加密块 第一个 // byte第二个为 个byte int outputSize = cipher getOutputSize(data length);// 获得加密块加密后块大小 int leavedSize = data length % blockSize; int blocksSize = leavedSize != ? data length / blockSize + : data length / blockSize; byte[] raw = new byte[outputSize * blocksSize]; int i = ; while (data length i * blockSize > ) if (data length i * blockSize > blockSize) cipher doFinal(data i * blockSize blockSize raw i * outputSize); else cipher doFinal(data i * blockSize data length i * blockSize raw i * outputSize);
// 这里面doUpdate方法不可用 查看源代码后发现每次doUpdate后并没有什么实际动作除了把byte[]放到 // ByteArrayOutputStream中 而最后doFinal的时候才将所有的byte[]进行加密 可是到了此时加密块大小很可能已经超出了 // OutputSize所以只好用dofinal方法
i++; return raw; catch (Exception e) throw new Exception(e getMessage());
/** * * 解密 * * * @param key * 解密的密钥 * * @param raw * 已经加密的数据 * * @return 解密后的明文 * * @throws Exception */ public static byte[] decrypt(PrivateKey pk byte[] raw) throws Exception try Cipher cipher = Cipher getInstance( RSA new bouncycastle jce provider BouncyCastleProvider()); cipher init(cipher DECRYPT_MODE pk); int blockSize = cipher getBlockSize(); ByteArrayOutputStream bout = new ByteArrayOutputStream( ); int j = ;
while (raw length j * blockSize > ) bout write(cipher doFinal(raw j * blockSize blockSize)); j++; return bout toByteArray(); catch (Exception e) throw new Exception(e getMessage());
/** * * * * * @param args * * @throws Exception */ public static void main(String[] args) throws Exception RSAPublicKey rsap = (RSAPublicKey) RSAUtil generateKeyPair() getPublic(); String test = hello world ; byte[] en_test = encrypt(getKeyPair() getPublic() test getBytes()); byte[] de_test = decrypt(getKeyPair() getPrivate() en_test); <A title=system target=_blank>system</A> out println(new String(de_test));
测试页面
IndexAction java
/* * Generated by MyEclipse Struts * Template path: templates/java/JavaClass vtl */ package sunsoft struts action;
import java security interfaces RSAPrivateKey; import java security interfaces RSAPublicKey;
import javax servlet HttpServletRequest; import javax servlet HttpServletResponse;
import apache struts action Action; import apache struts action ActionForm; import apache struts action ActionForward; import apache struts action ActionMapping;
import sunsoft struts util RSAUtil;
/** * MyEclipse Struts * Creation date: * * XDoclet definition: * @struts action validate= true */ public class IndexAction extends Action /* * Generated Methods */
/** * Method execute * @param mapping * @param form * @param request * @param response * @return ActionForward */ public ActionForward execute(ActionMapping mapping ActionForm form HttpServletRequest request HttpServletResponse response)throws Exception
RSAPublicKey rsap = (RSAPublicKey) RSAUtil getKeyPair() getPublic(); String module = rsap getModulus() toString( ); String empoent = rsap getPublicExponent() toString( ); System out println( module ); System out println(module); System out println( empoent ); System out println(empoent); request setAttribute( m module); request setAttribute( e empoent); return mapping findForward( login );
/* * Generated by MyEclipse Struts * Template path: templates/java/JavaClass vtl */ package sunsoft struts action;
import java security interfaces RSAPrivateKey; import java security interfaces RSAPublicKey;
import javax servlet HttpServletRequest; import javax servlet HttpServletResponse;
import apache struts action Action; import apache struts action ActionForm; import apache struts action ActionForward; import apache struts action ActionMapping;
import sunsoft struts util RSAUtil;
/** * MyEclipse Struts * Creation date: * * XDoclet definition: * @struts action validate= true */ public class IndexAction extends Action /* * Generated Methods */
/** * Method execute * @param mapping * @param form * @param request * @param response * @return ActionForward */ public ActionForward execute(ActionMapping mapping ActionForm form HttpServletRequest request HttpServletResponse response)throws Exception
RSAPublicKey rsap = (RSAPublicKey) RSAUtil getKeyPair() getPublic(); String module = rsap getModulus() toString( ); String empoent = rsap getPublicExponent() toString( ); <A title=system target=_blank>system</A> out println( module ); <A title=system target=_blank>system</A> out println(module); <A title=system target=_blank>system</A> out println( empoent ); <A title=system target=_blank>system</A> out println(empoent); request setAttribute( m module); request setAttribute( e empoent); return mapping findForward( login );
通过此action进入登录页面 并传入公钥的 Modulus 与PublicExponent的hex编码形式
登录页面 login jsp
<%@ page language= java pageEncoding= GBK %>
<%@ taglib uri= bean prefix= bean %> <%@ taglib uri= prefix= %> <%@ taglib uri= logic prefix= logic %> <%@ taglib uri= tiles prefix= tiles %>
<!DOCTYPE HTML PUBLIC //W C//DTD HTML Transitional//EN > <: lang= true > <head> <:base />
<title>login</title>
<meta equiv= pragma content= no cache > <meta equiv= cache control content= no cache > <meta equiv= expires content= > <meta equiv= keywords content= keyword keyword keyword > <meta equiv= description content= This is my page > <! <link rel= stylesheet type= text/css > > <script type= text/javascript src= js/RSA js ></script> <script type= text/javascript src= js/BigInt js ></script> <script type= text/javascript src= js/Barrett js ></script> <script type= text/javascript > function rsalogin() bodyRSA(); var result = encryptedString(key document getElementById( pwd ) value); //alert(result); loginForm action= login do?result= +result; loginForm submit(); var key ; function bodyRSA() setMaxDigits( ); key = new RSAKeyPair( c cd a ed aafe dc c f ae a fe fc aba c a c de f dbf af fc c f de a ab affd bdfb ae e d c eef b ba ecd c ae eed f eeca ae ad fd a cc f e b c ab f cfbfd de f cbd );
</script> </head>
<body > <:form action= login method= post focus= username > <table border= > <tr> <td>Login:</td> <td><:text property= username /></td> </tr> <tr> <td>Password:</td> <td><:password property= password styleId= pwd /></td> </tr> <tr> <td colspan= align= center ><input type= button value= SUBMIT onclick= rsalogin(); /></td> </tr> </table> </:form> </body> </:>
<%@ page language= java pageEncoding= GBK %>
<%@ taglib uri= bean prefix= bean %> <%@ taglib uri= prefix= %> <%@ taglib uri= logic prefix= logic %> <%@ taglib uri= tiles prefix= tiles %>
<!DOCTYPE HTML PUBLIC //W C//DTD HTML Transitional//EN > <: lang= true > <head> <:base />
<title>login</title>
<meta equiv= pragma content= no cache > <meta equiv= cache control content= no cache > <meta equiv= expires content= > <meta equiv= keywords content= keyword keyword keyword > <meta equiv= description content= This is my page > <! <link rel= stylesheet type= text/css > > <script type= text/javascript src= js/RSA js ></script> <script type= text/javascript src= js/BigInt js ></script> <script type= text/javascript src= js/Barrett js ></script> <script type= text/javascript > function rsalogin() bodyRSA(); var result = encryptedString(key document getElementById( pwd ) value); //alert(result); loginForm action= login do?result= +result; loginForm submit(); var key ; function bodyRSA() setMaxDigits( ); key = new RSAKeyPair( c cd a ed aafe dc c f ae a fe fc aba c a c de f dbf af fc c f de a ab affd bdfb ae e d c eef b ba ecd c ae eed f eeca ae ad fd a cc f e b c ab f cfbfd de f cbd );
</script> </head>
<body > <:form action= login method= post focus= username > <table border= > <tr> <td>Login:</td> <td><:text property= username /></td> </tr> <tr> <td>Password:</td> <td><:password property= password styleId= pwd /></td> </tr> <tr> <td colspan= align= center ><input type= button value= SUBMIT onclick= rsalogin(); /></td> </tr> </table> </:form> </body> </:>
/* * Generated by MyEclipse Struts * Template path: templates/java/JavaClass vtl */ package sunsoft struts action;
import java math BigInteger;
import javax servlet HttpServletRequest; import javax servlet HttpServletResponse;
import apache struts action Action; import apache struts action ActionForm; import apache struts action ActionForward; import apache struts action ActionMapping;
import sunsoft struts util RSAUtil;
/** * MyEclipse Struts * Creation date: * * XDoclet definition: * @struts action path= /login name= loginForm input= /login jsp scope= request validate= true * @struts action forward name= error path= /error jsp * @struts action forward name= success path= /success jsp */ public class LoginAction extends Action /* * Generated Methods */
/** * Method execute * @param mapping * @param form * @param request * @param response * @return ActionForward */ public ActionForward execute(ActionMapping mapping ActionForm form HttpServletRequest request HttpServletResponse response) throws Exception //LoginForm loginForm = (LoginForm) form; String result = request getParameter( result ); System out println( 原文加密后为 ); System out println(result); byte[] en_result = new BigInteger(result ) toByteArray(); System out println( 转成byte[] +new String(en_result)); byte[] de_result = RSAUtil decrypt(RSAUtil getKeyPair() getPrivate() en_result); System out println( 还原密文 );
System out println(new String(de_result)); StringBuffer sb = new StringBuffer(); sb append(new String(de_result)); System out println(sb reverse() toString()); return mapping findForward( success );
/* * Generated by MyEclipse Struts * Template path: templates/java/JavaClass vtl */ package sunsoft struts action;
import java math BigInteger;
import javax servlet HttpServletRequest; import javax servlet HttpServletResponse;
import apache struts action Action; import apache struts action ActionForm; import apache struts action ActionForward; import apache struts action ActionMapping;
import sunsoft struts util RSAUtil;
/** * MyEclipse Struts * Creation date: * * XDoclet definition: * @struts action path= /login name= loginForm input= /login jsp scope= request validate= true * @struts action forward name= error path= /error jsp * @struts action forward name= success path= /success jsp */ public class LoginAction extends Action /* * Generated Methods */
/** * Method execute * @param mapping * @param form * @param request * @param response * @return ActionForward */ public ActionForward execute(ActionMapping mapping ActionForm form HttpServletRequest request HttpServletResponse response) throws Exception //LoginForm loginForm = (LoginForm) form; String result = request getParameter( result ); <A title=system target=_blank>system</A> out println( 原文加密后为 ); <A title=system target=_blank>system</A> out println(result); byte[] en_result = new BigInteger(result ) toByteArray(); <A title=system target=_blank>system</A> out println( 转成byte[] +new String(en_result)); byte[] de_result = RSAUtil decrypt(RSAUtil getKeyPair() getPrivate() en_result); <A title=system target=_blank>system</A> out println( 还原密文 );
<A title=system target=_blank>system</A> out println(new String(de_result)); StringBuffer sb = new StringBuffer(); sb append(new String(de_result)); <A title=system target=_blank>system</A> out println(sb reverse() toString()); return mapping findForward( success );
cha138/Article/program/Java/hx/201311/27165相关参考
JAVA里面RSA加密算法的使用 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 打算写这个类用于
Java生成RSA非对称型加密的公钥和私钥 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 非对称
Java中常用的加密算法MD5,SHA,RSA 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! M
实际上就是非对称密钥加密RSA 但为什么不使用jca这些java自带的呢?因为android是非sun的虚拟机其实现方法有不同在现实使用中老是报错而且网上几乎没有资料谈到这些所以干脆自己写纯ja
ASP.Net中如何实现RSA加密 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在我们实际运用
用JavaScript为你的网站加密 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!我们经常会遇到一
以下两个类可以很方便的完成字符串的加密和解密 加密CryptHelperencrypt(password) 解密CrypHelperdecrypt(password) 代码如下 Crypt
论Java加密技术与Windows的结合 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 论Jav
知识大全 Java与JavaScript的通信lixiaolong3456
Java与JavaScript的通信lixiaolong3456 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起
java中使用MD5加密算法进行加密 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在各种应用系