引入:

在我们加密解密过程中,因为我上次在维基百科上看到一篇文章http://en.wikipedia.org/wiki/Advanced_Encryption_Standard说,AES的加密方式支持的密钥是128位,192位和256位 ,而实际应用中,如果我用128位的AES密码加密,则没问题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public static void main(String[] args) throws Exception {
                                                                                                                                                                                                               
        //我们演示加密解密字符串
        System.out.println("加密解密字符串:");
                                                                                                                                                                                                               
        String stringNeedEncrypt="加密这段文本";
        System.out.println("被加密的文本为:"+stringNeedEncrypt);
                                                                                                                                                                                                               
        //产生一个密钥
        KeyGenerator keyGen = KeyGenerator.getInstance("AES");
        keyGen.init(128);
        Key key=keyGen.generateKey();
        System.out.println("\n加密使用的密钥为:"+(new BASE64Encoder()).encode(key.getEncoded()));
        System.out.println("加密使用的算法为:"+key.getAlgorithm());
                                                                                                                                                                                                               
        //加密字符串过程
        System.out.println("\n开始加密字符串...");
        byte[] encryptedValue = EncryptUtil.encryptString(stringNeedEncrypt, key);
        System.out.println("加密后的密文为:"+(new BASE64Encoder()).encode(encryptedValue));
                                                                                                                                                                                                               
        //解密字符串过程
        System.out.println("\n开始解密字符串...");
        String decryptedString = EncryptUtil.decryptString(encryptedValue, key);
        System.out.println("解密后还原的字符串为:"+decryptedString);
    }

显示结果为:

但是,如果我们把代码的第11行 ,keyGen.init改为256(也就是希望密码长度为256位),那么则会抛出以下的异常:

这是为什么呢?

解决:

这个问题是因为美国在用于加密的密钥上对于出口做了限制,它不提供很长的,非常高强度的密钥

因为我们的jdk版本是1.6

所以去http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html下载不限制密钥长度的策略文件。

接受完许可证协议后,下载jce_policy-6.zip文件到本地:

解压完毕后,吧其中的local_policy.jar和US_export_policy.jar 覆盖掉%JAVA_HOME%/jre/lib/security目录下的同名文件:

然后重新运行下我们的应用,就成功了。

分析:

为什么这种方法是可以呢?答案肯定在我们复制的2个jar文件中。

我们先比较下local_policy.jar文件的内容。

对于限制密钥强度的版本的local_policy.jar文件,在其中default_local.policy文件如下:

此外,还多一个文件叫exempt_local.policy文件,其内容为:

在MANIFEST.MF中,标识出密码强度(Crypto-Strength)为limited.

对于不限制密钥强度的版本的local_policy.jar文件,在其中的default_local.policy文件如下:

在MANIFEST.MF中,标识出密码强度(Crypto-Strength)为unlimited.

我们再比较下US_export_policy.jar文件中的内容:

对于限制密钥强度的版本的US_export_policy.jar文件,在其中default_local.policy文件如下:

对于非限制密钥强度的版本的US_export_policy.jar文件,在其中的default_local.policy文件如下:

所以,从上面可以看出,在默认的jdk提供的JCE policy文件和我们单独下载的无限制密钥强度的JCE policy文件,对于US_export_policy.jar文件是几乎完全一样的。只有local_policy.jar不同。其中默认JDK提供的是有密钥限制的。

那么这文件怎么读呢?我们从http://pages.cs.wisc.edu/~horwitz/java-docs/guide/security/jce/JCERefGuide.html中找到了答案。

其中,从最后一个permissionjavax.crypto.CryptoPermisson * ,128条目可以看出,在限制密钥强度版本,任意算法的密钥强度最多是128位,这就是为什么我们用128位可以正常工作,但是我们用256位就会报错。当我们用不受限密钥强度的local_policy.jar替换的时候,它的permission变成了 permissionjavax.crypto.CryptoAllPermission; 这表明对任意算法,密钥长度不受限制。

在运行时,当application/applet类通过getInstance()方法实例化Cipher类时,然后如果应用有相关联的permissionpolicy文件,则JCE 会检查permission policy 文件是否有一些条目,适用于getInstance()调用中相应的算法。如果有,则进行permission check,放行或者拒绝这次实例化。

本文转自 charles_wang888 51CTO博客,原文链接:http://blog.51cto.com/supercharles888/1317165,如需转载请自行联系原作者

