MyException - 我的异常网
当前位置:我的异常网» PHP » Atitit.加密算法 des  aes 各

Atitit.加密算法 des  aes 各个语言不同的原理与解决方案java php c

www.MyException.Cn  网友分享于:2015-08-24  浏览:0次
Atitit.加密算法 des  aes 各个语言不同的原理与解决方案java php c#

Atitit.加密算法 des  aes 各个语言不同的原理与解决方案java php c#

 

1加密算法的参数::算法/模式/填充  1

2标准加密api使用流程 1

2.1. Md5——16bit 填充key,使其长度达到128(或其他规定的长度) 2

2.2. 生成key 2

2.3. 运算 2

3Aes加密原理架构图 2

4Key的算法不一致 4

5加密模式 4

5.1. Ecb 4

5.2. 3.2 CBC模式: 5

5.3. OFB模式: 6

5.4. 3.3 CFB模式: 7

6padding方式 8

6.1.1. Padding方式架构图 9

7算法/模式/填充 对比表 9

8                  16字节加密后数据长度         不满16字节加密后长度 10

9Java中的加密系列 11

9.1. 安全提供者体系结构 11

9.1.1. 引擎和算法。引擎可以理解为操作,如加密、解密等 11

9.2. 3.2.12 SecureRandom 12

9.3.  Key接口 12

9.4. 3.4.3 SecretKeySpec 14

10. Aes算法的常见问题解决 14

11. 参考 15

 

 

1. 加密算法的参数::算法/模式/填充 

/* 模型化密钥的概念。由于密钥必须在不同实体之间传输,因此所有的密钥都必须是可以序列化的*/

 

还有字符编码方式,特别是以中文做密钥的时候。

 

2. 标准加密api使用流程

 

2.1. Md5——16bit 填充key,使其长度达到128(或其他规定的长度)

key=MD5.getMD5_16bit(key,"utf-8");

            byte[] bytes = key.getBytes();

          

SecretKeySpec keySpec = new SecretKeySpec(bytes"AES"); 

            return keySpec

2.2. 生成key

2.3. 运算

 

作者:: 老哇的爪子 Attilax 艾龙,  EMAIL:1466519819@qq.com

转载请注明来源: http://blog.csdn.net/attilax

 

3. Aes加密原理架构图

 

AES对称加密:

 

 

 

 

 

 

4. Key的算法不一致

 

