如何正确使用“ PBEWithHmacSHA512AndAES_256”算法?

我正在做一些Java加密,无法找到正确使用PBEWithHmacSHA512AndAES_256算法的方法。

加密似乎可以正常工作,但是我无法正确初始化解密密码。

下面是演示该问题的简短程序。特别是,请参见“问题”注释。

注意:我已经看到了这个非常有用的答案,并且可以使用该方案使事情正常进行,但是我很想知道我在这里做错了什么。

import java.nio.charset.StandardCharsets;

import javax.crypto.Cipher;

import javax.crypto.SecretKey;

import javax.crypto.SecretKeyFactory;

import javax.crypto.spec.IvParameterSpec;

import javax.crypto.spec.PBEKeySpec;

import javax.crypto.spec.PBEParameterSpec;

public final class CryptQuestion {

private static final String ALGORITHM = "PBEWithHmacSHA512AndAES_256";

private static final int ITERATIONS = 1000; // Aside: not sure what is a good number, here.

public static void main(final String[] args) throws Exception {

final String message = "This is the secret message... BOO!";

System.out.println("Original : " + message);

final byte[] messageBytes = message.getBytes(StandardCharsets.US_ASCII);

final String password = "some password";

final byte[] salt = "would be random".getBytes(StandardCharsets.US_ASCII);

// Create the Key

final SecretKeyFactory factory = SecretKeyFactory.getInstance(ALGORITHM);

final PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray(), salt, ITERATIONS);

SecretKey key = factory.generateSecret(keySpec);

// Build the encryption cipher.

final Cipher cipherEncrypt = Cipher.getInstance(ALGORITHM);

cipherEncrypt.init(Cipher.ENCRYPT_MODE, key);

// Encrypt!

final byte[] ciphertext = cipherEncrypt.doFinal(messageBytes);

final byte[] iv = cipherEncrypt.getIV();

// Now for decryption... The receiving end will have as input:

// * ciphertext

// * IV

// * password

// * salt

// We just re-use 'key' from above, since it will be identical.

final PBEParameterSpec pbeParamSpec = new PBEParameterSpec(salt, ITERATIONS);

final IvParameterSpec ivParamSpec = new IvParameterSpec(iv);

// Build the decryption cipher.

final Cipher cipherDecrypt = Cipher.getInstance(ALGORITHM);

// PROBLEM: If I pass "ivParamSpec", I get "java.security.InvalidAlgorithmParameterException: Wrong parameter type: PBE expected"

// Whereas if I pass pbeParamSpec, I get "java.security.InvalidAlgorithmParameterException: Missing parameter type: IV expected"

// What to do?

cipherDecrypt.init(

Cipher.DECRYPT_MODE,

key,

ivParamSpec

//pbeParamSpec

);

final String decrypted = new String(

cipherDecrypt.doFinal(ciphertext),

StandardCharsets.US_ASCII);

System.out.println("Decrypted: " + decrypted);

}

}

回答:

// PROBLEM: If I pass “ivParamSpec”, I get “java.security.InvalidAlgorithmParameterException: Wrong parameter type: PBE expected”

// Whereas if I pass pbeParamSpec, I get “java.security.InvalidAlgorithmParameterException: Missing parameter type: IV expected”

// What to do?

cipherDecrypt.init(

Cipher.DECRYPT_MODE,

key,

ivParamSpec

//pbeParamSpec

);

使用AlgorithmParameters来自加密的Cipher

cipherDecrypt.init(

Cipher.DECRYPT_MODE,

key,

cipherEncrypt.getParameters()

);

如果您想要一种不涉及cipherEncrypt解密站点的更简洁的方法,请将算法参数另存为字节,然后将其与密钥数据一起传输:

byte[]  algorithmParametersEncoded = cipherEncrypt.getParameters().getEncoded();

并在解密站点将其重建:

AlgorithmParameters algorithmParameters = AlgorithmParameters.getInstance(ALGORITHM);

algorithmParameters.init(algorithmParametersEncoded);

algorithmParameters用作上述parameters参数Cipher.init()

以上是 如何正确使用“ PBEWithHmacSHA512AndAES_256”算法? 的全部内容, 来源链接: utcz.com/qa/406524.html

回到顶部