zoukankan      html  css  js  c++  java
  • Rsa 加密解密 java

    前言

    RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。1987年7月首次在美国公布,当时他们三人都在麻省理工学院工作实习。RSA就是他们三人姓氏开头字母拼在一起组成的 [ 百度百科 ]

    开始

    1 .Java中RSA加密解密和.Net 、Php 有点不同,公钥私钥必须使用PKCS8格式,而.Net、Php却不需要。

    2 .加密代码如下,注意其中publicCertificate 是PKCS8格式:

        @Override
        public String rsaEncode(String publicCertificate, String text) {
            try {
                 byte[] publicBytes =baseStrToByte(publicCertificate);
                X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicBytes);
                KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);
                PublicKey pubKey = keyFactory.generatePublic(keySpec);
                try {
                    // get an RSA cipher object and print the provider
                    final Cipher cipher = Cipher.getInstance(ALGORITHM);
                    // encrypt the plain text using the public key
                    cipher.init(Cipher.ENCRYPT_MODE, pubKey);
                    byte[] cipherBytes = cipher.doFinal(text.getBytes(CharSet));
                    String encodestr = baseByteToStr(cipherBytes);
                    return encodestr;
    
                } catch (Exception e) {
                    e.printStackTrace();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }

    3 .解密代码,注意其中privateCertificate是PKCS8格式

       @Override
        public String rsaDecode(String privateCertificate, String text) {
            try {
                byte[] privateBytes = baseStrToByte(privateCertificate);
                PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateBytes);
                KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);
                PrivateKey priKey = keyFactory.generatePrivate(keySpec);
                byte[] cipherText = null;
                try {
                    // get an RSA cipher object and print the provider
                    final Cipher cipher = Cipher.getInstance(ALGORITHM);
                    // encrypt the plain text using the public key
                    cipher.init(Cipher.DECRYPT_MODE, priKey);
                    byte[] textbyte = baseStrToByte(text);
                    cipherText = cipher.doFinal(textbyte);
                    String decodestr = new String(cipherText, CharSet);
                    return decodestr;
    
                } catch (Exception e) {
                    e.printStackTrace();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }

    4 .辅助方法

     /**
         * @Description (TODO)
         * @param str
         * @return
         */
        private byte[] baseStrToByte(String str) {
            return Base64.getDecoder().decode(str);
        }
    
        /** 
         * @Description (TODO)
         * @param bytes
         * @return
         */
        private String baseByteToStr(byte[] bytes) {
            return Base64.getEncoder().encodeToString(bytes);
        }

    结束

    附上单元测试图片一张:
    单元测试

  • 相关阅读:
    jwt 0.9.0(三)jwt客户端存储状态可行性分析,及Java代码案例
    jwt 0.9.0(二)jwt官网资料总结
    jwt 0.9.0(一)推荐jwt理由
    jwt 0.9.0 系列目录
    Elasticsearch-6.7.0系列(八)开启kibana监控
    Elasticsearch-6.7.0系列(七)SpringCloud连接ES集群,使用ES用户名密码
    Elasticsearch-6.7.0系列(六)ES设置集群密码
    Oracle 11g Java驱动包ojdbc6.jar安装到maven库,并查看jar具体版本号
    nginx1.14.0版本location路径,多级文件目录配置,root与alias的配置区别
    docker18.09.5 Dockerfile文件编写
  • 原文地址:https://www.cnblogs.com/alvis/p/9438848.html
Copyright © 2011-2022 走看看