RSA非对称加密和AES对称加密

Posted nihaofenghao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RSA非对称加密和AES对称加密相关的知识,希望对你有一定的参考价值。

代码是网上抄的,自己练练手

RSA加密

技术分享图片
package com.answern.openplatform;

import org.apache.commons.codec.binary.Base64;
import org.junit.Test;


import javax.crypto.Cipher;
import java.io.File;
import java.math.BigInteger;
import java.nio.charset.Charset;
import java.security.*;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.HashMap;
import java.util.Map;

/**
 *
    *--------------------------------------------**********--------------------------------------------
    *该算法于1977年由美国麻省理工学院MIT(Massachusetts Institute of Technology)的Ronal Rivest,Adi Shamir和Len Adleman三位年轻教授提出,并以三人的姓氏Rivest,Shamir和Adlernan命名为RSA算法,是一个支持变长密钥的公共密钥算法,需要加密的文件快的长度也是可变的!
    *所谓RSA加密算法,是世界上第一个非对称加密算法,也是数论的第一个实际应用。它的算法如下:
    *1.找两个非常大的质数p和q(通常p和q都有155十进制位或都有512十进制位)并计算n=pq,k=(p-1)(q-1)。
    *2.将明文编码成整数M,保证M不小于0但是小于n。
    *3.任取一个整数e,保证e和k互质,而且e不小于0但是小于k。加密钥匙(称作公钥)是(e,n)。
    *4.找到一个整数d,使得ed除以k的余数是1(只要e和n满足上面条件,d肯定存在)。解密钥匙(称作密钥)是(d,n)。
    *加密过程: 加密后的编码C等于M的e次方除以n所得的余数。
    *解密过程: 解密后的编码N等于C的d次方除以n所得的余数。
    *只要e、d和n满足上面给定的条件。M等于N。
    *--------------------------------------------**********--------------------------------------------

 * RAS  加密算法测试
 * @Author 冯浩
 * @Description
 * @Date: create in 15:14 2018/5/24
 * @Modified by
 */
public class RSATest {

    private final static int KEYSIZE = 1024;

    private final static String RSA = "RSA";

    public static final String RSA_ALGORITHM = "RSA/ECB/PKCS1Padding";


    public Map<String,Object> generotor() throws Exception{

        SecureRandom sr =new SecureRandom();
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        keyPairGenerator.initialize(KEYSIZE,sr);

        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        Key pub = keyPair.getPublic();
        byte[] pubByte = pub.getEncoded();
        String publicKey = new String(pubByte,Charset.forName("UTF-8"));

        Key pri = keyPair.getPrivate();
        byte[] priByte = pri.getEncoded();
        String privateKey = new String(priByte,Charset.forName("UTF-8"));

        RSAPublicKey pubKey = (RSAPublicKey)keyPair.getPublic();
        BigInteger modulus = pubKey.getModulus();
        byte[] modulu = modulus.toByteArray();

        byte[] baseModulu = Base64.encodeBase64(modulu);
        String mo = new String(baseModulu,Charset.forName("UTF-8"));
        Map<String,Object> data = new HashMap<String,Object>();
        data.put("public",publicKey);
        data.put("private",privateKey);
        data.put("module",mo);
        return data;

    }

    /**
     * 获取公钥信息
     * @param key
     * @return
     * @throws Exception
     */
    public PublicKey getPublicKey(String key) throws Exception{
        X509EncodedKeySpec spec = new X509EncodedKeySpec(Base64.decodeBase64(key.getBytes()));
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        PublicKey publicKey = keyFactory.generatePublic(spec);
        return publicKey;
    }

    /**
     * 获取私钥信息
     * @param key
     * @return
     * @throws Exception
     */
    public PrivateKey getPrivateKey(String key) throws Exception{
        X509EncodedKeySpec spec = new X509EncodedKeySpec(Base64.decodeBase64(key.getBytes()));
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        PrivateKey privateKey = keyFactory.generatePrivate(spec);
        return privateKey;
    }

