你说的也是可以的
这个问题可以去查相关的料
两种都有
公钥加密,私钥解密
私钥加密,公钥解密
由于JDK版本不同,在Java 8 update 161版本以后就会出现此问题,根本原因还是DH密钥长度至少为512位,而DES算法密钥没有这么长,密钥长度不一致引起的。
解决方法:
配置JVM的系统变量:-Djdk.crypto.KeyAgreement.legacyKDF=true
1.发送方构建公钥私钥。
2.发送方发布发送方公钥。
3.接收方接收发送方公钥构建接收方公钥私钥。
4.接收方发布接收方公钥。
5.发送方通过发送方的私钥和接收方的公钥构建对称加密秘钥用于加密。
6.接收方通过接收方的私钥和发送方的公钥构建对称加密秘钥用于解密。
7.发送方通过秘钥加密数据并发送。
8.接收方接收数据并通过秘钥解密数据。
我稍微整理了下
public static void jdkDHFlow() throws Exception { //1.发送方构建公钥私钥 KeyPair senderKeyPair = jdkSenderPublicKey(); //2.发送方发布公钥 byte[] senderPublicKeyEncode = senderKeyPair.getPublic().getEncoded(); //3.接收方构建公钥私钥->接收方通过发送方公钥构建公钥私钥 KeyPair receiverKeyPair = jdkreceiverPublicKey(senderPublicKeyEncode); //4.接收方发布公钥 byte[] receiverPublicKeyEncode = receiverKeyPair.getPublic().getEncoded(); //5.发送方构建对称加密的秘钥->依据接收方公钥和自己的公钥私钥构建 SecretKey senderDesKey = jdkGetSecretKey(senderKeyPair,receiverPublicKeyEncode); //6.接收方构建对称加密秘钥->依据发送方公钥和接收方公钥撕咬构建 SecretKey receiverDesKey = jdkGetSecretKey(receiverKeyPair,senderPublicKeyEncode); //对比双方对称加密秘钥是否安相同 查看是否测试成功 if(Objects.equals(receiverDesKey,senderDesKey)){ System.out.println("双方秘钥相同"); } //7.发送方加密 Cipher cipher = Cipher.getInstance("DES"); cipher.init(Cipher.ENCRYPT_MODE,senderDesKey); byte[] result = cipher.doFinal(BASE_STRING.getBytes()); System.out.println("JDK DH 加密:"+ Base64.encodeBase64String(result)); //8.接收方解密 cipher.init(Cipher.DECRYPT_MODE,receiverDesKey); result = cipher.doFinal(result); System.out.println("JDK DH 解密:"+new String(result)); } /** * 发送方构建发送方公钥 * @return 构建完成的公钥 */ public static KeyPair jdkSenderPublicKey() throws NoSuchAlgorithmException { //1.初始化发送方秘钥 KeyPairGenerator senderKeyPairGenerator = KeyPairGenerator.getInstance("DH"); senderKeyPairGenerator.initialize(512); //生成秘钥 KeyPair senderKeyPair = senderKeyPairGenerator.generateKeyPair(); return senderKeyPair; } /** * 依据发送方公钥生成接收方公钥 * @param senderPublicKey 发送方公钥 * @return 接收方公钥 */ public static KeyPair jdkreceiverPublicKey(byte[] senderPublicKey) throws Exception { KeyFactory receiverKeyFactory = KeyFactory.getInstance("DH"); X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(senderPublicKey); PublicKey receiverPublicKey = receiverKeyFactory.generatePublic(x509EncodedKeySpec); //使用和发送方一样的参数初始化 DHParameterSpec dhParameterSpec = ((DHPublicKey) receiverPublicKey).getParams(); KeyPairGenerator receiverKeyPairGenerator = KeyPairGenerator.getInstance("DH"); //发送方公钥解析出来的dhParameterSpec receiverKeyPairGenerator.initialize(dhParameterSpec); KeyPair receiverKeyPair = receiverKeyPairGenerator.generateKeyPair(); return receiverKeyPair; } /** * 自己的公钥私钥与对方的公钥构建 对称秘钥 * @param keyPair 自己秘钥对 * @param publicKey 对方公钥 * @return 本地对称加密秘钥 */ public static SecretKey jdkGetSecretKey(KeyPair keyPair,byte[] publicKey) throws Exception { KeyFactory keyFactory = KeyFactory.getInstance("DH"); X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(publicKey); PublicKey senderPublicKey = keyFactory.generatePublic(x509EncodedKeySpec); KeyAgreement keyAgreement = KeyAgreement.getInstance("DH"); keyAgreement.init(keyPair.getPrivate()); keyAgreement.doPhase(senderPublicKey,true); SecretKey secretKey = keyAgreement.generateSecret("DES"); return secretKey; }
看情况。看业务。
感兴趣你可以debug时查看其结构,或者查看一下实现的源码。
发送方的本地密钥:是通过发送方的私钥和接受方的公钥一起生成的
问题是什么?
不容易破解,除非你公钥泄露
非对称,还比较安全吧
public key 不对,是不是用错函数?
String str="imooc security";
Cipher cipher=Cipher.getInstance("DES");
cipher.init(Cipher.ENCRYPT_MODE, senderSecretKey);
byte[] bs=cipher.doFinal(str.getBytes());
老师的意思的是密钥的转换,实际上并不需要转换,也不需要重新生成keyfactory。可能是实际项目中一般会这样,因为实际接受方和发送方并不知道对方的密钥的encoded format(编码格式),所以需要转换成自己使用encoded format。例如本节里面的X509...之类的。而KeyFactory就是转换格式后重新生成私钥,公钥。
也可以用下面的代码,不需要转换,理论上是可以的:
package com.imooc.RSA; import org.apache.commons.codec.binary.Hex; import javax.crypto.Cipher; import java.security.KeyPair; import java.security.KeyPairGenerator; /** * Created by anyuan on 2016/11/23. */ public class ImoocRSA { public static final String src = "imooc security rsa"; public static void main(String[] args) throws Exception { jdkRSA(); } public static void jdkRSA() throws Exception { //初始化密钥 KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); keyPairGenerator.initialize(512);//512~65532 KeyPair keyPair = keyPairGenerator.generateKeyPair(); //私钥加密,公钥解密 //下面是产生密钥工厂,用公钥或者私钥产生密钥工厂,进而产生密钥。原则上这里可以省略.密钥转换也可以省略 // KeyFactory keyFactory = KeyFactory.getInstance("RSA"); // PrivateKey privateKey = keyFactory.generatePrivate((KeySpec) keyPair.getPrivate()); Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.ENCRYPT_MODE, keyPair.getPrivate()); byte[] result = cipher.doFinal(src.getBytes()); System.out.println("**私钥加密,公钥解密**"); System.out.println("加密:" + Hex.encodeHexString(result)); cipher.init(Cipher.DECRYPT_MODE, keyPair.getPublic()); result = cipher.doFinal(result); System.out.println("解密:" + new String(result)); } }
代码简洁很多。自己写的时候没必要像老师那么繁琐。但是实际项目中就不一定了。
这个是加密的字符串太长了,我也没找到解决方案的,谁有办法请明示
百度,下一个。
使用AES加密时,当密钥大于128时,代码会抛出java.security.InvalidKeyException: Illegal key size or default parameters
Illegal key size or default parameters是指密钥长度是受限制的,java运行时环境读到的是受限的policy文件。文件位于${java_home}/jre/lib/security
这种限制是因为美国对软件出口的控制。
解决办法:
去掉这种限制需要下载Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files.网址如下。
下载包的readme.txt 有安装说明。就是替换${java_home}/jre/lib/security/ 下面的local_policy.jar和US_export_policy.jar
jdk 5: http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-java-plat-419418.html#jce_policy-1.5.0-oth-JPR
jdk6: http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html
参考http://stackoverflow.com/questions/6481627/java-security-illegal-key-size-or-default-parameters
错误:java.security.InvalidKeyException: Illegal key size or default parameters解决方法
发布于 2014 年 3 月 18 日,属于 高性能JAVA 分类,757 浏览数
Java几乎各种常用加密算法都能找到对应的实现。因为美国的出口限制,Sun通过权限文件(local_policy.jar、US_export_policy.jar)做了相应限制。因此存在一些问题:
●密钥长度上不能满足需求(如:java.security.InvalidKeyException: Illegal key size or default parameters);
●部分算法未能支持,如MD4、SHA-224等算法;
●API使用起来还不是很方便;一些常用的进制转换辅助工具未能提供,如Base64编码转换、十六进制编码转换等工具。
Oracle在其官方网站上提供了无政策限制权限文件(Unlimited Strength Jurisdiction Policy Files),我们只需要将其部署在JRE环境中,就可以解决限制问题。
下载地址:
●Java 5.0 无政策限制文件
●Java 6 无政策限制文件
●Java 7 无政策限制文件
●其他版本 无政策限制文件
下载的压缩包中仅有一个目录,也就是jce目录。该目录中包含了4个文件:README.txt、COPYRIGHT.html、local_policy.jar和US_export_policy.jar。其中包含的两个jar文件正是此次配置中用到的文件。
我们可以查看上述README.txt文件,你需要在JDK的JRE环境中,或者是JRE环境中配置上述两个jar文件。
切换到%JDK_Home%\jre\lib\security目录下,对应覆盖local_policy.jar和US_export_policy.jar两个文件。同时,你可能有必要在%JRE_Home%\lib\security目录下,也需要对应覆盖这两个文件。
配置权限文件的最终目的是为了使应用在运行环境中获得相应的权限,可以加强应用的安全性。通常,我们在应用服务器上安装的是JRE,而不是JDK。因此,这就很有必要在应用服务器的%JRE_Home%\lib\security目录下,对应覆盖这两个权限文件。很多开发人员往往忽略了这一点,导致事故发生。
AES加密时抛出java.security.InvalidKeyException: Illegal key size or default parameter
0条评论
[摘要:起源:http://blog.csdn.net/shangpusp/article/details/7416603 应用AES减稀时,当稀钥大于128时,代码会扔出java.security.InvalidKeyException: Illegal key size or default parameters Illegal key size or default parameters是指]
来源:http://blog.csdn.net/shangpusp/article/details/7416603
使用AES加密时,当密钥大于128时,代码会抛出java.security.InvalidKeyException: Illegal key size or default parameters
Illegal key size or default parameters是指密钥长度是受限制的,java运行时环境读到的是受限的policy文件。文件位于${java_home}/jre/lib/security
这种限制是因为美国对软件出口的控制。
解决办法:
去掉这种限制需要下载Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files.网址如下。
下载包的readme.txt 有安装说明。就是替换${java_home}/jre/lib/security/ 下面的local_policy.jar和US_export_policy.jar
jdk 5: http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-java-plat-419418.html#jce_policy-1.5.0-oth-JPR
jdk6: http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html
jdk7下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html
AES加密参考:http://blog.csdn.net/hbcui1984/article/details/5201247
感谢关注 Ithao123加密解密频道,ithao123.cn是专门为互联网人打造的学习交流平台,全面满足互联网人工作与学习需求,更多互联网资讯尽在 IThao123!
java.security.InvalidKeyException: Illegal key size or default parameters
时间 2014-06-27 11:06:58 CSDN博客
原文 http://blog.csdn.net/liwf_/article/details/35233009
主题 Java 网络安全
做CA认证 生成证书时候出错,后来发现是 秘钥长度太长了,怎么会有这个问题呢,看下面的:
参考网址 : http://open.eucalyptus.com/forum/illegal-key-size
http://ksgimi.iteye.com/blog/1584716
异常:
EjbcaException_Exception: exception encrypting data - java.security.InvalidKeyException: Illegal key size
分析:
Illegal key size or default parameters是指密钥长度是受限制的,java运行时环境读到的是受限的policy文件。文件位于${java_home}/jre/lib/security
这种限制是因为美国对软件出口的控制。
所以下载匹配的jce_policy ,替换jdk安装目录下 jdk1.* \jre\lib\security 中的 local_policy.jar 和 US_export_policy.jar 两个jar包。(不主要)
替换jdk安装目录下 jre * \lib\security 中的 local_policy.jar 和 US_export_policy.jar 两个jar包。 (主要)
看下文:
I was working on webservice call where my code was breaking in RAD during decrypting the password of keystore. I encountered below error:
Caused by: java.security.InvalidKeyException: Illegal key size or default parameters
at javax.crypto.Cipher.a(DashoA13*..) ~[na:1.6]
at javax.crypto.Cipher.a(DashoA13*..) ~[na:1.6]
at javax.crypto.Cipher.a(DashoA13*..) ~[na:1.6]
at javax.crypto.Cipher.init(DashoA13*..) ~[na:1.6]
at javax.crypto.Cipher.init(DashoA13*..) ~[na:1.6]
There are key size restrictions with the default crypto files local_policy.jar and US_export_policy.jar comes with JDK – which limits it to 128. If your security policy using a key size larger than this – then the above exception is thrown.
For example – if your security policy specifies the algorithmic suite as Basic256 – then the key size to be used is 256.
For the solution of above issue, you need to patch your JDK with Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files.
For JDK1.5 visit , download the crypto files and copy the two jar files from the extracted jce directory (local_policy.jar and US_export_policy.jar) to $JAVA_HOME/jre/lib/security.
For JDK1.6 visit
If your IDE using it’s own specific JDK then patch that as well with these files to resolve the issue.
高版本的
智商捉急
不一样
我的锅,他妈的
public static String input = "";
输入为空串,调了一个小时,电脑都快砸烂,这要把手剁了