锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

RSA密码加密(Java)实现

时间:2023-12-20 02:37:02 电位器rsa0k11v901s

JWT使用RSA加解密:https://yuanyu.blog.csdn.net/article/details/119490735

1 引入依赖

      commons-codec     commons-codec     1.15 

2 常量

/**  * RSA最大加密明文大小  */ private static final int MAX_ENCRYPT_BLOCK = 117; /**  * RSA最大解密文大小  */ private static final int MAX_DECRYPT_BLOCK = 128;  private static final String ALGORITHM_NAME = "RSA"; private static final String MD5_RSA = "MD5withRSA";
import lombok.extern.slf4j.Slf4j; import org.apache.commons.codec.binary.Base64;  import javax.crypto.Cipher; import java.io.ByteArrayOutputStream; import java.nio.charset.StandardCharsets; import java.security.*; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import java.util.HashMap;

3 获取公钥和私钥

/**  * 获取密钥对  */ public static KeyPair getKeyPair() throws Exception {     KeyPairGenerator generator = KeyPairGenerator.getInstance(ALGORITHM_NAME);     generator.initialize(1024);     return generator.generateKeyPair(); } /**  * 获取base64加密后密钥对  */ public static HashMap getKeyPairMap() throws Exception {     KeyPairGenerator generator = KeyPairGenerator.getInstance(ALGORITHM_NAME);     generator.initialize(1024);     KeyPair keyPair = generator.generateKeyPair();     String privateKey = new String(Base64.encodeBase64(keyPair.getPrivate().getEncoded()));     String publicKey = new String(Base64.encodeBase64(keyPair.getPublic().getEncoded()));     HashMap keyMap = new HashMap<>();     keyMap.put("privateKey", privateKey);     keyMap.put("publicKey", publicKey);     return keyMap; }

4 RSA加密

/**  * 获取公钥  *  * @param publicKey base64加密公钥字符串  */ public static PublicKey getPublicKey(String publicKey) throws Exception {     byte[] decodedKey = Base64.decodeBase64(publicKey.getBytes());     X509EncodedKeySpec keySpec = new X509EncodedKeySpec(decodedKey);     KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM_NAME);     return keyFactory.generatePublic(keySpec); }
/**  * RSA加密  *  * @param data      待加密数据  * @param publicKey 公钥  */ public static String encrypt(String data, PublicKey publicKey) throws Exception {     Cipher cipher = Cipher.getInstance(ALGORITHM_NAME);     cipher.init(Cipher.ENCRYPT_MODE, publicKey);     int inputLen = data.getBytes().length;     ByteArrayOutputStream out = new ByteArrayOutputStream();     int offset = 0;     byte[] cache;     int i = 0;     // 加密数据分段     while (inputLen - offset > 0) {         if (inputLen - offset > MAX_ENCRYPT_BLOCK) {             cache = cipher.doFinal(data.getBytes(), offset, MAX_ENCRYPT_BLOCK);         } else {             cache = cipher.doFinal(data.getBytes(), offset, inputLen - offset);         }         out.write(cache, 0, cache.length);         i  ;         offset = i * MAX_ENCRYPT_BLOCK;     }     byte[] encryptedData = out.toByteArray();     out.close();     // 使用加密内容base64进行编码,并以UTF-88标准转化为字符串     // 加密字符串     return new String(Base64.encodeBase64(encryptedData)); }

5 RSA解密

/**  * 获取私钥  *  * @param privateKey base64加密私钥字符串  */ public static PrivateKey getPrivateKey(String privateKey) throws Exception {     byte[] decodedKey = Base64.decodeBase64(privateKey.getBytes());     PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(decodedKey);     KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM_NAME);     return keyFactory.generatePrivate(keySpec); } 
/**  * RSA解密  *  * @param data       待解密数据  * @param privateKey 私钥  */ public static String decrypt(String data, PrivateKey privateKey) throws Exception {     Cipher cipher = Cipher.getInstance(ALGORITHM_NAME);     cipher.init(Cipher.DECRYPT_MODE, privateKey);     byte[] dataBytes = Base64.decodeBase64(data);     int inputLen = dataBytes.length;     ByteArrayOutputStream out = new ByteArrayOutputStream();     int offset = 0;     byte[] cache;     int i = 0;     // 对数据分段解密     while (inputLen - offset > 0) {         if (inputLen - offset > MAX_DECRYPT_BLOCK) {             cache = cipher.doFinal(dataBytes, offset, MAX_DECRYPT_BLOCK);         } else {             cache = cipher.doFinal(dataBytes, offset, inputLen - offset);         }         out.write(cache, 0, cache.length);         i  ;         offset = i * MAX_DECRYPT_BLOCK;     
    byte[] decryptedData = out.toByteArray();
    out.close();
    // 解密后的内容
    return new String(decryptedData, StandardCharsets.UTF_8);
}