    /**
     * 加密
     * @param source
     * @param publicKey
     * @return
     * @throws Exception
     */
    public String encrypt(String source,String publicKey) throws Exception{
        Key key = getPublicKey(publicKey);
        Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);
        cipher.init(Cipher.ENCRYPT_MODE,key);
        byte[] bytes = source.getBytes();
        byte[] b = cipher.doFinal(bytes);
        return new String(b,Charset.forName("utf-8"));

    }

    /**
     * 解密
     * @param cypt
     * @param key
     * @return
     * @throws Exception
     */
    public String decrypt(String cypt,String key) throws Exception{
        Key privateKey = getPrivateKey(key);
        Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);
        cipher.init(Cipher.DECRYPT_MODE,privateKey);
        byte[] so = Base64.decodeBase64(cypt.getBytes());
        byte[] b= cipher.doFinal(so);
        return new String(b);
    }

    /**
     * 生成签名
     * @param content
     * @param privateKey
     * @return
     * @throws Exception
     */
    public String sign(String content,String privateKey) throws Exception{
        String charset = "UTF-8";
        PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(content.getBytes()));
        KeyFactory keyFactory = KeyFactory.getInstance(RSA);
        PrivateKey priKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);

        Signature signature = Signature.getInstance("SHA1WithRSA");
        signature.initSign(priKey);
        signature.update(content.getBytes(charset));

        byte[] sign = signature.sign();

        return new String(Base64.encodeBase64(sign));
    }

    public void checkSign(String content,String sign,String publicKey) {
        try {

            KeyFactory keyFactory = KeyFactory.getInstance(RSA);
            byte[] decode = Base64.decodeBase64(publicKey);
            PublicKey pubKey = keyFactory.generatePublic(new X509EncodedKeySpec(decode));

            Signature signature = Signature.getInstance("SHA1WithRSA");

            signature.initVerify(pubKey);
            signature.update(content.getBytes("UTF-8"));

            boolean verify = signature.verify(Base64.decodeBase64(sign));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        RSATest test = new RSATest();
        int result = test.test();
        System.out.println(result);
    }

    public int test(){
        int a=1;
        try {

            return a++;
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            System.out.println("1"+a);
            return a++;
        }
    }

}    
View Code

AES加密

技术分享图片
package com.answern.openplatform.app.utils;

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;

/**
 * @Author 冯浩
 * @Description
 * @Date: create in 17:06 2018/5/24
 * @Modified by
 */
public class AESUtils {

    public final static String AES = "AES";

    public static final String AES_ALGORITHM = "AES/ECB/PKCS5Padding";

    /**
     * 加密
     * @param data
     * @param key
     * @return
     */
    public static byte[] encrypt(byte[] data,byte[] key){
        if(key.length!=16){
            throw new RuntimeException("Invalid AES key length (must be 16 bytes)");
        }
        try {
            SecretKeySpec secretKeySpec = new SecretKeySpec(key,AES);
            byte[] bytes = secretKeySpec.getEncoded();
            SecretKeySpec secKey = new SecretKeySpec(bytes,AES);
            Cipher cipher = Cipher.getInstance(AES_ALGORITHM);
            cipher.init(Cipher.ENCRYPT_MODE,secKey);
            byte[] result = cipher.doFinal(data);
            return result;
        }catch (Exception e){
            throw new RuntimeException("encrypt fail!",e);
        }
    }

    /**
     * 解密
     * @param data
     * @param key
     * @return
     */
    public static byte[] decyypt(byte[] data,byte[] key){
        if(key.length!=16){
            throw new RuntimeException("Invalid AES key length (must be 16 bytes)");
        }
        try {
            SecretKeySpec secretKeySpec = new SecretKeySpec(key,AES);
            byte[] bytes = secretKeySpec.getEncoded();
            SecretKeySpec secKey = new SecretKeySpec(bytes,AES);
            Cipher cipher = Cipher.getInstance(AES_ALGORITHM);
            cipher.init(Cipher.DECRYPT_MODE,secKey);
            byte[] result = cipher.doFinal(data);
            return result;
        }catch (Exception e){
            throw new RuntimeException("encrypt fail!",e);
        }
    }

    public static void main(String[] args) {
        String message = "大家";
        String key = "1111111111111111";
        byte[] result = AESUtils.encrypt(message.getBytes(),key.getBytes());

        System.out.println("***********************");
        byte[] abs = AESUtils.decyypt(result,key.getBytes());
        System.out.println(new String(abs));
    }

}    
View Code

 

以上是关于RSA非对称加密和AES对称加密的主要内容,如果未能解决你的问题,请参考以下文章

Java对称与非对称加密解密,AES与RSA

安卓常见的一些加密((对称加密DES,AES),非对称加密(RSA),MD5)

加密解密

Java 加密解密 对称加密算法 非对称加密算法 MD5 BASE64 AES RSA

非对称加密RSA加密文件

uniapp接口层的aes和rsa的对称与非对称加密