AES加密原文,RSA加密AES的秘钥

为了解决RSA加密长原文的问题,采用了AES加密原始数据,然后使用RSA公钥加密AES秘钥。这种方式避免了数据类型限制,且AES加密不受长度约束。流程包括:AES秘钥加密原文,RSA公钥加密AES秘钥,RSA私钥签名。解密时,RSA私钥解密AES秘钥,再用AES解密原文,最后RSA公钥验证签名。
摘要由CSDN通过智能技术生成

本来我们是只用了RSA加密原文的,后来发现原文太长,RSA只能加密117个字符,而且RSA加密的原文数据类型还需要区分是String还是JSONObject(可统称为Object),根据网上推荐的,我们选择了一种安全级别更高的加密方式,就是用AES加密原文,RSA公钥加密AES的秘钥,RSA私钥解密AES的秘钥,AES加密原文不用区分数据类型,统一转化为String类型就行,而且AES加密原文的长度没有限制,AES的秘钥比较短,就只有16位数字和大写字母的组合,不会超出RSA加密的长度。整个流程就是:A:随机生成AES的秘钥--》用AES秘钥加密原文--》用RSA公钥加密AES秘钥--》用RSA私钥签名原文;B:用RSA私钥解密AES秘钥--》用AES秘钥解密出原文--》用RSA公钥验证签名

AES加解密:

public class CryptAES {
    private static final String AESTYPE ="AES/ECB/PKCS5Padding";

    public static String AES_Encrypt(String keyStr, String plainText) {
        byte[] encrypt = null;
        try{
            Key key = generateKey(keyStr);
            Cipher cipher = Cipher.getInstance(AESTYPE);
            cipher.init(Cipher.ENCRYPT_MODE, key);
            encrypt = cipher.doFinal(plainText.getBytes());
        }catch(Exception e){
            e.printStackTrace();
        }
//        return new String(Base64.encodeBase64(encrypt));
        return new String(Base64.encodeToString(encrypt, Base64.DEFAULT));
    }

    public static String AES_Decrypt(String keyStr, String encryptData) {
        byte[] decrypt = null;
        try{
            Key key = generateKey(keyStr);
            Cipher cipher = Cipher.getInstance(AESTYPE);
            cipher.init(Cipher.DECRYPT_MODE, key);
//            decrypt = cipher.doFinal(Base64.decodeBase64(encryptData));
            decrypt = cipher.doFinal(Base64.decode(encryptData, Base64.DEFAULT));
        }catch(Exception e){
            e.printStackTrace();
        }
        return new String(decrypt).trim();
    }

    private static Key generateKey(String key)throws Exception{
        try{
            SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES");
            return keySpec;
        }catch(Exception e){
            e.printStackTrace();
            throw e;
        }

    }

    //随机生成AES加密秘钥
    public static String getKey(){
        Random random = new Random();
        String result="";
        for(int i=0;i<16;i++){
            String charOrNum = random.nextInt(2) % 2 == 0 ? "char" : "num";
            //输出字母还是数字
            if( "char".equalsIgnoreCase(charOrNum) ) {
                //输出是大写字母还是小写字母
//                int temp = random.nextInt(2) % 2 == 0 ? 65 : 97;
                result += (char)(random.nextInt(26) + 65);
            } else if( "num".equalsIgnoreCase(charOrNum) ) {
                result += String.valueOf(random.nextInt(10));
            }
        }
        return result;
    }
}

RSA加解密和验签:

import android.util.Log;

import org.json.JSONArray;
import org.json.JSONObject;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.security.KeyFactory;
import java.security.Signature;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

import javax.crypto.Cipher;

import Decoder.BASE64Decoder;
import Decoder.BASE64Encoder;

public class Rsa {
   
// private String priKey = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKbVhyEl0dXL2Jew" +
//       "N9B8wQHaZ07nC5oSKpQR6sc7sdsoqS+G4h9zuFpBXlspOIpnvoWeSRckwX6icytC"+
//       "uuqThOJaVhmiKV6w8zzyOvTVn0yaHMpXu9ZuhWFhx3xzDYy5rQfAAzKX1MO3k4ta"+
// "ZPTQLj8u7vaVEvbVq/FFO+YNCgCpAgMBAAECgYB1x4s1eJiyAc4wEITm2Bv+Lez/"+
// "BBfptmd+z0NbUiZW3VbLqcLbh3ufpERzwR8cfu8/L6bUAuvjddYutVZ2Ip0Nd7dG"+
//"5rrktH+7R8UT89fn87bUa5NlLee+egyoz/PJ63X4JjEg5OJbkXMbK4YrTypS0IAx"+
// "nZv+7BeSsCrzNlpWAQJBANgmHMDNrIWvU3qVf7u8SS/g+WrlvKMWOXtYjH2OqWoO"+
//       "Vtmh4Or1PbaPIMnPAXFYiYYW8wcLYnVmVCez5qaysWkCQQDFl9XONZIMFAvdJ5S2"+
// "UFk63bEYtCroKZjddTlE6K/j+Vj2IaCFm94i4x1YzJR0KrykrtBTLRi7nuWmdJMJ"+
// "r61BAkA7dxDGAk+KX9fJi8Oe
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值