无效的AES密钥长度:java中为12个字节

问题描述

按照给定的步骤,我已经执行了加密,但是出现错误

  1. 生成一个16位随机数(会话密钥)。说RANDOMNORANDOMNO = 1111222233334444
  2. 使用RSA / ECB / PKCS1Padding加密RANDOMNO并使用Base64进行编码。说ENCR_KEYENCR_KEY = B64Encode(RSA/ECB/PKCS1Encryption(RANDOMNO,ICICIPubKey.cer))
  3. 使用RANDOMNO作为密钥和初始化集对请求有效负载执行AES / CBC / PKCS5Padding加密。说ENCR_DATAENCR_DATA = B64Encode(AES/CBC/PKCS5Padding(REQUEST_DATA,RANDOMNO,IV))
  4. 现在,客户端可以从以下两个选项之一中选择在请求中发送IV。 在“ iv”标签中发送Base64编码的IV。
  public  byte[] generaterandomBytes() {
          SecureRandom ng=new SecureRandom();
          byte[] randomBytes=new byte[16];
          ng.nextBytes(randomBytes);
          return randomBytes;
        }

//new method for encryption -we need to check
 public  String encryptRandomKeyWithCertificate(byte[] randomNumber) throws BadPaddingException,IllegalBlockSizeException,InvalidKeyException,NoSuchPaddingException,NoSuchAlgorithmException,FileNotFoundException,CertificateException {

    //step2: encrypt the random number with certificate
    FileInputStream fin = new FileInputStream("D:\\cedge_uat\\ICICIUATpubliccert.cer");
    CertificateFactory f = CertificateFactory.getInstance("X.509");
    X509Certificate certificate = (X509Certificate) f.generateCertificate(fin);
    PublicKey publicKey = certificate.getPublicKey();
    Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
    cipher.init(Cipher.ENCRYPT_MODE,publicKey);
    byte[] cipherData = cipher.doFinal(randomNumber);
    String encodedData = Base64.getEncoder().encodetoString(cipherData);
    return encodedData;
}

public  String encryptRequestWithKey(String text,byte[] randomNumber) throws Exception {

    //step3: encrypt the requestString with randomkeyEncrypted
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    BASE64Decoder decoder = new BASE64Decoder();
    SecretKeySpec keySpec = new SecretKeySpec(randomNumber,"AES");
    IvParameterSpec ivSpec = new IvParameterSpec(new byte[16]);
    cipher.init(Cipher.ENCRYPT_MODE,keySpec,ivSpec);
    byte[] cipherData = cipher.doFinal(text.getBytes());
    // BASE64Encoder encoder = new BASE64Encoder();
    //return encoder.encode(cipherData).replaceAll("[\r\n]+","");
    String encodedData = Base64.getEncoder().encodetoString(cipherData);
    return encodedData;
}

      
public static void main(String[] args) throws IOException {
    
    String requestString = "CORP_USER=";
    byte[] randomNumber;
    String encryptedKey;
    try {
        randomNumber=encryption.generaterandomBytes();
        encryptedKey = encryption.encryptRandomKeyWithCertificate(randomNumber);
        String encryptedData =encryption.encryptRequestWithKey(requestString,randomNumber);
    } catch (Exception e) {
        // Todo Auto-generated catch block
        e.printstacktrace();
    }
}

解决方法

根据AES encryption上的Wikipedia页面,AES密钥可以为128、192或256位;例如,即16、24或32个字节。

您提供的密钥的大小取决于生成的“随机”数字字符串。看起来它将介于1到19位数字之间,并带有可能的符号。当您在该字符串上调用Index | Line Item | Insertion Order | Creative Type _________________________________________________________________________________________________ 1 | blbl 33 dEs '300x600' Q3 | hello 444 | RISING STARS 2 | QQQ4 Hello trueview Apple | something 68793274 | VIDEO 3 | A useless string | pre-roll Video <10 tttt 89 CASIO | VIDEO 4 | Something not in dict | Neither here | NaN 时,您将获得一个字节数组,其范围在1到20个字节之间。通常,这不是AES可接受的密钥大小之一。

您应该做的是使用getBytes()并为AES提供三个可接受的密钥大小之一的字节数组。