理论可以参考百度;关于加密解密过程降解,觉得比较好的:一篇博文
因客户要求把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的核心特点是:加密和解密使用的是两组不同的密钥,一组是公钥,可以公开给任何人;另一组是私钥,必须严格保密。 公钥用于加密数据,任何人都可以获取并用于加密,但只有持有相应私钥的人才能解密。这种特性...
RSA算法是一种非对称加密算法,它在信息安全领域有着广泛的应用,特别是在数据加密、数字签名以及安全通信等方面。它的核心特点在于使用一对密钥,一个用于加密,另一个用于解密,且这两者之间存在数学关系,但计算...
- **快速模幂算法**:该算法用于执行加密和解密操作,即计算`a^b mod n`。 - **扩展欧几里得算法**:此算法用于求解私钥d,即求解方程`de ≡ 1 (mod φ(n))`。 综上所述,通过本实验报告的学习和实践,我们可以深入...
RSA加密算法是公钥密码学中的一个重要组成部分,它在信息安全领域有着广泛的应用,例如数字签名、数据加密等。Qt是一个跨平台的C++图形用户界面应用程序开发框架,它提供了丰富的库支持来创建桌面和移动应用。在本...
下载nacos源码之后进行代码编写,修改了前端用户名和密码加密传输,后端使用RSA算法将收到的信息进行解码判断。内容包含源代码、打包之后的zip文件以及tar.gz文件,可以直接使用。 适用人群:项目使用nacos作为注册...
一般而言,用户在登录网站,输入用户名和密码之后,从用户电脑传输到网站服务器,会经过口令传输、口令存储认证等过程。而《报告》中显示,大部分样本网站在传输口令时,没有做加密处理,直接将明文密码向服务端传输...
RSA算法是一种非对称加密算法,由Ron Rivest、Adi Shamir和...在实际应用中,还需要注意RSA的效率问题,因为其加密和解密速度相比对称加密算法较慢,通常用于小数据量的加密,例如密钥交换,而非大规模数据的直接加密。
RSA是一种非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,因此得名RSA。它的核心特点是使用一对公钥和私钥,其中公钥用于加密,私钥用于解密。这种机制确保了只有拥有私钥的用户才能解密...
RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。1987年首次公布,当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏...
DES(Data Encryption Standard)算法和RSA算法是两种广泛使用的加密方法,分别代表了对称加密和非对称加密的经典案例。 ##### 1. DES算法 DES是一种对称加密算法,由IBM研发,并在1977年被美国政府采纳为非绝密...
RSA(Rivest-Shamir-Adleman)是一种公钥加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出。它的核心特性在于有一对密钥:公钥和私钥。公钥可以公开给任何人,用于加密数据;而私钥必须保密,用于...
RSA加密算法是公钥密码学领域的一个里程碑,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,因此得名RSA。它是一种非对称加密算法,即加密和解密使用不同的密钥,极大地提高了安全性。在C语言中实现RSA...
RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,因其发明者的名字命名,广泛应用于数据加密和数字签名。在RSA中,每个用户拥有两个密钥:一个公钥,可以公开给任何人;另一个私钥,必须保密。加密时,发送方...
8. **性能优化**:由于RSA的加密和解密过程相对复杂,对于大数据量的文件,可能需要考虑分块处理,或者结合对称加密算法(如AES)进行预处理,以提高效率。 综上所述,"RSA算法加密解密"项目利用VB和RSA—com组件,...
资源摘要信息 :"一种基于DES和RSA算法的混合密码系统" 本文介绍了一种基于DES算法和RSA算法的混合密码系统,结合了两者的优点,并克服其缺点。 DES算法是一种对称密码系统,具有高速简便的特点,但加解密密钥相同,...
`RSA.C`可能包含了RSA算法的具体实现,如密钥生成、加密和解密的函数。`RSA.H`可能是头文件,定义了相关的数据结构和函数原型,供其他模块调用。`www.pudn.com.txt`可能是下载这个资源的网站信息或者一些说明文档。 ...
5. RSA 算法实例:RSA 算法在实践中的应用,包括加密和解密的过程。 知识点:RSA 算法实例、加密和解密的过程 6. 设计目的:本课程设计的目的是为了实现 RSA 算法的加密和解密功能。 知识点:课程设计的目的、RSA...
"RSAí¬com╫Θ╝■"可能是一个VB的COM组件,实现了RSA算法的关键功能,如密钥生成、加密和解密。"RSA—com组件"可能与之类似,也是为了在VB环境中方便调用RSA算法。 在实际应用中,RSA算法通常用于保护数据的机密...
RSA加密算法是一种非对称加密技术,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,因此得名RSA。它是现代密码学的基础之一,广泛应用于网络安全,如数据传输加密、数字签名等场景。在这个案例中,我们将...
在C#中,我们可以使用RSACryptoServiceProvider类来实现RSA算法,但这个类默认只支持公钥加密和私钥解密。然而,有时我们可能需要实现私钥加密和公钥解密,这在某些场景下是有用的,例如软件注册码的加密。 标题...