android 基础 加密 加密类Cipher
来源:互联网 发布:医疗器械认证软件 编辑:程序博客网 时间:2024/06/05 20:07
Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
//初始化为加密模式cipher.init(Cipher.ENCRYPT_MODE, secretKey); // 设置工作模式为加密模式,出入密钥(secretKey)
Cipher用来完成加密操作。
cipher的doFinal()方法用来对数据进行加密
获得一个私鈅加密类Cipher,DESede是算法,ECB是加密模式,PKCS5Padding是填充方式
PKCS7Padding是缺几个字节就补几个字节的0,而PKCS5Padding是缺几个字节就补充几个字节的几,好比缺6个字节,就补充6个字节的6
我们知道采用DES加密算法的文件,有可能会被人相对容易破解掉,并不是很安全,如果采用多次混合加密方式那么就会增加被破解难度。
* 3DES即三重DES加密算法,也被称为DESede或者Triple DES。使用三(或两)个不同的密钥对数据块进行三次(或两次)DES加密(加密一次要比进行普通加密的三次要快)。 * 三重DES的强度大约和112-bit的密钥强度相当。通过迭代次数的提高了安全性,但同时也造成了加密效率低的问题。
3DES属于对称加密 *密钥长度:112位/168位 *工作模式:ECB/CBC/PCBC/CTR/CTS/CFB/CFB8 to CFB128/OFB/OBF8 to OFB128 *填充方式:Nopadding/PKCS5Padding/ISO10126Padding/
PKCS7Padding跟PKCS5Padding的区别就在于数据填充方式,PKCS7Padding是缺几个字节就补几个字节的0,而PKCS5Padding是缺几个字节就补充几个字节的几,好比缺6个字节,就补充6个字节的6
这里需要注意一个问题,在创建Cipher对象是需要一个第三方Provider来提供算法实现,在标准JDK中只是规定了JCE(JCE (Java Cryptography Extension) 是一组包,它们提供用于加密、密钥生成和协商以及 Message Authentication Code(MAC)算法的框架和实现。它提供对对称、不对称、块和流密码的加密支持,它还支持安全流和密封的对象。)接口,但是内部实现需要自己或者第三方提供。
互联网的软件设计一定少不了加密算法,并且大量使用的都会是对称加密,比较常见的对称加密有:DES、3DES、RC4、AES等等;
加密算法都有几个共同的要点:
- 密钥长度;(关系到密钥的强度)
- 加密模式;(ecb、cbc等等)
- 块加密算法里的填充方式区分;
对于加密模式,很多同学还不清楚,比如DES,也会有ECB、CBC等不同的区分,它们都是标准的;
Windows加密库中,默认则是CBC模式,也可以手工设置;
Openssl库要更明显一点,它的函数名里面就写明了,比如:DES_ncbc_encrypt,一看就知道是cbc模式;
JAVA里面也比较清楚:Cipher c = Cipher.getInstance(”DES/CBC/PKCS5Padding”); 也可以看到是CBC模式
各种加密模式有什么不同呢:(为了方便,这里的加密key都取64位)
电子密码本模式ECB:
最古老,最简单的模式,将加密的数据分成若干组,每组的大小跟加密密钥长度相同;
然后每组都用相同的密钥加密, 比如DES算法, 如果最后一个分组长度不够64位,要补齐64位;
定义:
Enc(X,Y)是加密函数
Dec(X,Y)是解密函数
Key是加密密钥;
Pi ( i = 0,1…n)是明文块,大小为64bit;
Ci ( i = 0,1…n)是密文块,大小为64bit; ECB加密算法可表示为:
Ci = Enc(Key, Pi) ECB解密算法可以表示为:
Pi = Dec(Key,Ci)
算法 特点:
- 每次Key、明文、密文的长度都必须是64位;
- 数据块重复排序不需要检测;
- 相同的明文块(使用相同的密钥)产生相同的密文块,容易遭受字典攻击;
- 一个错误仅仅会对一个密文块产生影响;
加密块链模式CBC:
算法特点:
- 每次加密的密文长度为64位(8个字节);
- 当相同的明文使用相同的密钥和初始向量的时候CBC模式总是产生相同的密文;
- 密文块要依赖以前的操作结果,所以,密文块不能进行重新排列;
- 可以使用不同的初始化向量来避免相同的明文产生相同的密文,一定程度上抵抗字典攻击;
- 一个错误发生以后,当前和以后的密文都会被影响;
加密反馈模式CFB:
加密反馈模式克服了需要等待8个字节才能加密的缺点,它采用了分组密码作为流密码的密钥流生成器;
- 每次加密的Pi和Ci不大于64位;
- 加密算法和解密算法相同,不能适用于公钥算法;
- 使用相同的密钥和初始向量的时候,相同明文使用CFB模式加密输出相同的密文;
- 可以使用不同的初始化变量使相同的明文产生不同的密文,防止字典攻击;
- 加密强度依赖于密钥长度;
- 加密块长度过小时,会增加循环的数量,导致开销增加;
- 加密块长度应时8位的整数倍(即字节为单位);
- 一旦某位数据出错,会影响目前和其后8个块的数据;
输出反馈模式OFB:
与CFB模式不同之处在于, 加密位移寄存器与密文无关了,仅与加密key和加密算法有关;
做法是不再把密文输入到加密移位寄存器,而是把输出的分组密文(Oi)输入到一位寄存器;
- 与CFB类似,以下都是不同之处;
- 因为密文没有参与链操作,所以使得OFB模式更容易受到攻击;
- 不会进行错误传播,某位密文发生错误,只会影响该位对应的明文,而不会影响别的位;
- 不是自同步的,如果加密和解密两个操作失去同步,那么系统需要重新初始化;
- 每次重新同步时,应使用不同的初始向量。可以避免产生相同的比特流,避免”已知明文”攻击 ;
Windows API进行加密参数设置:
使用加密要注意的地方:
使用加密以前确定你理解了它;
互联网程序中加密模式的使用:
- android 基础 加密 加密类Cipher
- 加密---Cipher
- JCE加密Cipher类说明(详细)
- JCE加密Cipher类说明(详细)
- javax.crypto.Cipher类--加密和解密
- JAVA加密工具类Cipher 使用方法
- bzoj1031 字符加密Cipher
- [JSOI2007]字符加密Cipher
- [BZOJ1031]字符加密Cipher
- java Cipher加密、解密
- cipher加密解密
- [JSOI2007]字符加密Cipher
- Android基础:MD5加密
- BZOJ1031: [JSOI2007]字符加密Cipher
- [Bzoj1031][JSOI2007]字符加密Cipher
- [bzoj1031][JSOI2007]字符加密Cipher
- [BZOJ1031][JSOI2007]字符加密Cipher
- bzoj1031: [JSOI2007]字符加密Cipher
- 字典树
- 柳丁_长按二维码识别测试
- matlab 标注连通域
- laravel5如何创建service provider和facade
- [计网] 用python语言开发一个简单的web服务器和客户端
- android 基础 加密 加密类Cipher
- oracle sequence的概念及作用
- AR7240芯片 EthernetSwitch模块 学习笔记
- 2016SDAU课程练习三1007 Problem G
- OC中通过Class动态添加一个控制器,Swift中怎么实现?
- Fragment的setUserVisibleHint方法实现懒加载
- 算法之深度优先搜索和广度优先搜索
- ViewPager实现淘宝天面首页广告栏,支持左右滑动,自动滑动,带圆点指示器
- mountebank之Predicates