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

    结束

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

  • 相关阅读:
    optorsim自带例子调试总结
    搭建Hadoop2.0(三)自带实例运行
    被遮挡的绝对定位
    Javascript获取地址参数
    js屏蔽浏览器(IE和FireFox)的刷新和右键等功能
    Tencent://Message/协议的实现原理
    Form(思归):动态控件的状态问题
    [正则表达式]C# 给数字字符串加上千位逗号
    js滚动条
    模拟滚动条效果
  • 原文地址:https://www.cnblogs.com/alvis/p/9438848.html
Copyright © 2020-2023  润新知