原来是我指定key的方式不对直接将字符串做为参数想当然的以为这就是key, 其实不然, CryptoJS会根据这个字符串算出真正的keyIV(各种新鲜名词不解释问我也没用我也不懂 -_-")

 

 

5. 加密模式

五中模式:CBC,CFB,ECB,OFB,PCBC

不带模式和填充来获取AES算法的时候,其默认使用ECB/PKCS5Padding。

 

 模式 更安全,不同的模式可能安全性更高点。。。

 

5.1. Ecb

ECB:是一种基础的加密方式,密文被分割成分组长度相等的块(不足补齐),然后单独一个个加密,一个个输出组成密文。

 

 

优点:

1.简单;

2.有利于并行计算;

3.误差不会被传送;

缺点:

1.不能隐藏明文的模式;

2.可能对明文进行主动攻击;

 

 

 

5.2. 3.2 CBC模式:

 

优点:

1.不容易主动攻击,安全性好于ECB,适合传输长度长的报文,SSLIPSec的标准。

缺点:

1.不利于并行计算;

2.误差传递;

3.需要初始化向量IV

 

 

5.3. OFB模式:


 优点:

1.隐藏了明文模式;

2.分组密码转化为流模式;

3.可以及时加密传送小于分组的数据;

缺点:

1.不利于并行计算;

2.对明文的主动攻击是可能的;

3.误差传送:一个明文单元损坏影响多个单元;

 

5.4. 3.3 CFB模式:


 优点:

1.隐藏了明文模式;

2.分组密码转化为流模式;

3.可以及时加密传送小于分组的数据;

缺点:

1.不利于并行计算;

2.误差传送:一个明文单元损坏影响多个单元;

3.唯一的IV;

 


 

6. padding方式

 

AES一般是16个字节为一块,然后对这一整块进行加密,如果输入的字符串不够16个字节,就需要补位,

PKCS5Padding:填充的原则是,如果长度少于16个字节,需要补满16个字节,补(16-len)(16-len)例如:

123这个节符串是3个字节,16-3= 13,补满后如:123+13个十进制的13

如果字符串长度正好是16字节,则需要再补16个字节的十进制的16

 

 

 

CryptoJS进行DES加密时默认的模式和padding方式和Java默认的不一样造成的必须使用ECB modePKCS5Padding, 但是CryptoJS中只有Pkcs7, 不管了试试看...

 

支持三种填充:NoPadding,PKCS5Padding,ISO10126Padding。不支持SSL3Padding。不支持“NONE”模式。

 

 

6.0.1. Padding方式架构图

 

 

7. 算法/模式/填充 对比表

8.                   16字节加密后数据长度         不满16字节加密后长度

AES/CBC/NoPadding              16                         不支持
AES/CBC/PKCS5Padding           32                         16
AES/CBC/ISO10126Padding        32                         16
AES/CFB/NoPadding              16                         原始数据长度
AES/CFB/PKCS5Padding           32                         16
AES/CFB/ISO10126Padding        32                         16
AES/ECB/NoPadding              16                         不支持
AES/ECB/PKCS5Padding           32                         16
AES/ECB/ISO10126Padding        32                         16
AES/OFB/NoPadding              16                         原始数据长度
AES/OFB/PKCS5Padding           32                         16
AES/OFB/ISO10126Padding        32                         16
AES/PCBC/NoPadding             16                         不支持
AES/PCBC/PKCS5Padding          32                         16
AES/PCBC/ISO10126Padding       32                         16

 

 

 

9. Java中的加密系列

 

9.1. 安全提供者体系结构

 

Java安全体系结构通过扩展的方式,加入了更多的算法实现及相应的安全机制。我们把这些提供者称为安全提供者(以下简称“提供者”)。以下内容是JDK 1.7所提供的安全提供者的配置信息。

security.provider.1=sun.security.provider.Sun

security.provider.2=sun.security.rsa.SunRsaSign

security.provider.3=sun.security.ec.SunEC

security.provider.4=com.sun.net.ssl.internal.ssl.Provider

security.provider.5=com.sun.crypto.provider.SunJCE

security.provider.6=sun.security.jgss.SunProvider

security.provider.7=com.sun.security.sasl.Provider

security.provider.8=org.jcp.xml.dsig.internal.dom.XMLDSigRI

security.provider.9=sun.security.smartcardio.SunPCSC

security.provider.10=sun.security.mscapi.SunMSCAPI

 

9.1.1. 引擎和算法。引擎可以理解为操作,如加密、解密等

安全提供者实现了两个概念的抽象:引擎和算法。引擎可以理解为操作,如加密、解密等。算法则定义了操作如何执行,如一个算法可以理解为一个引擎的具体实现。当然,一个算法可以有多种实现方式,这就意味着同一个算法可能与多个引擎的具体实现相对应。

安全提供者接口的目的就是提供一个简单的机制,从而可以很方便地改变或替换算法及其实现。在实际开发中,程序员只需要用引擎类实现特定的操作,而不需要关心实际进行运算的类是哪一个。

Provider类和Security类(java.security.Security)共同构成了安全提供者的概念。我们将在本章中介绍这两个类的Java API。

 

 

9.2. 3.2.12 SecureRandom

 SecureRandom类继承于Random类(java.util.Random),它起到强加密随机数生成器(Random Number Generator,RNG)的作用,我们称之为安全随机数生成器,它同样是一个引擎类。

// 提供安全随机数

publicclass SecureRandom

extends Random 

 

9.3.  Key接口

 

/* 模型化密钥的概念。由于密钥必须在不同实体之间传输,因此所有的密钥都必须是可以序列化的*/

 

所有的密钥都具有三个特征:

算法。这里指的是密钥的算法,如DES和DSA等,通过getAlgorithm()方法可获得算法名。

编码形式。这里指的是密钥的外部编码形式,密钥根据标准格式(如X.509 SubjectPublicKeyInfo或 PKCS#8)编码,使用getEncoded()方法可获得编码格式。

格式。这里指的是已编码密钥的格式的名称,使用getFormat()方法可获得格式。

对应上述三个特征,Key接口提供如下三个方法:

// 返回此密钥的标准算法名称

public String getAlgorithm()

/* 返回基本编码格式的密钥,通常为二进制格式,如果此密钥不支持编码,则返回 null*/

public byte[] getEncoded()

// 返回此密钥的基本编码格式,如果此密钥不支持编码,则返回 null

public String getFormat()  

SecretKey、PublicKey、PrivateKey三大接口继承于Key接口,定义了对称密钥和非对称密钥接口。

(1)SecretKey

 

public abstract interface SecretKey extends Key {

public static final long serialVersionUID = -4795878709595146952L;

}

SecretKey(javax.crypto.SecretKey)接口是对称密钥顶层接口。DES、AES等多种对称密码算法密钥均可通过该接口提供,PBE(javax.crypto.interfaces.PBE)接口提供PEB算法定义并继承了该接口。Mac算法实现过程中,通过SecretKey接口提供秘密密钥。通常使用的是SecretKey接口的实现类SecretKeySpec(javax.crypto.spec.SecretKeySpec)。

 

public abstract interface Key extends Serializable {

public static final long serialVersionUID = 6603384152749567654L;

 

public abstract String getAlgorithm();

 

public abstract String getFormat();

 

public abstract byte[] getEncoded();

}

 

 

9.4. 3.4.3 SecretKeySpec

  SecretKeySpec类是KeySpec接口的实现类,用于构建秘密密钥规范。可根据一个字节数组构造一个SecretKey,而无须通过一个(基于provider的)SecretKeyFactory。
// 此类以与provider无关的方式指定一个密钥
public class SecretKeySpec
extends Object
implements KeySpec, SecretKey 

此类仅对能表示为一个字节数组并且没有任何与之相关联的密钥参数的原始密钥有用,如DES或Triple DES密钥。

 

 

10. Aes算法的常见问题解决

 

 java.security.InvalidKeyException: Invalid AES key length: 8 bytes”,

解决方法,填充key字符串

SecretKeySpec aesKey = new SecretKeySpec("1234567812345678".getBytes(), "AES"); //Key要16位的
 因为AES是128\192\256。。。

 

 

DES的密钥必须是24位的byte数组

    随便拿一个String.getBytes()是不行的,会报如下错误

        java.security.InvalidKeyException: Invalid key length: 59 bytes

解决方法有很多,①按密钥固定长度重新定义字符串; 麻烦

②先把字符串用Base64或者MD5加密,然后截取固定长度的字符转成byte数组;

推荐

 ③字符串转成Byte数组,针对该数组进行修改,若长度过长则只截取一部分,若长度不够则补零

这个也不好,可能脚本语言对bite操作能力弱。。而且不是唯一。

 

 

 

 

11. 参考

为什么 CryptoJS DES 加密的结果和 Java DES 不一样_.html

JCE中支持AES,支持的模式和填充方式-gh_aiyz-ChinaUnix博客.html

C++JavaAES_ECB_PKCS5Padding算法加解密互通 独孤小孩的日志 网易博客.html

paip.提升安全性----Des加密 java php python的实现总结 - attilax的专栏 博客频道 - CSDN.NET.html

detail) 分组对称加密模式_ECB_CBC_CFB_OFB - aaaaatiger--寻路 博客频道 - CSDN.NET.html

detail3.2.12 SecureRandom_Java加密与解密的艺术_红黑联盟读书频道.html

【推荐】JAVA基础◆浅谈3DES加密解密 孤剑之家 博客频道 - CSDN.NET.html

AES加密时抛出java.security.InvalidKeyException_ Illegal key size or default parameter - ksgimi - ITeye技术网站.html

版权声明:本文为博主原创文章,未经博主允许不得转载。

文章评论

Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
程序员应该关注的一些事儿
程序员应该关注的一些事儿
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
每天工作4小时的程序员
每天工作4小时的程序员
我的丈夫是个程序员
我的丈夫是个程序员
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
Google伦敦新总部 犹如星级庄园
Google伦敦新总部 犹如星级庄园
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
2013年中国软件开发者薪资调查报告
2013年中国软件开发者薪资调查报告
老程序员的下场
老程序员的下场
漫画:程序员的工作
漫画:程序员的工作
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
为什么程序员都是夜猫子
为什么程序员都是夜猫子
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
 程序员的样子
程序员的样子
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
Java程序员必看电影
Java程序员必看电影
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
如何成为一名黑客
如何成为一名黑客
10个调试和排错的小建议
10个调试和排错的小建议
旅行,写作,编程
旅行,写作,编程
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
一个程序员的时间管理
一个程序员的时间管理
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
那些性感的让人尖叫的程序员
那些性感的让人尖叫的程序员
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
程序员都该阅读的书
程序员都该阅读的书
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
程序员必看的十大电影
程序员必看的十大电影
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
鲜为人知的编程真相
鲜为人知的编程真相
程序员和编码员之间的区别
程序员和编码员之间的区别
编程语言是女人
编程语言是女人
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
中美印日四国程序员比较
中美印日四国程序员比较
代码女神横空出世
代码女神横空出世
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有