Android 安全加密:非对称加密详解
作者:Android-Developer 发布时间:2021-08-03 18:39:43
Android安全加密专题文章索引
Android安全加密:对称加密
Android安全加密:非对称加密
Android安全加密:消息摘要Message Digest
Android安全加密:数字签名和数字证书
Android安全加密:Https编程
以上学习所有内容,对称加密、非对称加密、消息摘要、数字签名等知识都是为了理解数字证书工作原理而作为一个预备知识。数字证书是密码学里的终极武器,是人类几千年历史总结的智慧的结晶,只有在明白了数字证书工作原理后,才能理解Https 协议的安全通讯机制。最终才能在SSL 开发过程中得心应手。
另外,对称加密和消息摘要这两个知识点是可以单独拿来使用的。
知识点串联:
数字证书使用到了以上学习的所有知识
对称加密与非对称加密结合使用实现了秘钥交换,之后通信双方使用该秘钥进行对称加密通信。
消息摘要与非对称加密实现了数字签名,根证书机构对目标证书进行签名,在校验的时候,根证书用公钥对其进行校验。若校验成功,则说明该证书是受信任的。
Keytool 工具可以创建证书,之后交给根证书机构认证后直接使用自签名证书,还可以输出证书的RFC格式信息等。
数字签名技术实现了身份认证与数据完整性保证。
加密技术保证了数据的保密性,消息摘要算法保证了数据的完整性,对称加密的高效保证了数据处理的可靠性,数字签名技术保证了操作的不可否认性。
通过以上内容的学习,我们要能掌握以下知识点:
基础知识:bit 位、字节、字符、字符编码、进制转换、io
知道怎样在实际开发里怎样使用对称加密解决问题
知道对称加密、非对称加密、消息摘要、数字签名、数字证书是为了解决什么问题而出现的
了解SSL 通讯流程
实际开发里怎样请求Https 的接口
1. 介绍
与对称加密算法不同,非对称加密算法需要两个密钥:公钥(publickey)和私钥(privatekey)。公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密;如果用私钥对数据进行加密,那么只有用对应的公钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。
简单理解为:加密和解密是不同的钥匙
2. 常见算法
RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)等,其中支付宝使用的就是RSA算法
3. RSA 算法原理
质因数、欧拉函数、模反元素
原理很复杂,只需要知道内部是基于分解质因数和取模操作即可
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);
5. 注意点
//一次性加密数据的长度不能大于117 字节
private static final int ENCRYPT_BLOCK_MAX = 117;
//一次性解密的数据长度不能大于128 字节
private static final int DECRYPT_BLOCK_MAX = 128;
6. 分批操作
/**
* 分批操作
*
* @param content 需要处理的数据
* @param cipher 密码器(根据cipher 的不同,操作可能是加密或解密)
* @param blockSize 每次操作的块大小,单位为字节
* @return 返回处理完成后的结果
* @throws Exception
*/
public static byte[] doFinalWithBatch(byte[] content, Cipher cipher, int blockSize) throwseption {
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();
}
7. 非对称加密用途
身份认证
一条加密信息若能用A 的公钥能解开,则该信息一定是用A 的私钥加密的,该能确定该用户是A。
陌生人通信
A 和B 两个人互不认识,A 把自己的公钥发给B,B 也把自己的公钥发给A,则双方可以通过对方的公钥加密信息通信。C 虽然也能得到A、B 的公钥,但是他解不开密文。
秘钥交换
A 先得到B 的公钥,然后A 生成一个随机秘钥,例如13245768,之后A 用B 的公钥加密该秘钥,得到加密后的秘钥,例如dxs#fd@dk,之后将该密文发给B,B 用自己的私钥解密得到123456,之后双方使用13245768 作为对称加密的秘钥通信。C 就算截获加密后的秘钥dxs#fd@dk,自己也解不开,这样A、B 二人能通过对称加密进行通信。
8. 总结
非对称加密一般不会单独拿来使用,他并不是为了取代对称加密而出现的,非对称加密速度比对称加密慢很多,极端情况下会慢1000 倍,所以一般不会用来加密大量数据,通常我们经常会将对称加密和非对称加密两种技术联合起来使用,例如用非对称加密来给称加密里的秘钥进行加密(即秘钥交换)。


猜你喜欢
- 前言无意中翻到几年前写过的一个RatingBar,可以拖拽,支持自定义星星图片,间距大小等参数。自定义参数为了方便扩展,支持更多的样式,这里
- 一、百度百科Sentinel 是面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防
- 摘要:想必大家做开发的时候都会用到下拉刷新的控件,现在各种第三方的下拉刷新控件不胜枚举。当然最NB的还是XListView。其他也有针对Gr
- 本方式可以获得内部存储设备地址、SD卡地址、USB设备地址,兼容性能达到99%(别问我为什么这么保证,因为是借鉴了Android设置->
- 话不多说,跟着小编一起来看下吧using System;using System.Collections.Generic;using Sys
- 提到类型转换,首先要明确C#中的数据类型,主要分为值类型和引用类型:1.常用的值类型有:(struct)整型家族:int,byte,char
- 工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。工
- 如下所示:package cn.sunzn.md5;import java.security.MessageDigest;import ja
- 1、二叉搜索树的概念 二叉搜索树又称二叉排序树,它可以是一颗空树,亦可以是一颗具有如下性质的二叉树: &
- 本文实例讲述了Android编程之OpenGL绘图技巧。分享给大家供大家参考,具体如下:很久不用OpenGL ES绘图,怕自己忘记了,于是重
- springboot远程debug调试1.首先去编辑器打开项目2.打开Edit Configurations 选择remote选项
- 首先要安装SpeechSDK5.1 开发包和SpeechSDK5.1 Langague Pack(中英文) 语言包,不过VS2010里是自带
- java 获取字节码文件的几种方法总结在本文中,以Person类为例,将分别演示获取该类字节码文件的三种方式,其具体思想及代码如下所示:pu
- 近期遇到了DateTime到底是值类型还是引用类型的疑惑,顺势较深入地了解一下DateTime相关的内容结论:DateTime是值类型,因为
- 一、线性布局LinearLayout有两种排序方式orientation属性值为horizontal时,内部视图在水平方向从左往右排列。or
- C和指针相关基础知识:内存的分配(谭浩强版)1、整型变量的地址与浮点型/字符型变量的地址区别?(整型变量/浮点型变量的区别是什么)2、int
- @Value注解设置默认值在Spring Boot中,如果使用@Value注解对属性进行赋值,但如果在配置文件或启动参数中未指定对应的参数值
- 设计算法,计算两给定基因序列的相似程度。人类基因由4种核苷酸,分别用字母ACTG表示。要求编写一个程序,按以下规则比较两个基因序列并确定它们
- 基本操作import org.apache.hadoop.conf.Configuration;import org.apache.hado
- 前言工作中使用mybatis时我们需要根据数据表字段创建pojo类、mapper文件以及dao类,并且需要配置它们之间的依赖关系,这样的工作