密码学研究-密钥长度限制相关推荐

  1. 在密码学研究方面不断创新突破—— 女密码学家的成功密码

    随着信息技术的大规模应用和数字经济的加速发展,密码学的重要性日益凸显.近年来,一位土生土长的中国女密码学家备受瞩目,她就是荣获2019年未来科学大奖的首位女科学家,清华大学和山东大学双聘教授王小云. ...

  2. 计算机信息安全密码学研究,密码学是对信息安全各方面的研究,能够解决所有信息安全的问题。() - 试题答案网问答...

    相关题目与解析 密码学作为信息安全的关键技术,其安全目标主要包括三个非常重要的方面:保密性.完整性和可用性.()是指所有资源只能由授权方式以授权的方式进行修改,即信息未经授权不能进行改变的特性. 密码 ...

  3. 密码学研究-加密解密

    引入: 现在我们来研究密码学的加密解密过程,这个十分重要,因为它是明文到密文的桥梁,从类型上分,我们又分为加密解密字符串和加密解密文件,我们这文章就讲解这些细节,主要的核心类是Cipher类. 实践: ...

  4. 密码学研究-Provider

    引入: Provider 是研究密码学的第一步,它表示了对于JAVA安全框架的一种实现.对于JDK,它有许多默认的实现,当然了,你也可以不满意其默认的实现,而使用第三方或者自己根据API 开发SPI ...

  5. 密码学研究-玩转密钥

    引入: 在我们的博客:http://supercharles888.blog.51cto.com/609344/1313864中可以看到,对于加密解密,最重要的是密码,因为从加密方式上来看,有对称加密 ...

  6. 密码学研究-数字签名

    引入: 提到签名,大家都不陌生,大家知道,重大的文件一般都要领导签名,来确保这个文件的真实有效.而一些比较重要的合同,比如买房的购房合同,都要盖"骑缝章",这个骑缝章,就是盖在2页 ...

  7. 常用MD5解密工具,仅限于密码学研究

    http://www.pdtools.net/tools/md5.jsp https://www.cmd5.com/收费的 https://www.somd5.com/免费的

  8. Conflux研究总监杨光:从现代密码学到区块链

    "It must not be required to be secret, and it must be able to fall into the hands of the enemy ...

  9. 图灵奖获得者、信息安全常青树Adi Shamir:从密码学到AI对抗性样本研究|智源大会嘉宾风采...

    来源:智源大会 导读:RSA 算法是通信.金融产业中被广泛使用的安全基本机制,是信息时代的支柱技术.而在这个跨时代算法背后的设计者之一,正是密码学先驱 Adi Shamir.除了RSA 公钥密码算法以 ...

最新文章

  1. 搜索引擎语法简介 google shodan censys zoomeye fofa dnsdb
  2. 处理数字_4_计算某列的总和
  3. CheckBox in ListView
  4. BetterFE 前端技术周刊 - 2019/04/15
  5. 基于matlab的语音信号基本处理系统,基于matlab的语音信号处理及分析
  6. 前端学习(2961):前一天回顾
  7. thymeleaf 模板语言简介
  8. MFC工作笔记0005---::在vc++中是什么意思
  9. 使用ByteArrayOutputStream解决IO乱码问题的踩坑记录
  10. linux快速安装mysql教程
  11. 如何添加CDN加速域名
  12. 大数据应用的典型案例
  13. macbook pro开机后自动关机
  14. Python实现BT种子转化为磁力链接【实战】
  15. Ctrl+26个英文字母组合的Excel快捷键,都是最常用的快捷键!
  16. 一文读懂知识图谱的主要技术
  17. 50种网络故障及解决方法
  18. 2006-2020年10月各类型国债利率
  19. Servlet 动态Web项目-eclipse中,添加新servlet选择Tomcat无法下一步、无法启动Tomcat
  20. 硬件学习、高速dsp开发板制作、STM32学习笔记

热门文章

  1. android audiotrack权限,Android中AudioRecord和AudioTrack的使用注意
  2. v8 编译 linux,安装与编译 Javascript V8 Engine
  3. 根据文法画出语法树_更多确定子句语法
  4. 网页连接不上java服务端,用Java插入IP时无法连接到服务器
  5. 类的初始化列表_探索未知种族之osg类生物---渲染遍历之draw函数二
  6. irobot扫地机器人 电压_iRobot评测!扫地机器人究竟能有多好用?
  7. 【AI基础】OpenCV,PIL,Skimage你pick谁
  8. 全球及中国霍乱菌苗行业模式分析及前景发展规划建议报告2022-2027年版
  9. 金谷诺亚携华人文交所 经信研究·李刚:打造元宇宙数字商城
  10. 谋定新型农业主体-农业大健康·万祥军:农业高质量发展规划