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

    结束

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

  • 相关阅读:
    【转】EDK简单使用流程(3)
    【转】应用 printf 语句格式化输出字符
    【转】[FPGA博客大赛](updated)在xilinx的FPGA系统中scanf函数的使用
    BZOJ 1083 [SCOI2005]繁忙的都市
    BZOJ 2821 分块统计
    BZOJ 1034 [ZJOI2008]泡泡堂BNB
    BZOJ 1029 [JSOI2007]建筑抢修
    BZOJ 1096 [ZJOI2007]仓库建设
    BZOJ 1070 [SCOI2007]修车
    BZOJ 1040 [ZJOI2008]骑士
  • 原文地址:https://www.cnblogs.com/alvis/p/9438848.html
Copyright © 2020-2023  润新知