6 RSA签名

/**
 * 签名
 *
 * @param data       待签名数据
 * @param privateKey 私钥
 */
public static String sign(String data, PrivateKey privateKey) throws Exception {
    byte[] keyBytes = privateKey.getEncoded();
    PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
    KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM_NAME);
    PrivateKey key = keyFactory.generatePrivate(keySpec);
    Signature signature = Signature.getInstance(MD5_RSA);
    signature.initSign(key);
    signature.update(data.getBytes());
    return new String(Base64.encodeBase64(signature.sign()));
}

/**
 * 验签
 *
 * @param srcData   原始字符串
 * @param publicKey 公钥
 * @param sign      签名
 */
public static boolean verify(String srcData, PublicKey publicKey, String sign) throws Exception {
    byte[] keyBytes = publicKey.getEncoded();
    X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
    KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM_NAME);
    PublicKey key = keyFactory.generatePublic(keySpec);
    Signature signature = Signature.getInstance(MD5_RSA);
    signature.initVerify(key);
    signature.update(srcData.getBytes());
    return signature.verify(Base64.decodeBase64(sign.getBytes()));
}

7 测试

public static void main(String[] args) {
    try {

        // 生成密钥对
        //KeyPair keyPair = getKeyPair();
        //String privateKey = new String(Base64.encodeBase64(keyPair.getPrivate().getEncoded()));
        //String publicKey = new String(Base64.encodeBase64(keyPair.getPublic().getEncoded()));
        //System.out.println("私钥 => " + privateKey + "\n");
        //System.out.println("公钥 =>" + publicKey + "\n");

        HashMap keyPairMap = getKeyPairMap();
        String privateKey = keyPairMap.get("privateKey");
        String publicKey =  keyPairMap.get("publicKey");
        System.out.println("私钥 => " + privateKey + "\n");
        System.out.println("公钥 =>" + publicKey + "\n");

        // RSA加密
        //String data = "123456";
        String data = "123456111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111";
        String encryptData = encrypt(data, getPublicKey(publicKey));
        System.out.println("加密后内容 => " + encryptData + "\n");
        // RSA解密
        String decryptData = decrypt(encryptData, getPrivateKey(privateKey));
        System.out.println("解密后内容 => " + decryptData + "\n");


        // RSA签名
        String sign = sign(data, getPrivateKey(privateKey));
        // RSA验签
        boolean result = verify(data, getPublicKey(publicKey), sign);
        System.out.println("验签结果 => " + result + "\n");

    } catch (Exception e) {
        e.printStackTrace();
        System.err.println("RSA加解密异常");
    }
}

8 前端使用jsencrypt加密

安装

npm install jsencrypt

引入

import JSEncrypt from 'jsencrypt'

rsa加密

const encryptor = new JSEncrypt()                      // 创建加密对象实例
const pubKey = ''
encryptor.setPublicKey(pubKey)						   //设置公钥
const rsaPassWord = encryptor.encrypt('要加密的内容')   // 对内容进行加密

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章