Android开发Rsa的使用

前言

本篇文章主要讲解的有关Android开发中常用的Rsa的处理方式以及应用。


下面主要讲解具体的使用方法

一、公私钥

1.公钥加密(用于数据加密)

//Java原生base64解码
        byte[] pubKey = Base64.getDecoder().decode(publicKeyStr);
        //创建X509编码密钥规范
        X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(pubKey);
        //返回转换指定算法的KeyFactory对象
        KeyFactory keyFactory = KeyFactory.getInstance(RSA_KEY_ALGORITHM);
        //根据X509编码密钥规范产生公钥对象
        PublicKey publicKey = keyFactory.generatePublic(x509KeySpec);
        //根据转换的名称获取密码对象Cipher(转换的名称:算法/工作模式/填充模式)
        Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
        //用公钥初始化此Cipher对象(加密模式)
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        //对数据加密
        byte[] decode = data.getBytes();
        byte[][] bytes = splitBytes(decode, MAX_ENCRYPT_BLOCK );
        byte[] enBytes = null;
        for (byte[] decoByte : bytes) {
            byte[] decrypt = cipher.doFinal(decoByte);
            enBytes = ArrayUtils.addAll(enBytes, decrypt);
        }

2.私钥解密(用于数据解密)

byte[] priKey = Base64.getDecoder().decode(privateKeyStr);
        //创建PKCS8编码密钥规范
        PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(priKey);
        //返回转换指定算法的KeyFactory对象
        KeyFactory keyFactory = KeyFactory.getInstance(RSA_KEY_ALGORITHM);
        //根据PKCS8编码密钥规范产生私钥对象
        PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
        //根据转换的名称获取密码对象Cipher(转换的名称:算法/工作模式/填充模式)
        Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
        //用私钥初始化此Cipher对象(解密模式)
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        //对数据解密
        byte[] decrypt = cipher.doFinal(Base64.getDecoder().decode(data));

3.私钥加密(用于数据签名)

//Java原生base64解码
        byte[] priKey = Base64.getDecoder().decode(privateKeyStr);
        //创建PKCS8编码密钥规范
        PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(priKey);
        //返回转换指定算法的KeyFactory对象
        KeyFactory keyFactory = KeyFactory.getInstance(RSA_KEY_ALGORITHM);
        //根据PKCS8编码密钥规范产生私钥对象
        PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
        //根据转换的名称获取密码对象Cipher(转换的名称:算法/工作模式/填充模式)
        Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
        //用私钥初始化此Cipher对象(加密模式)
        cipher.init(Cipher.ENCRYPT_MODE, privateKey);
        //对数据加密
        byte[] encrypt = cipher.doFinal(data.getBytes());

4.公钥解密(用于数据验签)

//Java原生base64解码
        byte[] pubKey = Base64.getDecoder().decode(publicKeyStr);
        //创建X509编码密钥规范
        X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(pubKey);
        //返回转换指定算法的KeyFactory对象
        KeyFactory keyFactory = KeyFactory.getInstance(RSA_KEY_ALGORITHM);
        //根据X509编码密钥规范产生公钥对象
        PublicKey publicKey = keyFactory.generatePublic(x509KeySpec);
        //根据转换的名称获取密码对象Cipher(转换的名称:算法/工作模式/填充模式)
        Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
        //用公钥初始化此Cipher对象(解密模式)
        cipher.init(Cipher.DECRYPT_MODE, publicKey);
        //对数据解密
        byte[] decode = Base64.getDecoder().decode(data);
        byte[][] bytes = splitBytes(decode, MAX_DECRYPT_BLOCK);
        StringBuilder result = new StringBuilder();
        for (byte[] decoByte : bytes) {
            byte[] decrypt = cipher.doFinal(decoByte);
            result.append(new String(decrypt));
        }

二、生成密钥对

1.生成密钥对

KeyPairGenerator keygen;
        try {
            keygen = KeyPairGenerator.getInstance(RSA_KEY_ALGORITHM);
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException("RSA初始化密钥出现错误,算法异常");
        }
        SecureRandom secrand = new SecureRandom();
        //初始化随机产生器
        secrand.setSeed("Alian".getBytes());
        //初始化密钥生成器
        keygen.initialize(KEY_SIZE, secrand);
        KeyPair keyPair = keygen.genKeyPair();
        //获取公钥并转成base64编码
        byte[] pub_key = keyPair.getPublic().getEncoded();
        String publicKeyStr = Base64.getEncoder().encodeToString(pub_key);
        //获取私钥并转成base64编码
        byte[] pri_key = keyPair.getPrivate().getEncoded();
        String privateKeyStr = Base64.getEncoder().encodeToString(pri_key);
        //创建一个Map返回结果
        Map<String, String> keyPairMap = new HashMap<>();
        keyPairMap.put("publicKeyStr", publicKeyStr);
        keyPairMap.put("privateKeyStr", privateKeyStr);

