`

RSA算法加密Web页面密码提交和验证实测

 
阅读更多

理论可以参考百度;关于加密解密过程降解,觉得比较好的:一篇博文

因客户要求把web页面提交/验证改用RSA算法加密密文传递到后台:

1,js/jsp客户端部分RSA加密密码;

2,服务端Java解密;

基本流程:

a:以RSA算法在服务端生成密钥对(PublicKey,PrivateKey),session中保存私钥;

b:把公钥Base64编码为Base64字符串通过http response传递到前台;

c:客户端(js)读取公钥解码,以公钥为参数RSA算法加密‘用户密码’,编码为Base64String,提交至服务端;

d:服务端Base64转码‘用户密码’字符串,并以RSA算法(私钥为参数)解密

    e:比较验证解密后的字符串密码;

实现的基本库:

1,客户端js库jsencrypt-2.1.0

2,服务端采用JDK API(java.security.*,javax.crypto.*),apache的commons-codec-1.9

实现细节问题:

1,jsencrypt只用到了加密过程,并且长度不能超过117个英文字符;

2,jdk解密时,密文超过128会出BadPaddingException异常;

3,所以在客户端大于117字符时按117长度分段加密,并按特定分隔符连接提交,在服务端分割字符串后分段解密还原;

 

代码:

(部分,不含Servlet)

客户端:

 

	var enc = function(){
		
		var pubkeystr = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDekiyV+vuvwcqGG2gvVCy/YbL94ke3kWK2ffgiA9puLshrooaHUHVVSyKjnb2qO47ZFEAL41gTt5jY05+r1w/DdLLLjsN8N7rIwNHDmZ2UaitRR5Vo1d+aI4edS+58pUmzUvhQwxpIJSo7JqZtSAtx6OELSwlSUjC+fRX0wiWjHQIDAQAB";
		var crypt = new JSEncrypt();
		crypt.setKey(pubkeystr);
		var datastr = $("#data").val();
		var result = "";
	
		for(var i=0; i<datastr.length; i+=117){			
			//  应当: substring(i,i+117) //如果i+117< length;
			//  应当: substring(i,length)//如果i+117>length
			var sub = datastr.substring(i,i+117);
			if (""===result){
				result = crypt.encrypt(sub);
			}else{
				result += ","+crypt.encrypt(sub);
			}				
		}
		return result;
		
	}

 

服务端:

 

	
	public static void createkeypair(){
		
		try {
			SecureRandom sr = new SecureRandom();
			KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
			kpg.initialize(1024, sr);
			KeyPair kp = kpg.genKeyPair();
			System.out.println("Generate KeyPair:");
			PrivateKey pvk = kp.getPrivate();
			String pvkb64 = Base64.encodeBase64String(pvk.getEncoded());
			System.out.println("PrivateKey(Base64String):\r\n"+pvkb64);
			
			PublicKey pbk = kp.getPublic();
			String pbk64 = Base64.encodeBase64String(pbk.getEncoded());
			System.out.println("PublicKey(Base64String):\r\n"+pbk64);	
			
		} catch (NoSuchAlgorithmException e) {
			System.err.println(e.toString());
		}
		
	}
	
	public static byte[] decspec(byte[] keyv, byte[] encdata) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeySpecException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException{
		
		PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyv); //编码标准 //PKCS8解密 配合 X509加密		
		
		PrivateKey pvk = KeyFactory.getInstance("RSA").generatePrivate(pkcs8KeySpec);
		
		Cipher ce = Cipher.getInstance(pvk.getAlgorithm());
		
		ce.init(Cipher.DECRYPT_MODE, pvk);
		
		return ce.doFinal(encdata);
	}

	public static void decBase64Array(){//分段得到,OK
		String encodedata3 = "rOMx3LB0+n5J2OJBzZN8p2U+Q2uIlMvQbeSTnWqzU1tcUYreYh4fXEwSIAwgfsCMLCnmRLD0Rh3qx3+4d3lHZAo/eWKtSgjOH2fqxtzvnlDMiKVpU0OHCd441EUnlfDCJyKC5z5iC6uNOiGbzKNtmhpvz+18wbCuDV9CoCI49Pk=,OpFfPpYm2rbJYzflRg8hiRY+PSUcGECFTs7nq9bVgkeLBi+e7yU3reOkLCMr/WK9LvGNFAhQl+pZftSeh+4XZQGIcOZVgHarFS7GYdhy9xnEq3cocRR1mnIHlq7NVLR18QJYsE+pCs/oi1rRpNXw5KG6C2cywDl8/JuqsWnYRaw=,FbGedocEygHd/+MTztmHJrPb4nSW4wrJ29piSvvmKoajZRJbWukWIulqlzSQ87Vxem0OPYa3cIsVLOGZkhq5qnfkG7EDm9LijFLVTUbnZ9T3pfQOaSXC9gUjAi5ut9AzGVwKEmImIOQjOeHBvYpUkgn6G/J8YLH6L0obd9lFTMQ=";
		String privatekstr = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAN6SLJX6+6/ByoYbaC9ULL9hsv3iR7eRYrZ9+CID2m4uyGuihodQdVVLIqOdvao7jtkUQAvjWBO3mNjTn6vXD8N0ssuOw3w3usjA0cOZnZRqK1FHlWjV35ojh51L7nylSbNS+FDDGkglKjsmpm1IC3Ho4QtLCVJSML59FfTCJaMdAgMBAAECgYBVFTIAH5LpTD68Z2u7dAUrIBEJpt/dl7FRq/QYJLryleW958Jfpe1ErtVOELX5ho0EBQ66vKzl1LCUasnGKg925Pb4n4QX+PN3V2pBlJy8l5rCtkCmFOptd5+4NLQoYJ2rdi3oIZuMG+JxrVZCqkOJSiPb9JVY/FnrJjNfnYqvTQJBAPJj8jUbSdFy9MH/B2N1gXTzanZO5aXrqbsG2u4ov3JSNHhMX4RMm1eAwA9d+jUMXdDz9d5YvLFi8+Gytuc0h0MCQQDrEVlcTnRWh5ZpI41UxxRatAp9U/9LIOK5r4z92WNaABaeVB9v6oD7k90BWudfu+r9B6kdqxTJx8cm50uJ2JYfAkAaiXSv+b/YLXS8dHZTnj7BFhE2yKZ9xtI7RqHbZxymoHdcIEhozJZJOzBLvmcxPZxbzwnBAQgPh5zZvd4ma+rPAkEA6Th3TmvQZSF1C69oQ5qZCTzjw2CZQ/LGv6/61MjgF6VKy59u6Vzix7f2Z6fHM2aASLdXBMZ+g4wgfOqyOXuXxQJBAJnkkFC46rhJH0NXWOYtWpzVBSs1pZBmxIbUHo1l5aHwPufbkvpd7cDnsou63NapCZdK7nf8t9u6pjFn9YNCTMQ=";
		String[] arrs = encodedata3.split("\\,");
		for (int i = 0; i < arrs.length; i++) {
			byte[] data = Base64.decodeBase64(arrs[i]);//解码,得到RSA加密的数据
			byte[] pvencoded = Base64.decodeBase64(privatekstr);//解码,得到私钥数据			
			try {							
				byte[] databytes = decspec(pvencoded,data);//解密				
				System.out.println("Recovered data:\r\n" + new String(databytes,"utf-8"));
			} catch (Exception e) {
				System.err.println(e.toString());
			} 
		}
			
	}
	

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics