理论可以参考百度;关于加密解密过程降解,觉得比较好的:一篇博文
因客户要求把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()); } } }
相关推荐
密码学 RSA算法 加密和解密 C++ 很好用的 ,理工的学生赶紧来下载吧
RSA加密解密算法 C++ 密码学 RSA加密解密算法 C++ 密码学 RSA加密解密算法 C++ 密码学
下载nacos源码之后进行代码编写,修改了前端用户名和密码加密传输,后端使用RSA算法将收到的信息进行解码判断。内容包含源代码、打包之后的zip文件以及tar.gz文件,可以直接使用。 适用人群:项目使用nacos作为注册...
自己写的RSA加密程序。内附完整算法。附赠MD5数字摘要实现类。
一般而言,用户在登录网站,输入用户名和密码之后,从用户电脑传输到网站服务器,会经过口令传输、口令存储认证等过程。而《报告》中显示,大部分样本网站在传输口令时,没有做加密处理,直接将明文密码向服务端传输...
RSA算法演示RSA算法演示RSA算法演示RSA算法演示RSA算法演示RSA算法演示RSA算法演示RSA算法演示RSA算法演示RSA算法演示RSA算法演示
RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。1987年首次公布,当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏...
读硬盘序列号和加密RSA算法.rar 读硬盘序列号和加密RSA算法.rar
rsa加密算法实例
RSA加密算法在VBRSA加密算法在VBRSA加密算法在VB
RSA加密算法.ppt
本文档是RSA的加密解密算法的实验过程,实现原理,以及RSA实验报告和部分主要的实现算法的代码的附录,本程序基于C语言
QT上RSA加密算法实现,附带图形界面,更加直观
Android之RSA算法加密解密
RSA算法加密解密源码及程序(内含完整的工程文件),包含有源码及完整的工程文件,打开后直接可以运行的
RSA算法加密解密,有VB界面,实现对加密解密算法的调用,形成对txt文件的加密解密。
本rsa算法是使用Java与javascript加密解密范例代码,该资料从互联网收集,加上了自己的使用体会,如果对你有帮助那是万幸! js加密部分
RSA算法加密时,前端JSEncrypt加密,亲自验证!前端引用JSEncrypt调用公钥
RSA加密算法的实现,使用c++语言编程,使用dev c++平台编码,文件为cpp格式。经过反复测试代码正确,可搭配RSA讲解教程一起使用,讲解教程点击我的个人主页即可查看,希望能够对你有帮助,谢谢。
RSA加密算法实现以及C#与java互通加解密,解决RSA算法在java与C#相互通用