我需要实现256位AES加密,但我在网上找到的所有示例都使用“KeyGenerator”生成256位密钥,但我想使用我自己的密钥。如何创建自己的密钥?我曾尝试将其填充到256位,但随后出现一个错误,表示密钥太长。我确实安装了无限权限补丁,所以这不是问题:)
钥匙发生器看起来像这样
//获取密钥生成器
KeyGenerator kgen=KeyGenerator.getInstance(“AES”);
kgen.init(128);//192位和256位可能不可用
//生成密钥规格。
SecretKey skey=kgen.generateKey();
字节[]原始=skey.getEncoded();
编辑
我实际上是在将密码填充到256字节,而不是位,这太长了。下面是我现在使用的一些代码,因为我对这方面有了更多的经验
字节[]键=null;//待办事项
字节[]输入=null;//待办事项
字节[]输出=null;
SecretKeySpec keySpec=null;
keySpec=新的SecretKeySpec(键,“AES”);
Cipher Cipher=Cipher.getInstance(“AES/CBC/PKCS7Padding”);
cipher.init(cipher.ENCRYPT_模式,keySpec);
输出=cipher.doFinal(输入)
您需要自己完成的“待办事项”:
将密码(achar[])和salt(abyte[]-由SecureRandom选择的8个字节与带外接收者共享。然后,要从该信息中导出一个好的密钥:
/*根据给定的密码和密码派生密钥*/
SecretKeyFactory factory=SecretKeyFactory.getInstance(“PBKDF2WithHmacSHA256”);
KeySpec spec=new-PBEKeySpec(密码,salt,65536256);
SecretKey tmp=工厂生成信任(规范);
SecretKey secret=newsecretkeyspec(tmp.getEncoded(),“AES”);
幻数(可以在某处定义为常量)65536和256分别是密钥派生迭代计数和密钥大小
密钥派生函数被迭代,需要大量的计算工作,从而防止攻击者快速尝试许多不同的密码。迭代计数可以根据可用的计算资源进行更改
密钥大小可以减少到128位,这仍然被认为是;“强”;加密,但如果发现削弱AES的攻击,则不会提供太多安全余量
与适当的块链接模式一起使用时,相同的派生密钥可用于加密许多消息。在密码块链接(CBC),为每条消息生成一个随机初始化向量(IV),即使纯文本相同,也会生成不同的密码文本。CBC可能不是您可用的最安全的模式(参见下面的AEAD);还有许多其他模式具有不同的安全属性,但它们都使用类似的随机输入。在任何情况下,每个加密操作的输出都是密文和初始化向量:
/*加密消息*/
Cipher Cipher=Cipher.getInstance(“AES/CBC/PKCS5Padding”);
cipher.init(cipher.ENCRYPT_模式,secret);
AlgorithmParameters params=cipher.getParameters();
字节[]iv=params.getParameterSpec(IvParameterSpec.class).getIV();
byte[]ciphertext=cipher.doFinal(“你好,世界!”.getBytes(StandardCharsets.utf8));
存储密文和iv。解密时,SecretKey以完全相同的方式重新生成,使用具有相同salt和迭代参数的密码。使用此密钥和与消息一起存储的初始化向量初始化密码:
/*在给定派生密钥和初始化向量的情况下解密消息*/
Cipher Cipher=Cipher.getInstance(“AES/CBC/PKCS5Padding”);
cipher.init(cipher.DECRYPT_模式,secret,新的IvParameterSpec(iv));
字符串明文=新字符串(cipher.doFinal(ciphertext),StandardCharsets.UTF_8);
System.out.println(纯文本);
Java 7附带的API支持AEAD密码模式,以及;SunJCE“;OpenJDK和Oracle发行版中包含的提供程序从Java8开始实现这些功能。强烈建议使用其中一种模式代替CBC;它将保护数据的完整性及其隐私
Ajava.security.InvalidKeyException和消息;密钥大小或默认参数非法”;表示加密强度有限;无限强度管辖权策略文件不在正确位置。在JDK中,它们应该放在${JDK}/jre/lib/security
根据问题描述,听起来策略文件没有正确安装。系统可以很容易地有多个Java运行时;再次检查以确保使用的位置正确