有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在Java中解密defuse/phpencryption Crypto::encryptWithPassword()

我有一个PHP应用程序,它在MySQL数据库中存储一些敏感信息。为了保护这些信息,我使用defuse/php-encryption库的Crypto::encryptWithPassword()方法如下:

<?php

// ... get sensitive data from user ...

$encrypted = base64_encode(Crypto::encryptWithPassword($sensitive, $password, true));

// ... store that data in database ...

我还有另一个Java应用程序需要访问这些信息。然而,我不知道如何从Java中解密。以下是我尝试过的代码:

byte[] encrypted = DB.getThatEncryptedData();
byte[] salt = Arrays.copyOfRange(encrypted, 4, 35);

String password = SomewhereSafe.getThePassword();
KeySpec spec = new PBEKeySpec(password.toCharArray(), salt, 100000, 32);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
SecretKey secret = keyFactory.generateSecret(spec);

Cipher c = Cipher.getInstance("AES/CTR/NoPadding");
c.init(Cipher.DECRYPT_MODE, secret);
byte[] decrypted = c.doFinal(encrypted);

然而,当我运行该代码时,我得到了以下错误:

Exception in thread "main" java.security.InvalidKeyException: Invalid AES key length: 4 bytes
    at com.sun.crypto.provider.AESCipher.engineGetKeySize(AESCipher.java:495)
    at javax.crypto.Cipher.passCryptoPermCheck(Cipher.java:1067)
    at javax.crypto.Cipher.checkCryptoPerm(Cipher.java:1025)
    at javax.crypto.Cipher.implInit(Cipher.java:801)
    at javax.crypto.Cipher.chooseProvider(Cipher.java:864)
    at javax.crypto.Cipher.init(Cipher.java:1249)
    at javax.crypto.Cipher.init(Cipher.java:1186)
    at com.example.test.app.Decrypt.main(Decrypt.java:24)

解密这些数据的正确方法是什么


共 (0) 个答案