RSA算法

RSA算法
郭顺发1. RSA 算法介绍
- 非对称加密,即:PK(PUBLIC_KEY 公钥) 与 SK( SECRET_KEY 密钥) 不是同一个。
- PK 加密时,必须用 SK 解密、反之 SK 加密时,必须用 PK 解密。
- PK 决定 SK,但是 PK 很难算出 SK(数学原理:两个大质数相乘,积很难因式分解)。
- 速度慢,适合对少量数据加密。
img
2. Java 使用RSA算法
这里的例子 公钥私钥中使用了外在key,获取/生成公钥私钥时
1 | import org.apache.tomcat.util.codec.binary.Base64;import sun.misc.BASE64Decoder;import sun.misc.BASE64Encoder;import javax.crypto.Cipher;import java.security.*;import java.security.spec.EncodedKeySpec;import java.security.spec.PKCS8EncodedKeySpec;import java.security.spec.X509EncodedKeySpec;/** * RSA 非对称加密工具类。 * 1、公钥(PUBLIC_KEY)、私钥:PRIVATE_KEY 必须分开使用,比如公钥加密时,必须是私钥解密,反之私钥加密时,必须是公钥解密 */public class CipherRsaUtils { /** * CIPHER_TRANSFORMS : cipher 实例化时的 加密算法/反馈模式/填充方案。ECB 表示无向量模式 * ALGORITHM: 创建密钥时使用的算法 * KEY_PAIR_LENGTH: 秘钥对长度。数值越大,能加密的内容就越大。 * <p> * 如 KEY_PAIR_LENGTH 为 1024 时加密数据的长度不能超过 117 字节 * 如 KEY_PAIR_LENGTH 为 2048 时加密数据的长度不能超过 245 字节 * 依次类推 * </p> */ private static final String CIPHER_TRANSFORMS = "RSA/ECB/PKCS1Padding"; private static final int KEY_PAIR_LENGTH = 1024; /** * 生成 RSA 密钥对:公钥(PUBLIC_KEY)、私钥:PRIVATE_KEY |
3. H5 使用RSA算法
使用JSEncrypt加密解密
3.1. 导入JSEncrypt包
1 | <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jsencrypt/3.0.0-rc.1/jsencrypt.min.js"></script> |
这里也加了npm 加入的方式。
安装 npm i jsencrypt –save
引用 import {JSEncrypt} from ‘jsencrypt’
3.2. 默认值和方法
3.3. demo
1 | // 公钥const publicKey = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQChJ0KXUmAiLImRWXlqxwKNDjYxRqKHNzMIHNSISsYAERxuK7T9NsJezONsOFeao4gIpTlvtuTnF8/L+d17GNGeIp4cJLO+NMj6RO6N+YJPKMsST/8beVu3sY6kNKy74QzkRXNfyOk/bWXnAPUxO/HjzqYtxetOpQL2pzYxGIysyQIDAQAB';// 私钥const privateKey = 'MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKEnQpdSYCIsiZFZeWrHAo0ONjFGooc3Mwgc1IhKxgARHG4rtP02wl7M42w4V5qjiAilOW+25OcXz8v53XsY0Z4inhwks740yPpE7o35gk8oyxJP/xt5W7exjqQ0rLvhDORFc1/I6T9tZecA9TE78ePOpi3F606lAvanNjEYjKzJAgMBAAECgYBjIDsdyVXIr4yPE3JT88Xl7e/3r3MZqSKCwvkYPKY+NEhAnDHf72bv2Seq0Z1RSXXLm5YQ2XdDjqoK1c8egM2uc44eeLGQzygB7IseA1I1wRcuaUVt59KhbRvcWTaK5fLaZ6lad+l/TXfk9Bq5tQEs11lLt1UdRXdDW41pH6OvgQJBAOg4IG4A96aU71TAs1GiGDuLq+pbXD41cn63V2v0Pawli8Kn7wBGgl4l3m3bb+iHJH/IlgQUpD1dtIyhU2zGux0CQQCxqBDoB02wVpUYbzjoFyBmVRiqGULhhz8nlG7XVXNOXuJ6VmAPr1fDdMCcc1YHs3yMc5jE7qqkesf0K0QcK9ydAkBysMXTjsbBj21k/oeSGey9/A28gcLdNqiFzSdwOgD7tM+CJE72Y9yfgzSILYjn31c3hWoSOd+kL1Os4UDCyKRBAkAUrYcqOo9kUu+PpIJvISH4RzdTtRT/wwoqxTARiDSfjpO1wY/0w2fnrBMvIo2E3/NDNcE2SsE528CiPtbyoHhRAkEArzj8fy2T927A08bXv2pmbI7/joQ2GqcIiOA940Cl8B+dTg+GxKuHqJisy4hYJ+3LyWmSVbIGahRoAUKv7yssRg==';// 密码const password = "pandacode";// 加密后的密码const encryptPwd = encrypt(password);// 解密后的密码const decryptPwd = decrypt(encryptPwd);console.log("公钥:" + publicKey);console.log("私钥:" + privateKey);console.log("原密码:" + password);console.log("密码加密后:" + encryptPwd);console.log("密码解密后:" + decryptPwd);// 加密function encrypt(msg) { |