2.RSA校验数字签名

 //返回转换指定算法的KeyFactory对象
        KeyFactory keyFactory = KeyFactory.getInstance(RSA_KEY_ALGORITHM);
        //创建X509编码密钥规范
        X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(pubKey);
        //根据X509编码密钥规范产生公钥对象
        PublicKey publicKey = keyFactory.generatePublic(x509KeySpec);
        //标准签名算法名称(RSA还是RSA2)
        String algorithm = RSA_KEY_ALGORITHM.equals(signType) ? RSA_SIGNATURE_ALGORITHM : RSA2_SIGNATURE_ALGORITHM;
        //用指定算法产生签名对象Signature
        Signature signature = Signature.getInstance(algorithm);
        //用公钥初始化签名对象,用于验证签名
        signature.initVerify(publicKey);
        //更新签名内容
        signature.update(data);
    public static byte[][] splitBytes(byte[] bytes, int size) {
        double splitLength = Double.parseDouble(size + "");
        int arrayLength = (int) Math.ceil(bytes.length / splitLength);
        byte[][] result = new byte[arrayLength][];
        int from, to;
        for (int i = 0; i < arrayLength; i++) {

            from = (int) (i * splitLength);
            to = (int) (from + splitLength);
            if(to > bytes.length){
                to = bytes.length;
            }
            result[i] = Arrays.copyOfRange(bytes, from, to);
        }
        return result;
    }

总结

以上就是今天要讲的内容,本文仅仅简单介绍了Android加密的使用,而Android提供了大量能使我们快速便捷地处理的函数和方法。

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android RSA 和 Web RSA 都是使用RSA算法进行数据加密和解密的方式,只是在不同的平台上实现。下面分别对两者进行简要说明。 Android RSA: 在Android系统中,可以通过Java的标准库`java.security`来使用RSA算法。在Android使用RSA算法,首先需要生成RSA密钥对,包括公钥和私钥。然后可以使用公钥对数据进行加密,私钥对数据进行解密。在Android平台上,可以使用RSA算法对用户敏感信息进行加密,例如用户登录密码等,以保证信息的安全性。 Web RSA: 在Web开发中,RSA算法也广泛应用于数据的加密和解密。Web开发中的RSA通常使用JavaScript来实现。通过使用 JavaScript 的RSA库,可以在网页上进行数据的加密和解密操作。同时,也需要生成RSA密钥对,并将公钥嵌入到网页中,以供前端JavaScript代码使用。在Web应用中,RSA算法常用于保护用户的敏感信息,例如在用户密码传输、支付信息等场景中,使用RSA算法加密数据,以确保数据的安全性。 综上所述,Android RSA和Web RSA均是基于RSA算法实现的数据加密和解密方式。Android RSA主要适用于Android系统及相关应用的开发中,而Web RSA则适用于Web开发中对用户信息进行加密保护的场景。两者都能够保障数据的安全性,但具体的实现方式和使用方式会有所不同。 ### 回答2: Android RSA和Web RSA是两种使用RSA算法的应用领域。 Android RSA是指在Android操作系统上使用RSA算法进行数据加密和解密的处理。Android提供了RSA算法的相关API,开发者可以通过这些API实现对数据的加密和解密操作。在Android RSA中,首先需要生成RSA密钥对,包括公钥和私钥。公钥可以分享给其他人用于加密数据,私钥则用于解密。Android RSA可以用于加密敏感数据、保护用户隐私等场景。 Web RSA是指在Web应用中使用RSA算法进行数据加密和解密的处理。在Web开发中,常常使用RSA算法来对用户的敏感信息进行加密传输,确保数据的安全性。Web RSA采用了与Android RSA类似的加密和解密流程,首先生成RSA密钥对,然后使用公钥加密数据,并通过网络传输给服务端,服务端再使用私钥进行解密。 Android RSA和Web RSA在实现上有一些差异。首先,Android RSA是在移动设备上进行加密和解密的,而Web RSA是在服务器端和客户端之间进行传输的。其次,Android RSA需要使用Android提供的API进行密钥生成和加解密操作,而Web RSA可以使用其他语言和库来实现。 综上所述,Android RSA和Web RSA都是使用RSA算法进行数据加密和解密的应用领域。它们的实现方式略有差异,但都可以有效地保护数据的安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值