AES密钥长度无效:39字节

时间:2015-01-23 20:25:26

标签: java aes cryptoapi

我是java的新手。我正在对视频文件进行加密和解密。当我提供一个小长度的密钥时,它可以正常工作而没有任何错误。如果我给出了更长的密钥,则会抛出错误。

private static void doCrypto(int cipherMode, String key, File inputFile,
        File outputFile) throws CryptoException {
    try {    
        Key secretKey = new SecretKeySpec(key.getBytes(), "AES");
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(cipherMode, secretKey);         
        FileInputStream inputStream = new FileInputStream(inputFile);

        byte[] inputBytes = new byte[(int) inputFile.length()];
        inputStream.read(inputBytes);

        byte[] outputBytes = cipher.doFinal(inputBytes);

        FileOutputStream outputStream = new FileOutputStream(outputFile);
        outputStream.write(outputBytes);            
        inputStream.close();
        outputStream.close();

    } catch(NoSuchPaddingException|NoSuchAlgorithmException|InvalidKeyException | BadPaddingException| IllegalBlockSizeException | IOException ex) {
        throw new CryptoException("Error encrypting/decrypting file",ex);
    }

我收到的错误是:java.security.InvalidKeyException: Invalid AES key length: 39 bytes

请帮我修复以下代码中的错误

1 个答案:

答案 0 :(得分:0)

您需要使用支持长度的特定密钥,这意味着您的密钥必须是

  • 128位
  • 192位
  • 256位
  • ...

长。你的(见错误信息)只有39个字节长。

所以你需要将String(密钥)(或更好的hash之前的密钥)转换为byte的数组并取第一个n(其中n是其中之一)超出它的byte值。

import java.security.*;

byte[] bytesOfMessage = key.getBytes("UTF-8");
MessageDigest md = MessageDigest.getInstance("SHA-256");
byte[] b = md.digest(bytesOfMessage); //Returns the SHA 256 hash and converts it into byte
// Continue with your code
Key secretKey = new SecretKeySpec(b , "AES");
...