android下RSA数据加密

来源:互联网 发布:js监听视频播放状态 编辑:程序博客网 时间:2024/06/05 21:59

RSA加密算法原理:

   1.随机选择两个不相等的大质数p和q,n=p*q

    2.m=(p-1)(q-1),随机选择整数e(1<e<m),且e与m互质

    3.根据公式e*d=1(mod m)计算出d

最终得到的(n,e)为公钥,(n,d)为私钥


属于非对称加密算法,公钥和私钥是一对,如果公钥对数据进行加密,只有对应的私钥才能解密,如果用私钥对数据进行加密,只有对应的公钥才能解密(用于认证)

1.获得秘钥:

                        KeyPairGenerator gen=KeyPairGenerator.getInstance("RSA");
gen.initialize(length);//设置秘钥长度,如果不设置,默认长度为2048

                        KeyPair keyPair=gen.generateKeyPair()//生成秘钥

                        PublicKey publicKey=keyPair.getPublic()//获得公钥

                        PrivateKey privateKey=keyPair.getPrivate()//获得私钥

      公钥和私钥有自己独特的比特编码,可以通过getEncoded()方法获取,返回byte[],可以通过byte[]还原私钥和公钥

    通过byte[] 还原公钥:

                         

     通过byte[] 还原私钥:

                        

      通过PublicKey和PrivateKey获得(n,e)和(n,d)首先将PublicKey和PrivateKey强制转换成RSAPublicKey和RSAPrivateKey,共同的n值通过getModules获取,getPublicExponent()得到e值,getPrivateExponent()获得d值,返回值类型都为BigInteger

    

     通过n,e和d还原PublicKey和PrivateKey

    

  2.加密、解密数据

   加密数据:

       Cipher cipher=Cipher.getInstance("RSA")

          cipher.init(Cipher.ENCRYPT_MODE,PublicKey)//设置为加密模式

          byte[] encryptedData=cipher.doFinal(byte[])

    解密数据:

          Cipher cipher=Cipher.getInstance("RSA")

          cipher.init(Cipher.DECRYPT_MODE,PrivateKey)//设置为解密模式

          byte[] decryptedData=cipher.doFinal(byte[])

注意:

1.android客户端和java端jdk默认加密算法不一样,如果加解密不在一端,需要指定一样的加密算法提供者,如Cipher.getInstance("RSA/NONE/NoPadding",new BouncyCastleProvider());

2.加密解密后得到的byte[]如果直接输出会得到乱码,并且解码会出现错误,必须经过Base64处理,将非ASCII码转化为可                    以读取的数据

                 把加密数据转化为字符串:String =Base64.encodeToString(byte[],Base64.NO_WRAP)

         把Base64转化的字符串再还原为加密后的byte[]:Base64.decode(String,Base64.NO_WRAP)

全局变量:

public static final int DEFAULT_KEY_SIZE = 2048;//秘钥默认长度
public static final int DEFAULT_BUFFERSIZE = (DEFAULT_KEY_SIZE / 8) - 11;// 当前秘钥支持加密的最大字节数
public static final byte[] DEFAULT_SPLIT = "#PART#".getBytes();    // 当要加密的内容超过bufferSize,则采用partSplit进行分块加密
使用openssl工具生成秘钥对
安装工具后打开bin下openssl.exe
输入命令生成私钥:
genrsa -out rsa_private_key.pem 1024,随机生成秘钥,长度为1024,完成后bin文件夹下出现rsa_private_key.pem
生成公钥:
rsa -in rsa_private_key.pem -out rsa_public_key.pem -pubout
私钥无法直接使用,对秘钥进行PKCS#8编码,如下:
pkcs8 -topk8 -in rsa_private_key.pem -out pkcs8_rsa_private_key.pem -nocrypt
rsa_public_key.pem和pkcs8_rsa_private_key.pem即为可以使用的公钥和私钥






0 0