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即为可以使用的公钥和私钥
- android下RSA数据加密
- Android数据加密之Rsa加密
- Android数据加密之Rsa加密
- Android 数据加密之RSA + AES
- Android数据加密之RSA+AES混合加密
- Android数据安全之RSA加密(非对称加密)
- 数据加密--RSA
- RSA 数据加密解密
- 25、数据加密-RSA
- Android RSA加密解密
- Android RSA加密解密
- android RSA 加密
- Android RSA加密解密
- Android RSA加密解密
- android Rsa 算法加密
- Android RSA加密解密
- Android RSA加密解密
- Android RSA加密解密
- SimpleDateFormat的线程安全性
- JS干货--对象字面量
- 洛谷【P2194】HXY烧情侣
- libevent 获取多线程结构体变量加锁方法
- UcosII移植之os_cpu_c.c详解
- android下RSA数据加密
- Zepto源码解读
- MySQL时区设置
- 栈增长方向和大端、小端问题
- 如何在windows系统上安装ubuntu双系统
- SSM搭建-Spring mvc对于静态资源的访问(14)
- java数组的12个方法
- Android Studio如何引入so,jar文件
- React Native自动化测试