Android加密篇 RSA

Posted 彭老希

tags:

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

使用场景

文件或数据在本地使用公钥或私钥加密,加密后的数据传送到服务器,服务器使用同一套密钥中的私钥或者公钥进行解密。

import android.util.Base64;

import java.security.InvalidKeyException;
import java.security.Key;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;

import javax.crypto.Cipher;
import javax.crypto.NoSuchPaddingException;

public class RSAUtils 
    //构建Cipher实例时所传入的的字符串,默认为"RSA/NONE/PKCS1Padding"
    private static String sTransform = "RSA/NONE/PKCS1Padding";

    //进行Base64转码时的flag设置,默认为Base64.DEFAULT
    private static int sBase64Mode = Base64.DEFAULT;
    //初始化方法,设置参数
    public static void init(String transform,int base64Mode)
        sTransform = transform;
        sBase64Mode = base64Mode;
    
    //产生密钥对
    public static KeyPair generateRSAKeyPair(int keyLength)
        KeyPair keyPair=null;
        try 
            KeyPairGenerator keyPairGenerator=KeyPairGenerator.getInstance("RSA");
            //设置密钥长度
            keyPairGenerator.initialize(keyLength);
            //产生密钥对
            keyPair=keyPairGenerator.generateKeyPair();
         catch (NoSuchAlgorithmException e) 
            e.printStackTrace();
        
        return keyPair;
    

    /**
     * 加密或解密数据的通用的方法,srcData:待处理的数据;key:公钥或者私钥,mode指
     * 加密还是解密,值为Cipher.ENCRYPT_MODE或者Cipher.DECRYPT_MODE
     */
    public static byte[]processDAta(byte[]srcData, Key key,int mode)
        //用来保存处理的结果
        byte[]resultBytes=null;
        //构建Cipher对象,需要传入一个字符串,格式必须为"algorithm/mode/padding"或者"algorithm/",意为"算法/加密模式/填充方式"
        try 
            Cipher cipher=Cipher.getInstance("RSA/NONE/PKCS1Padding");
            //初始化Cipher,mode指定是加密还是解密,key为公钥或密钥
            cipher.init(mode,key);
            //处理数据
            resultBytes=cipher.doFinal(srcData);
         catch (Exception e) 
            e.printStackTrace();
        
        return resultBytes;
    
    //使用公钥加密数据,结果用Base64转码
    public static String encryptDataByPublicKey(byte[]srcData, PublicKey publicKey)
        byte[]resultBytes=processDAta(srcData,publicKey,Cipher.ENCRYPT_MODE);
        return Base64.encodeToString(resultBytes,sBase64Mode);
    
    //使用私钥解密,结果用Base64转码
    public static byte[]decryptDataByPrivate(String encryptedData, PrivateKey privateKey)
        byte[]bytes=Base64.decode(encryptedData,sBase64Mode);
        return processDAta(bytes,privateKey,Cipher.DECRYPT_MODE);
    

    //使用私钥解密,返回解码数据
    public static String decryptToStrByPrivate(String encryptedData,PrivateKey privateKey)
        return new String(decryptDataByPrivate(encryptedData,privateKey));
    


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

java加密算法之RSA篇

一篇搞定RSA加密与SHA签名|与Java完全同步

java加密算法之RSA篇

java加密算法之RSA篇

《夜深人静写算法》数论篇 - (19) RSA

Android中的RSA加密解密