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

结束

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

posted @ 2017-07-25 21:03  alvis_u  阅读(128)  评论(0编辑  收藏  举报