Отсутствует аргумент при преобразовании RijndaelManaged в java

при преобразовании кода дешифрования .net в java я получил исключение

Exception in thread "main" java.lang.IllegalArgumentException: Missing argument
    at javax.crypto.spec.SecretKeySpec.<init>(DashoA13*..)
    at com.motorola.gst.DecryptTest3.Decrypt(DecryptTest3.java:90)
    at com.motorola.gst.DecryptTest3.main(DecryptTest3.java:36)

ну, я впервые пробую как расшифровку, так и преобразование кода .net в java

вот код .net, который я пытаюсь преобразовать

 private static string Decrypt(string encryptedText, string completeEncodedKey, int keySize)
        {
            RijndaelManaged aesEncryption = new RijndaelManaged();
            aesEncryption.KeySize = keySize;
            aesEncryption.BlockSize = 128;
            aesEncryption.Mode = CipherMode.CBC;
            aesEncryption.Padding = PaddingMode.PKCS7;
            aesEncryption.IV = Convert.FromBase64String(ASCIIEncoding.UTF8.GetString(Convert.FromBase64String(completeEncodedKey)).Split(',')[0]);
            aesEncryption.Key = Convert.FromBase64String(ASCIIEncoding.UTF8.GetString(Convert.FromBase64String(completeEncodedKey)).Split(',')[1]);
            ICryptoTransform decrypto = aesEncryption.CreateDecryptor();
            byte[] encryptedBytes = Convert.FromBase64CharArray(encryptedText.ToCharArray(), 0, encryptedText.Length);
            return ASCIIEncoding.UTF8.GetString(decrypto.TransformFinalBlock(encryptedBytes, 0, encryptedBytes.Length));
        }

Я просмотрел множество сообщений и нашел Расшифровку байтов, зашифрованных с помощью RijndaelManaged от .NET с использованием Java. больше относится к моему делу.

Я последовал за ними и написал свою функцию расшифровки как ::

private static String Decrypt(String encryptedText, String completeEncodedKey,int keySize) {
        //get completeEncodedKey in bytes and then to string
        String decodedcompleteEncodedKey = StringUtils.newStringUtf8(Base64.decodeBase64(completeEncodedKey));
        System.out.println("Decoded completeEncodedKey Key ::  "+decodedcompleteEncodedKey);
        int indexComma = decodedcompleteEncodedKey.indexOf(',');
        System.out.println("COmma Index :: "+indexComma);
        String IV = decodedcompleteEncodedKey.substring(0, indexComma);
        String Key = decodedcompleteEncodedKey.substring(indexComma+1,decodedcompleteEncodedKey.length());
        System.out.println("IV::: "+IV);
        System.out.println("Key::: "+Key);


    byte[] sessionKey = null; 
    byte[] iv = null ; 
    byte[] plaintext = encryptedText.getBytes(); 
    Cipher cipher = null;
    try {
        cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(sessionKey, "AES"), new IvParameterSpec(iv));
        byte[] ciphertext = cipher.doFinal(plaintext);
    } catch (IllegalBlockSizeException e) {
        System.out.println("IllegalBlockSizeException");
        e.printStackTrace();
    } catch (BadPaddingException e) {
        System.out.println("BadPaddingException");
        e.printStackTrace();
    } catch (InvalidKeyException e) {
        System.out.println("InvalidKeyException");
        e.printStackTrace();
    } catch (InvalidAlgorithmParameterException e) {
        System.out.println("InvalidAlgorithmParameterException");
        e.printStackTrace();
    } catch (NoSuchAlgorithmException e) {
        System.out.println("NoSuchAlgorithmException");
        e.printStackTrace();
    } catch (NoSuchPaddingException e) {
        System.out.println("NoSuchPaddingException");
        e.printStackTrace();
    }
    return null;
}

но теперь я получаю исключение в потоке «основной» java.lang.IllegalArgumentException: отсутствует аргумент.

может ли кто-нибудь помочь мне исправить эти ошибки. любая помощь будет оценена. Благодарность!!


person Sinha    schedule 14.10.2012    source источник
comment
Какая строка выдает исключение? Если это строка cipher.init(...), то разбейте ее на отдельные строки, чтобы вы могли точно видеть, какой из трех параметров выбрасывается. Это может быть cipher.init() или один из двух new, которые выбрасываются. Разбейте вещи, чтобы вы могли лучше локализовать ошибку.   -  person rossum    schedule 14.10.2012
comment
Виновником является новый SecretKeySpec(sessionKey, AES)..   -  person Sinha    schedule 14.10.2012
comment
это было из-за byte[] sessionKey = null; но даже если я ставлю byte[] sessionKey = Key.getBytes(); и byte[] iv = IV.getBytes() ; Это не решает мою цель ... любая идея, где я пропал без вести   -  person Sinha    schedule 14.10.2012
comment
Пожалуйста, опубликуйте полную трассировку стека.   -  person Maarten Bodewes    schedule 15.10.2012
comment
Неправильная длина IV: должна быть 16 байтов в com.sun.crypto.provider.SunJCE_f.a(DashoA13*..) в com.sun.crypto.provider.AESCipher.engineInit(DashoA13*..) в javax.crypto. Cipher.a(DashoA13*..) в javax.crypto.Cipher.a(DashoA13*..) в javax.crypto.Cipher.init(DashoA13*..) в javax.crypto.Cipher.init(DashoA13*..) ) на com.motorola.gst.DecryptTest3.Decrypt(DecryptTest3.java:96) на com.motorola.gst.DecryptTest3.main(DecryptTest3.java:39)   -  person Sinha    schedule 15.10.2012


Ответы (1)


Для меня проблема заключалась в том, чтобы позвонить new SecretKeySpec(sessionKey, "AES") с помощью sessionKey = null.

person asherbar    schedule 05.06.2020