rsa 前后端加解密

1、服务端加密解密:

import org.bouncycastle.jce.provider.BouncyCastleProvider;

import javax.crypto.Cipher;
import java.io.ByteArrayOutputStream;
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.Base64;
public class RsaUtils {


    private static final String RSA_ALGORITHM = "RSA";
    private static final int MAX_DECRYPT_BLOCK = 128;
    private static  RSAPublicKey publicKey;
    private static  RSAPrivateKey privateKey;

    public static RsaUtils instance(){
        return new RsaUtils();
    }


    public void geneKeys() throws NoSuchAlgorithmException {
            KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(RSA_ALGORITHM, new BouncyCastleProvider());
            keyPairGenerator.initialize(1024);
            KeyPair keyPair = keyPairGenerator.generateKeyPair();
            privateKey = (RSAPrivateKey) keyPair.getPrivate();
            publicKey = (RSAPublicKey)keyPair.getPublic();
    }


    public String encodeByPrivateKey(String body) throws Exception {
        Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);
        cipher.init(Cipher.ENCRYPT_MODE, privateKey);
        return Base64.getEncoder().encodeToString(cipher.doFinal(body.getBytes("utf-8")));
    }

    public String encodeByPublicKey(String body)  throws Exception {
        Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        return Base64.getEncoder().encodeToString(cipher.doFinal(body.getBytes("utf-8")));
    }


    public String decodeByPrivateKey(String body)   throws Exception {
        Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        return decryptByPrivateKey(body);
    }


    public String decodeByPublicKey(String body)    throws Exception {
        Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);
        cipher.init(Cipher.DECRYPT_MODE, publicKey);
        return new String(cipher.doFinal(Base64.getDecoder().decode(body)));
    }


    /**
     * 私钥解密
     *
     * @param encryptedStr
     * @return
     */
    public  String decryptByPrivateKey(String encryptedStr)
    {
        try
        {
            // 对私钥解密
            byte[] privateKeyBytes = privateKey.getEncoded();
            // 获得私钥
            PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes);
            // 获得待解密数据
            byte[] data = decryptBase64(encryptedStr);
            KeyFactory factory = KeyFactory.getInstance("RSA");
            PrivateKey privateKey = factory.generatePrivate(keySpec);
            // 对数据解密
            Cipher cipher = Cipher.getInstance(factory.getAlgorithm());
            cipher.init(Cipher.DECRYPT_MODE, privateKey);
            // 返回UTF-8编码的解密信息
            int inputLen = data.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(data, offSet, MAX_DECRYPT_BLOCK);
                } else
                {
                    cache = cipher.doFinal(data, 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, "UTF-8");
        } catch (Exception e)
        {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * BASE64 解码
     *
     * @param key 需要Base64解码的字符串
     * @return 字节数组
     */
    public static byte[] decryptBase64(String key)
    {
        return Base64.getDecoder().decode(key);
    }


    public static void main(String[] args) throws Exception {
        RsaUtils rsaUtils = new RsaUtils();
        rsaUtils.geneKeys();
        String encodes = rsaUtils.encodeByPrivateKey("123456");
        System.out.println("加密前:"+123456);
        System.out.println("公钥:"+Base64.getEncoder().encodeToString(RsaUtils.publicKey.getEncoded()));
        System.out.println("私钥:"+Base64.getEncoder().encodeToString(RsaUtils.privateKey.getEncoded()));
        System.out.println("私钥加密后:"+encodes);
        System.out.println("公钥加密后:"+rsaUtils.encodeByPublicKey("123456"));
        System.out.println("公钥解密后:"+rsaUtils.decodeByPublicKey(encodes));
    }
}

