zoukankan      html  css  js  c++  java
  • 用javascript与java进行RSA加密与解密

    这几天一直做安全登录,网上查了好多资料,不尽如意。

    具体实现思路如下:

    1。服务端生成公钥与私钥,保存。

    2。客户端在请求到登录页面后,随机生成一字符串。

    3。后此随机字符串作为密钥加密密码,再用从服务端获取到的公钥加密生成的随机字符串。

    4。将此两段密文传入服务端,服务端用私钥解出随机字符串,再用此私钥解出加密的密文。

    这其中有一个关键是解决服务端的公钥,传入客户端,客户端用此公钥加密字符串后,后又能在服务端用私钥解出。

    此文即为实现此步而作。

    加密算法为RSA:

    1。服务端的RSA  java实现。

    Java代码 复制代码 收藏代码
    1. /**  
    2.  *   
    3.  */  
    4. package com.sunsoft.struts.util;   
    5.   
    6. import java.io.ByteArrayOutputStream;   
    7. import java.io.FileInputStream;   
    8. import java.io.FileOutputStream;   
    9. import java.io.ObjectInputStream;   
    10. import java.io.ObjectOutputStream;   
    11. import java.math.BigInteger;   
    12. import java.security.KeyFactory;   
    13. import java.security.KeyPair;   
    14. import java.security.KeyPairGenerator;   
    15. import java.security.NoSuchAlgorithmException;   
    16. import java.security.PrivateKey;   
    17. import java.security.PublicKey;   
    18. import java.security.SecureRandom;   
    19. import java.security.interfaces.RSAPrivateKey;   
    20. import java.security.interfaces.RSAPublicKey;   
    21. import java.security.spec.InvalidKeySpecException;   
    22. import java.security.spec.RSAPrivateKeySpec;   
    23. import java.security.spec.RSAPublicKeySpec;   
    24.   
    25. import javax.crypto.Cipher;   
    26.   
    27.   
    28.   
    29. /**  
    30.  * RSA 工具类。提供加密,解密,生成密钥对等方法。  
    31.  * 需要到http://www.bouncycastle.org下载bcprov-jdk14-123.jar。  
    32.  *   
    33.  */  
    34. public class RSAUtil {   
    35.     /**  
    36.      * * 生成密钥对 *  
    37.      *   
    38.      * @return KeyPair *  
    39.      * @throws EncryptException  
    40.      */  
    41.     public static KeyPair generateKeyPair() throws Exception {   
    42.         try {   
    43.             KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA",   
    44.                     new org.bouncycastle.jce.provider.BouncyCastleProvider());   
    45.             final int KEY_SIZE = 1024;// 没什么好说的了,这个值关系到块加密的大小,可以更改,但是不要太大,否则效率会低   
    46.             keyPairGen.initialize(KEY_SIZE, new SecureRandom());   
    47.             KeyPair keyPair = keyPairGen.generateKeyPair();   
    48.             saveKeyPair(keyPair);   
    49.             return keyPair;   
    50.         } catch (Exception e) {   
    51.             throw new Exception(e.getMessage());   
    52.         }   
    53.     }   
    54.        
    55.     public static KeyPair getKeyPair()throws Exception{   
    56.         FileInputStream fis = new FileInputStream("C:/RSAKey.txt");   
    57.          ObjectInputStream oos = new ObjectInputStream(fis);   
    58.          KeyPair kp= (KeyPair) oos.readObject();   
    59.          oos.close();   
    60.          fis.close();   
    61.          return kp;   
    62.     }   
    63.        
    64.     public static void saveKeyPair(KeyPair kp)throws Exception{   
    65.            
    66.          FileOutputStream fos = new FileOutputStream("C:/RSAKey.txt");   
    67.          ObjectOutputStream oos = new ObjectOutputStream(fos);   
    68.          //生成密钥   
    69.          oos.writeObject(kp);   
    70.          oos.close();   
    71.          fos.close();   
    72.     }   
    73.   
    74.     /**  
    75.      * * 生成公钥 *  
    76.      *   
    77.      * @param modulus *  
    78.      * @param publicExponent *  
    79.      * @return RSAPublicKey *  
    80.      * @throws Exception  
    81.      */  
    82.     public static RSAPublicKey generateRSAPublicKey(byte[] modulus,   
    83.             byte[] publicExponent) throws Exception {   
    84.         KeyFactory keyFac = null;   
    85.         try {   
    86.             keyFac = KeyFactory.getInstance("RSA",   
    87.                     new org.bouncycastle.jce.provider.BouncyCastleProvider());   
    88.         } catch (NoSuchAlgorithmException ex) {   
    89.             throw new Exception(ex.getMessage());   
    90.         }   
    91.   
    92.         RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(new BigInteger(   
    93.                 modulus), new BigInteger(publicExponent));   
    94.         try {   
    95.             return (RSAPublicKey) keyFac.generatePublic(pubKeySpec);   
    96.         } catch (InvalidKeySpecException ex) {   
    97.             throw new Exception(ex.getMessage());   
    98.         }   
    99.     }   
    100.   
    101.     /**  
    102.      * * 生成私钥 *  
    103.      *   
    104.      * @param modulus *  
    105.      * @param privateExponent *  
    106.      * @return RSAPrivateKey *  
    107.      * @throws Exception  
    108.      */  
    109.     public static RSAPrivateKey generateRSAPrivateKey(byte[] modulus,   
    110.             byte[] privateExponent) throws Exception {   
    111.         KeyFactory keyFac = null;   
    112.         try {   
    113.             keyFac = KeyFactory.getInstance("RSA",   
    114.                     new org.bouncycastle.jce.provider.BouncyCastleProvider());   
    115.         } catch (NoSuchAlgorithmException ex) {   
    116.             throw new Exception(ex.getMessage());   
    117.         }   
    118.   
    119.         RSAPrivateKeySpec priKeySpec = new RSAPrivateKeySpec(new BigInteger(   
    120.                 modulus), new BigInteger(privateExponent));   
    121.         try {   
    122.             return (RSAPrivateKey) keyFac.generatePrivate(priKeySpec);   
    123.         } catch (InvalidKeySpecException ex) {   
    124.             throw new Exception(ex.getMessage());   
    125.         }   
    126.     }   
    127.   
    128.     /**  
    129.      * * 加密 *  
    130.      *   
    131.      * @param key  
    132.      *            加密的密钥 *  
    133.      * @param data  
    134.      *            待加密的明文数据 *  
    135.      * @return 加密后的数据 *  
    136.      * @throws Exception  
    137.      */  
    138.     public static byte[] encrypt(PublicKey pk, byte[] data) throws Exception {   
    139.         try {   
    140.             Cipher cipher = Cipher.getInstance("RSA",   
    141.                     new org.bouncycastle.jce.provider.BouncyCastleProvider());   
    142.             cipher.init(Cipher.ENCRYPT_MODE, pk);   
    143.             int blockSize = cipher.getBlockSize();// 获得加密块大小,如:加密前数据为128个byte,而key_size=1024   
    144.             // 加密块大小为127   
    145.             // byte,加密后为128个byte;因此共有2个加密块,第一个127   
    146.             // byte第二个为1个byte   
    147.             int outputSize = cipher.getOutputSize(data.length);// 获得加密块加密后块大小   
    148.             int leavedSize = data.length % blockSize;   
    149.             int blocksSize = leavedSize != 0 ? data.length / blockSize + 1  
    150.                     : data.length / blockSize;   
    151.             byte[] raw = new byte[outputSize * blocksSize];   
    152.             int i = 0;   
    153.             while (data.length - i * blockSize > 0) {   
    154.                 if (data.length - i * blockSize > blockSize)   
    155.                     cipher.doFinal(data, i * blockSize, blockSize, raw, i   
    156.                             * outputSize);   
    157.                 else  
    158.                     cipher.doFinal(data, i * blockSize, data.length - i   
    159.                             * blockSize, raw, i * outputSize);   
    160.                 // 这里面doUpdate方法不可用,查看源代码后发现每次doUpdate后并没有什么实际动作除了把byte[]放到   
    161.                 // ByteArrayOutputStream中,而最后doFinal的时候才将所有的byte[]进行加密,可是到了此时加密块大小很可能已经超出了   
    162.                 // OutputSize所以只好用dofinal方法。   
    163.   
    164.                 i++;   
    165.             }   
    166.             return raw;   
    167.         } catch (Exception e) {   
    168.             throw new Exception(e.getMessage());   
    169.         }   
    170.     }   
    171.   
    172.     /**  
    173.      * * 解密 *  
    174.      *   
    175.      * @param key  
    176.      *            解密的密钥 *  
    177.      * @param raw  
    178.      *            已经加密的数据 *  
    179.      * @return 解密后的明文 *  
    180.      * @throws Exception  
    181.      */  
    182.     public static byte[] decrypt(PrivateKey pk, byte[] raw) throws Exception {   
    183.         try {   
    184.             Cipher cipher = Cipher.getInstance("RSA",   
    185.                     new org.bouncycastle.jce.provider.BouncyCastleProvider());   
    186.             cipher.init(cipher.DECRYPT_MODE, pk);   
    187.             int blockSize = cipher.getBlockSize();   
    188.             ByteArrayOutputStream bout = new ByteArrayOutputStream(64);   
    189.             int j = 0;   
    190.   
    191.             while (raw.length - j * blockSize > 0) {   
    192.                 bout.write(cipher.doFinal(raw, j * blockSize, blockSize));   
    193.                 j++;   
    194.             }   
    195.             return bout.toByteArray();   
    196.         } catch (Exception e) {   
    197.             throw new Exception(e.getMessage());   
    198.         }   
    199.     }   
    200.   
    201.     /**  
    202.      * * *  
    203.      *   
    204.      * @param args *  
    205.      * @throws Exception  
    206.      */  
    207.     public static void main(String[] args) throws Exception {   
    208.         RSAPublicKey rsap = (RSAPublicKey) RSAUtil.generateKeyPair().getPublic();   
    209.         String test = "hello world";   
    210.         byte[] en_test = encrypt(getKeyPair().getPublic(),test.getBytes());   
    211.         byte[] de_test = decrypt(getKeyPair().getPrivate(),en_test);   
    212.         System.out.println(new String(de_test));   
    213.     }   
    214. }  
    /**
     * 
     */
    package com.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 工具类。提供加密,解密,生成密钥对等方法。
     * 需要到http://www.bouncycastle.org下载bcprov-jdk14-123.jar。
     * 
     */
    public class RSAUtil {
    	/**
    	 * * 生成密钥对 *
    	 * 
    	 * @return KeyPair *
    	 * @throws EncryptException
    	 */
    	public static KeyPair generateKeyPair() throws Exception {
    		try {
    			KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA",
    					new org.bouncycastle.jce.provider.BouncyCastleProvider());
    			final int KEY_SIZE = 1024;// 没什么好说的了,这个值关系到块加密的大小,可以更改,但是不要太大,否则效率会低
    			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 org.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 org.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 org.bouncycastle.jce.provider.BouncyCastleProvider());
    			cipher.init(Cipher.ENCRYPT_MODE, pk);
    			int blockSize = cipher.getBlockSize();// 获得加密块大小,如:加密前数据为128个byte,而key_size=1024
    			// 加密块大小为127
    			// byte,加密后为128个byte;因此共有2个加密块,第一个127
    			// byte第二个为1个byte
    			int outputSize = cipher.getOutputSize(data.length);// 获得加密块加密后块大小
    			int leavedSize = data.length % blockSize;
    			int blocksSize = leavedSize != 0 ? data.length / blockSize + 1
    					: data.length / blockSize;
    			byte[] raw = new byte[outputSize * blocksSize];
    			int i = 0;
    			while (data.length - i * blockSize > 0) {
    				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 org.bouncycastle.jce.provider.BouncyCastleProvider());
    			cipher.init(cipher.DECRYPT_MODE, pk);
    			int blockSize = cipher.getBlockSize();
    			ByteArrayOutputStream bout = new ByteArrayOutputStream(64);
    			int j = 0;
    
    			while (raw.length - j * blockSize > 0) {
    				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));
    	}
    }
    

     2.测试页面:

    IndexAction.java

    Java代码 复制代码 收藏代码
    1. /*  
    2.  * Generated by MyEclipse Struts  
    3.  * Template path: templates/java/JavaClass.vtl  
    4.  */  
    5. package com.sunsoft.struts.action;   
    6.   
    7. import java.security.interfaces.RSAPrivateKey;   
    8. import java.security.interfaces.RSAPublicKey;   
    9.   
    10. import javax.servlet.http.HttpServletRequest;   
    11. import javax.servlet.http.HttpServletResponse;   
    12.   
    13. import org.apache.struts.action.Action;   
    14. import org.apache.struts.action.ActionForm;   
    15. import org.apache.struts.action.ActionForward;   
    16. import org.apache.struts.action.ActionMapping;   
    17.   
    18. import com.sunsoft.struts.util.RSAUtil;   
    19.   
    20. /**   
    21.  * MyEclipse Struts  
    22.  * Creation date: 06-28-2008  
    23.  *   
    24.  * XDoclet definition:  
    25.  * @struts.action validate="true"  
    26.  */  
    27. public class IndexAction extends Action {   
    28.     /*  
    29.      * Generated Methods  
    30.      */  
    31.   
    32.     /**   
    33.      * Method execute  
    34.      * @param mapping  
    35.      * @param form  
    36.      * @param request  
    37.      * @param response  
    38.      * @return ActionForward  
    39.      */  
    40.     public ActionForward execute(ActionMapping mapping, ActionForm form,   
    41.             HttpServletRequest request, HttpServletResponse response)throws Exception {   
    42.            
    43.         RSAPublicKey rsap = (RSAPublicKey) RSAUtil.getKeyPair().getPublic();   
    44.         String module = rsap.getModulus().toString(16);   
    45.         String empoent = rsap.getPublicExponent().toString(16);   
    46.         System.out.println("module");   
    47.         System.out.println(module);   
    48.         System.out.println("empoent");   
    49.         System.out.println(empoent);   
    50.         request.setAttribute("m", module);   
    51.         request.setAttribute("e", empoent);   
    52.         return mapping.findForward("login");   
    53.     }   
    54. }  
    /*
     * Generated by MyEclipse Struts
     * Template path: templates/java/JavaClass.vtl
     */
    package com.sunsoft.struts.action;
    
    import java.security.interfaces.RSAPrivateKey;
    import java.security.interfaces.RSAPublicKey;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.struts.action.Action;
    import org.apache.struts.action.ActionForm;
    import org.apache.struts.action.ActionForward;
    import org.apache.struts.action.ActionMapping;
    
    import com.sunsoft.struts.util.RSAUtil;
    
    /** 
     * MyEclipse Struts
     * Creation date: 06-28-2008
     * 
     * 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(16);
    		String empoent = rsap.getPublicExponent().toString(16);
    		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");
    	}
    }

     通过此action进入登录页面,并传入公钥的 Modulus 与PublicExponent的hex编码形式。

    3。登录页面 login.jsp

    Html代码 复制代码 收藏代码
    1. <%@ page language="java" pageEncoding="GBK"%>  
    2.   
    3. <%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>  
    4. <%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>  
    5. <%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %>  
    6. <%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles" %>  
    7.   
    8. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
    9. <html:html lang="true">  
    10.   <head>  
    11.     <html:base />  
    12.        
    13.     <title>login</title>  
    14.   
    15.     <meta http-equiv="pragma" content="no-cache">  
    16.     <meta http-equiv="cache-control" content="no-cache">  
    17.     <meta http-equiv="expires" content="0">       
    18.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
    19.     <meta http-equiv="description" content="This is my page">  
    20.     <!--  
    21.     <link rel="stylesheet" type="text/css" href="styles.css">  
    22.     -->  
    23. <script type="text/javascript" src="js/RSA.js"></script>  
    24. <script type="text/javascript" src="js/BigInt.js"></script>  
    25. <script type="text/javascript" src="js/Barrett.js"></script>  
    26. <script type="text/javascript">  
    27. function rsalogin()   
    28. {   
    29.    bodyRSA();   
    30.    var result = encryptedString(key, document.getElementById("pwd").value);   
    31.    //alert(result);   
    32.    loginForm.action="login.do?result="+result;   
    33.    loginForm.submit();   
    34. }   
    35. var key ;   
    36. function bodyRSA()   
    37. {   
    38.     setMaxDigits(130);   
    39.     key = new RSAKeyPair("10001","","8c1cd09a04ed01aafe70dc84c5f32ae23a16fe8fc8898aba6797c5a9c708720de4f08dbf086af429fc51c0636208f56de20a8ab5686affd9bdfb643ae1e90d5617155c4867eef06b0884ba8ecd187907c7069ae3eed4f0155eeca6573411864035ae803ad8fd91a0cc479f27e41b19c13465ab30f3cfbfd14de56f49cbd09481");    
    40.      
    41. }   
    42.   
    43. </script>  
    44.   </head>  
    45.      
    46.   <body >  
    47.     <html:form action="login" method="post" focus="username">  
    48.       <table border="0">  
    49.         <tr>  
    50.           <td>Login:</td>  
    51.           <td><html:text property="username" /></td>  
    52.         </tr>  
    53.         <tr>  
    54.           <td>Password:</td>  
    55.           <td><html:password property="password" styleId="pwd"/></td>  
    56.         </tr>  
    57.         <tr>  
    58.           <td colspan="2" align="center"><input type="button" value="SUBMIT" onclick="rsalogin();"/></td>  
    59.         </tr>  
    60.       </table>  
    61.     </html:form>  
    62.   </body>  
    63. </html:html>  
    <%@ page language="java" pageEncoding="GBK"%>
    
    <%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
    <%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
    <%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %>
    <%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles" %>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html:html lang="true">
      <head>
        <html:base />
        
        <title>login</title>
    
    	<meta http-equiv="pragma" content="no-cache">
    	<meta http-equiv="cache-control" content="no-cache">
    	<meta http-equiv="expires" content="0">    
    	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    	<meta http-equiv="description" content="This is my page">
    	<!--
    	<link rel="stylesheet" type="text/css" href="styles.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(130);
      	key = new RSAKeyPair("10001","","8c1cd09a04ed01aafe70dc84c5f32ae23a16fe8fc8898aba6797c5a9c708720de4f08dbf086af429fc51c0636208f56de20a8ab5686affd9bdfb643ae1e90d5617155c4867eef06b0884ba8ecd187907c7069ae3eed4f0155eeca6573411864035ae803ad8fd91a0cc479f27e41b19c13465ab30f3cfbfd14de56f49cbd09481"); 
      
    }
    
    </script>
      </head>
      
      <body >
        <html:form action="login" method="post" focus="username">
          <table border="0">
            <tr>
              <td>Login:</td>
              <td><html:text property="username" /></td>
            </tr>
            <tr>
              <td>Password:</td>
              <td><html:password property="password" styleId="pwd"/></td>
            </tr>
            <tr>
              <td colspan="2" align="center"><input type="button" value="SUBMIT" onclick="rsalogin();"/></td>
            </tr>
          </table>
        </html:form>
      </body>
    </html:html>
    

     3.点击登录后,调用LoginAction.java

    Java代码 复制代码 收藏代码
    1. /*  
    2.  * Generated by MyEclipse Struts  
    3.  * Template path: templates/java/JavaClass.vtl  
    4.  */  
    5. package com.sunsoft.struts.action;   
    6.   
    7. import java.math.BigInteger;   
    8.   
    9. import javax.servlet.http.HttpServletRequest;   
    10. import javax.servlet.http.HttpServletResponse;   
    11.   
    12. import org.apache.struts.action.Action;   
    13. import org.apache.struts.action.ActionForm;   
    14. import org.apache.struts.action.ActionForward;   
    15. import org.apache.struts.action.ActionMapping;   
    16.   
    17. import com.sunsoft.struts.util.RSAUtil;   
    18.   
    19. /**   
    20.  * MyEclipse Struts  
    21.  * Creation date: 06-28-2008  
    22.  *   
    23.  * XDoclet definition:  
    24.  * @struts.action path="/login" name="loginForm" input="/login.jsp" scope="request" validate="true"  
    25.  * @struts.action-forward name="error" path="/error.jsp"  
    26.  * @struts.action-forward name="success" path="/success.jsp"  
    27.  */  
    28. public class LoginAction extends Action {   
    29.     /*  
    30.      * Generated Methods  
    31.      */  
    32.   
    33.     /**   
    34.      * Method execute  
    35.      * @param mapping  
    36.      * @param form  
    37.      * @param request  
    38.      * @param response  
    39.      * @return ActionForward  
    40.      */  
    41.     public ActionForward execute(ActionMapping mapping, ActionForm form,   
    42.             HttpServletRequest request, HttpServletResponse response) throws Exception{   
    43.         //LoginForm loginForm = (LoginForm) form;   
    44.         String result = request.getParameter("result");   
    45.         System.out.println("原文加密后为:");   
    46.         System.out.println(result);   
    47.         byte[] en_result = new BigInteger(result, 16).toByteArray();   
    48.         System.out.println("转成byte[]"+new String(en_result));   
    49.         byte[] de_result = RSAUtil.decrypt(RSAUtil.getKeyPair().getPrivate(),en_result);   
    50.         System.out.println("还原密文:");   
    51.            
    52.         System.out.println(new String(de_result));   
    53.         StringBuffer sb = new StringBuffer();   
    54.         sb.append(new String(de_result));   
    55.         System.out.println(sb.reverse().toString());   
    56.         return mapping.findForward("success");   
    57.     }   
    58. }  
    /*
     * Generated by MyEclipse Struts
     * Template path: templates/java/JavaClass.vtl
     */
    package com.sunsoft.struts.action;
    
    import java.math.BigInteger;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.struts.action.Action;
    import org.apache.struts.action.ActionForm;
    import org.apache.struts.action.ActionForward;
    import org.apache.struts.action.ActionMapping;
    
    import com.sunsoft.struts.util.RSAUtil;
    
    /** 
     * MyEclipse Struts
     * Creation date: 06-28-2008
     * 
     * 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, 16).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");
    	}
    }

     因为发现解出的明文是倒序的,后面就用StringBuffer的reverse()来转换了一下。

    4。login.jsp所调用的js

  • 相关阅读:
    在应用程序级别之外使用注册为 allowDefinition='MachineToApplication' 的节是错误的……
    VS 扩展管理器,方便的插件
    VUE CLI中使用Jquery无法获取到dom节点
    Navicat 连接SQL Server LocalDB的方法
    修改cas登陆页面服务器端
    easyui tree 拖拽功能并将数据返回后台保存至数据库
    RedHat下GCC及G++的安装
    Java中的字符串池
    Java内存泄露
    TSQL字符转义
  • 原文地址:https://www.cnblogs.com/langtianya/p/2994912.html
Copyright © 2011-2022 走看看