Java 256位AES密码加密

问题:

我需要实现256位AES加密,但是我在网上发现的所有示例都使用“KeyGenerator”来生成256位密钥,但是我想使用我自己的密钥。如何创建我自己的密钥?我已经尝试将其填充到256位,但是我收到一个错误,表示该键太长。我有无限制的管辖区域安装,所以这不是问题:)
IE浏览器。 KeyGenerator看起来像这样…

// Get the KeyGenerator
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128); // 192 and 256 bits may not be available

// Generate the secret key specs.
SecretKey skey = kgen.generateKey();
byte[] raw = skey.getEncoded();

 Code taken from here
 编辑
我实际上将密码填充到256字节,而不是位,太长。以下是我现在使用的一些代码,我有一些更多的经验。

byte[] key = null; // TODO
byte[] input = null; // TODO
byte[] output = null;
SecretKeySpec keySpec = null;
keySpec = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
cipher.init(Cipher.ENCRYPT_MODE, keySpec);
output = cipher.doFinal(input)

“TODO”位你需要自己去做:-)

回答:

共享password(一个char[])和salt(一个byte[] -8个字节,由SecureRandom选择,使一个好的盐 – 不需要保密)与收件人不在一起-带。然后从这个信息中获得一个好的密钥:

/* Derive the key, given password and salt. */
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
KeySpec spec = new PBEKeySpec(password, salt, 65536, 256);
SecretKey tmp = factory.generateSecret(spec);
SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");

魔术数字(可以定义为常数)65536和256分别是关键派生迭代计数和密钥大小。
重要的推导函数被重复,以需要大量的计算工作,并且可以防止攻击者快速尝试许多不同的密码。可以根据可用的计算资源来更改迭代计数。
密钥大小可以减少到128位,这仍然被认为是“强”加密,但是如果发现AES弱化的攻击,则不会给出很大的安全余地。
使用正确的块链模式,相同的派生密钥可用于加密许多消息。在CBC中,对于每个消息生成随机初始化向量(IV),即使纯文本相同,也产生不同的密文。 CBC可能不是您可用的最安全的模式(参见下面的AEAD);还有许多具有不同安全属性的其他模式,但它们都使用类似的随机输入。在任何情况下,每个加密操作的输出是初始化向量的密文and

/* Encrypt the message. */
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secret);
AlgorithmParameters params = cipher.getParameters();
byte[] iv = params.getParameterSpec(IvParameterSpec.class).getIV();
byte[] ciphertext = cipher.doFinal("Hello, World!".getBytes("UTF-8"));

存储ciphertextiv。在解密时,使用相同盐和迭代参数的密码,以完全相同的方式重新生成SecretKey。使用此密钥and初始化密码,存储消息的初始化向量:

/* Decrypt the message, given derived key and initialization vector. */
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, secret, new IvParameterSpec(iv));
String plaintext = new String(cipher.doFinal(ciphertext), "UTF-8");
System.out.println(plaintext);

Java 7包含了对AEAD加密模式的API支持,OpenJDK和Oracle发行版中提供的“SunJCE”提供程序以Java 8开始实现。强烈推荐使用其中一种模式代替CBC;它将保护数据的完整性及其隐私。
带有消息“非法密钥大小或默认参数”的java.security.InvalidKeyException意味着密码强度is受限;无限制的权限策略文件不在正确的位置。在JDK中,它们应放在${jdk}/jre/lib/security
根据问题描述,看起来策略文件没有正确安装。系统可以轻松拥有多个Java运行时;仔细检查以确保使用正确的位置。

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Java 256-bit AES Password-Based Encryption

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

6 + 4 =