Android面试题-Java安全专题三

Android程序员面试宝典

安全专题

  • Java安全专题一
  • Java安全专题二
  • Java安全专题三
  • Java安全专题四
  • Java安全专题五
  • Java安全专题六
  • Java安全专题七

1.3 非对称加密

1.3.1 介绍

与对称加密算法不同,非对称加密算法需要两个密钥:公钥(publickey)和私钥(privatekey)。公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密;如果用私钥对数据进行加密,那么只有用对应的公钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。

简单理解为:加密和解密是不同的钥匙

Android面试题-Java安全专题三_第1张图片

1.3.2 常见算法

RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)等
1.3.3 RSA算法原理
质因数、欧拉函数、模反元素
原理很复杂,只需要知道内部是基于分解质因数和取模操作即可

1.3.4 使用步骤

//1,获取cipher对象
Cipher cipher = Cipher.getInstance("RSA");
//2,通过秘钥对生成器KeyPairGenerator生成公钥和私钥
KeyPair keyPair = KeyPairGenerator.getInstance("RSA").generateKeyPair();
//使用公钥进行加密,私钥进行解密(也可以反过来使用)
PublicKey publicKey = keyPair.getPublic();
PrivateKey privateKey = keyPair.getPrivate();
//3,使用公钥初始化密码器
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
//4,执行加密操作
byte[] result = cipher.doFinal(content.getBytes());
//使用私钥初始化密码器
cipher.init(Cipher.DECRYPT_MODE, privateKey);
//执行解密操作
byte[] deResult = cipher.doFinal(result);

1.3.5 注意点

//一次性加密数据的长度不能大于117字节
private static final int ENCRYPT_BLOCK_MAX = 117;
//一次性解密的数据长度不能大于128字节
private static final int DECRYPT_BLOCK_MAX = 128;

分批操作

/**
* 分批操作
* @param content 需要处理的数据
* @param cipher 密码器(根据cipher的不同,操作可能是加密或解密)
* @param blockSize 每次操作的块大小,单位为字节
* @return 返回处理完成后的结果
* @throws Exception
*/
public static byte[] doFinalWithBatch(byte[] content, Cipher cipher, int blockSize) throws Exception {
        int offset = 0;//操作的起始偏移位置
        int len = content.length;//数据总长度
        byte[] tmp;//临时保存操作结果
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        //如果剩下数据
        while (len - offset > 0) {
            if (len - offset >= blockSize) {
                //剩下数据还大于等于一个blockSize
                tmp = cipher.doFinal(content, offset, blockSize);
            }else {
                //剩下数据不足一个blockSize
                tmp = cipher.doFinal(content, offset, len - offset);
            }
            //将临时结果保存到内存缓冲区里
            baos.write(tmp);
            offset = offset + blockSize;
        }
        baos.close();
        return baos.toByteArray();
    }

1.3.6 非对称加密用途

Android面试题-Java安全专题三_第2张图片

2,陌生人通信:A和B两个人互不认识,A把自己的公钥发给B,B也把自己的公钥发给A,则双方可以通过对方的公钥加密信息通信。C虽然也能得到A、B的公钥,但是他解不开密文。

Android面试题-Java安全专题三_第3张图片
Android面试题-Java安全专题三_第4张图片

1.3.7 总结

非对称加密一般不会单独拿来使用,他并不是为了取代对称加密而出现的,非对称加密速度比对称加密慢很多,极端情况下会慢1000倍,所以一般不会用来加密大量数据,通常我们经常会将对称加密和非对称加密两种技术联合起来使用,例如用非对称加密来给称加密里的秘钥进行加密(即秘钥交换)。

  • 欢迎关注微信公众号、长期为您推荐优秀博文、开源项目、视频

  • 微信公众号名称:Android干货程序员

  • Android面试题-Java安全专题三_第5张图片

你可能感兴趣的:(Android面试题-Java安全专题三)