• 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);
        }

    结束

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

  • 相关阅读:
    Mybatis框架学习笔记一(基于注解的配置)
    HDU 1686 Oulipo (KMP模板题)
    监控Windows性能指标
    Locust设置检查点
    《TCP/IP网络编程》读书笔记
    基于单向链表的队列的实现
    windows下基于异步通知IO模型的回声服务器和客户端的实现
    c语言实现迭代器iterator
    c语言hash表的实现
    c语言双向链表的实现
  • 原文地址:https://www.cnblogs.com/alvis/p/9438848.html
Copyright © 2020-2023  润新知