加密前:123456
公钥:MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCgSZEMYSVYc/xAka4rLGtADBqKrZ2tzxLv9PpH4DgGqngfZbJDLEK1alGffXGwgg48mAryHtaCYt9d9xsIHqyYomQq5kASzaBSfOMrieCd5aGQSBot9v8yFcvHnUtnJ7IggXoBEfDLEn5tXHxJgQf6ra6tW/i89vTeuodHMvPBaQIDAQAB
私钥:MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAKBJkQxhJVhz/ECRrissa0AMGoqtna3PEu/0+kfgOAaqeB9lskMsQrVqUZ99cbCCDjyYCvIe1oJi3133GwgerJiiZCrmQBLNoFJ84yuJ4J3loZBIGi32/zIVy8edS2cnsiCBegER8MsSfm1cfEmBB/qtrq1b+Lz29N66h0cy88FpAgMBAAECgYAV/lItSS0nKG8N6w9jdCpZNO/1ZGI05at7CnnHIACABacK49jkd6/FlcuSX1OYvRe3/8LMuyeC548vpQbsA815wl2IMQVBtG58i/jjWzhUh4VTgYVubloKBf7GLCxX39DFF5E9oOQa9cMOwwxDkSvU9DVeRvQGlcx8v0I/Lnub6wJBANnksVTY3smY7Ud1Xv2A4DIRHMWy/p9LyuTtVBjsvP7tKf3wUrGqkeVVEkkThpaZ+2GRg59KDp1+4Mewid33JP8CQQC8UcvL+lWhm+Zw7eHW5fm+uldjHksl3jysNoqMoAa4D09pCekS3NpIE+Pcw4sI2c16FLG0wnN7ds1RZWGLSBGXAkEAx2axHgulvmnz4yw3NNjm0wq0APxwZckPsXa7OmAUCVtyzVBL7QlCoNO8eyGiTlo2IbDv+irkux7sh/I4COhucwJBAIAKIUVz1GsIA7s+kjG5tX+PVMEopLF/k8MHZlZMq6TTjAt/2H+ht6wQEfpU3aBL7iAWF+kt2LTWRq0UAClh+8sCQQC25D7x/UWopLVUFqJUJxDfs5iMIVKR/Gs8wNvsGt6Ke7cikgPue+aqhArb3XZIHF1BslWC6/Ddwr2ZrtoueJ0F
私钥加密后:K/5aACTTKj1OZmOSUmbavA1NXczkCgRfedUUj+PRlZTblBL9jvo7W1HzRDJDdPIsm1Br7XPFSWbekYVLMCboxr6ygyEa5NtFu7ku7pNvs7TkROVOS7JqDXWDUGSLINqgXl1D39+ZWBCKnwZadkipPfd9ZHkEJfkJc23cMhz2C2c=
公钥加密后:k4QlyVJzti0EhSgpDz5K2bXt8RtfNrEGn7RwsGCjGk9WVzWrJoW5xP8wBJomVLeIeGK1mHEex4nYCxt4lW49f3HX85ZApAFQH31CBYSHwxpEfxoeNZF5SA65rNSeFdvMrOWdMWGoRxZzgF2GtqdSUC13PMNkGKhgMEGvVQOnNKE=
公钥解密后:123456

 

2、前端rsa加解密:

<html>
  <head>
        <script type="text/javascript" src="aes.js"></script> 
        
        <script src="https://cdn.bootcss.com/jsencrypt/3.0.0-rc.1/jsencrypt.js"></script>
  </head>
  <body>
  
  
  <script type="text/javascript">
      
             
             var aesFun = {
                options:{
                    originalStr:"123456",
                    aesKey:"1234567891234567"
                },
                encrypt:function(word){
                    var key = CryptoJS.enc.Utf8.parse(this.options.aesKey);
                    var srcs = CryptoJS.enc.Utf8.parse(word);
                    var encrypted = CryptoJS.AES.encrypt(srcs, key, {mode:CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7});
                    return encrypted.toString();
                
                },
                decrypt:function(word){
                    var key = CryptoJS.enc.Utf8.parse(this.options.aesKey);
                    var decrypt = CryptoJS.AES.decrypt(word, key, {mode:CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7});
                    return CryptoJS.enc.Utf8.stringify(decrypt).toString();
                }
                
             }
             
             var options = aesFun.options;
             
            var encryptstr = aesFun.encrypt(options.originalStr);
            
            //console.info("加密前:"+options.originalStr)
            //console.info("加密秘钥和解密秘钥:"+options.aesKey)
            //console.info("加密后:"+encryptstr)
            //console.info("解密后:"+aesFun.decrypt(encryptstr)); 
            
            
            var encrypt = new JSEncrypt();
            var encryptstr = "123456";
            var pubKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDyWmqsl0DMtWrRS6VFF4dfbNx0aOqsrT3Yq61ZZVu8h3OnGTMUjCkYothw794C0FpSYCJpWBGl7Ip6dXkohQU9TgadHWZ4wuLPJIyVhm39gAK9KoMNtEoGQ6vjXAxOE6QAS8lTZvVZMa9c2cboGEKvgyIilpHtbuAO42dNZH2+qQIDAQAB";
            encrypt.setPublicKey(pubKey);
            
            var data = encrypt.encrypt(encryptstr);
            console.info("加密前:"+encryptstr)
            console.info("公钥:"+pubKey)
            console.info("公钥加密后:"+data);
            
  </script>
  </body>
</html>

index.html:49 加密前:123456
index.html:50 公钥:MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDyWmqsl0DMtWrRS6VFF4dfbNx0aOqsrT3Yq61ZZVu8h3OnGTMUjCkYothw794C0FpSYCJpWBGl7Ip6dXkohQU9TgadHWZ4wuLPJIyVhm39gAK9KoMNtEoGQ6vjXAxOE6QAS8lTZvVZMa9c2cboGEKvgyIilpHtbuAO42dNZH2+qQIDAQAB
index.html:51 公钥加密后:g27aG60/xFupUpBwfCJKhiuNBkn69X+TV5fO5qRpLgnnC0E0gMumJepwBtZR3h+q6vcUK+xqjNXSYG9mz7Lz7c8H+/CLxuga76vL8hpbewbkynelveb+jywHQFemIoMl1HI6JOe5hh5/p/1Ecio5iPfnYlmr9M9nli2OsItIN00=

转载于:https://www.cnblogs.com/heyf/p/11206217.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值