Android 端 Rsa加密数据

1.android 端加密方式

  • 非对称加密 (RSA)
  • 对称加密 (DES,AES,3DES)
  • MD5加密
  • BASE64编码

ps:这篇主要介绍android rsa加密前端

2.Rsa加密原理

1.随机选择两个大质数p和q,p不等于q,计算N=pq;java

2.选择一个大于1小于N的天然数e,e必须与(p-1)(q-1)互素。android

3.用公式计算出d:d×e = 1 (mod (p-1)(q-1)) 。算法

4.销毁p和q。后端

最终获得的N和e就是“公钥”,d就是“私钥”,发送方使用N去加密数据,接收方只有使用d才能解开数据内容。安全

3.Rsa相比对称加密算法优缺点

优势:bash

  • 对称加密比对称加密算法更安全

缺点:服务器

  • 加密速度更慢,适用于加密少许数据

4.示例 (公钥加密,私钥解密)

经过公钥字符串 获取PublicKey对象编码

byte[] buffer = Base64Utils.decode(publicKeyStr);
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
            X509EncodedKeySpec keySpec = new X509EncodedKeySpec(buffer);
            RSAPublicKey publicKey =  (RSAPublicKey) RSAPublicKey.generatePublic(keySpec);
复制代码

使用publickey加密数据加密

Cipher cipher = Cipher.getInstance("转换");
            // 编码前设定编码方式及密钥
            cipher.init(Cipher.ENCRYPT_MODE, publicKey);
            // 传入编码数据并返回编码结果
            byte[] encrptData = cipher.doFinal(data);
复制代码

几个关键参数介绍:

1.转换 是一个字符串,它描述为产生某种输出而在给定的输入上执行的操做(或一组操做); 形式能够是 算法/模式/填充算法; 常见的模式以下:

RSA (若是你的明文不够128字节加密的时候会在你的明文前面,前向的填充零。解密后的明文也会包括前面填充的零,这是服务器须要注意把解密后的字段前向填充的零去掉,才是真正以前加密的明文。)

RSA/ECB/PKCS1Padding (加密的时候会在你的明文中随机填充一些数据,因此会致使对一样的明文每次加密后的结果都不同)

RSA/None/PKCS1Padding

第一个 RSA 等价于 RSA/None/NoPadding .使用此模式加密后 同一个明文、同一个公钥每次生成同一个密文.攻击者可以据此识别到同一个信息都是什么时候被发送。 因此通常使用第二个 RSA/ECB/PKCS1Padding .

2.编码方式设定

cipher.init(MODE, publicKey);

常见编码方式 (MODE):

ENCRYPT_MODE: Cipher 初始化为加密模式的常量 (经常使用)

DECRYPT_MODE: Cipher 初始化为解密模式的常量 (经常使用)

WRAP_MODE :Cipher 初始化为密钥包装模式的常量

UNWRAP_MODE :Cipher 初始化为密钥解包模式的常量

PUBLIC_KEY :解包的密钥为“公钥”的常量

PRIVATE_KEY : 解包的密钥为“私钥”的常量

SECRET_KEY :解包的密钥为“秘密密钥”的常量

5.开发过程当中容易遇到的坑

1.客户端须要与后端确认好使用同一转换模式 作到一一对应. 若是后端(java使用 RSA),则前端 须要使用(RSA/ECB/PKCS1Padding) 而不是 RSA.

2.前端请求下来的公钥字符串若是 包含 "-----BEGIN PUBLIC KEY-----" 和 "-----END PUBLIC KEY-----",须要将其切掉,若是直接使用 会报 InvalidKeySpecException .

相关文章
相关标签/搜索