无法在黑莓中解密AES的php代码密文

我正在编写一个使用AES(ECB)模式加密和解密数据的应用程序。 黑莓代码的加密数据通过php代码成功解密。 但问题是当我从php获取加密文本时我无法使用黑莓代码解密它。即使我没有得到任何exception。

这是我加密和解密文本的代码。

public static byte[] encrypt( byte[] keyData, byte[] data ) throws CryptoException, IOException { // Create the AES key to use for encrypting the data. // This will create an AES key using as much of the keyData // as possible. AESKey key = new AESKey( keyData ); // Now, we want to encrypt the data. // First, create the encryptor engine that we use for the actual // encrypting of the data. AESEncryptorEngine engine = new AESEncryptorEngine( key ); // Since we cannot guarantee that the data will be of an equal block // length we want to use a padding engine (PKCS5 in this case). PKCS5FormatterEngine fengine = new PKCS5FormatterEngine( engine ); // Create a BlockEncryptor to hide the engine details away. ByteArrayOutputStream output = new ByteArrayOutputStream(); BlockEncryptor encryptor = new BlockEncryptor( fengine, output ); encryptor.write( data ); encryptor.close(); output.close(); return output.toByteArray(); } public static String AESDecryption(byte[] keyData,byte[] cipherText, int dataLength ) throws CryptoException, IOException { // Create the input stream based on the ciphertext ByteArrayInputStream in = new ByteArrayInputStream( cipherText, 0, dataLength ); // Now create the block decryptor and pass in a new instance // of an AES decryptor engine with the specified block length BlockDecryptor cryptoStream = new BlockDecryptor(new AESDecryptorEngine( new AESKey( keyData )), in ); byte[] T= new byte[dataLength]; // Read the decrypted text from the AES decryptor stream and // return the actual length read int length= cryptoStream.read( T ); String str= new String(T); return str; } 

提前致谢..

这是接受密钥和加密数据(以字节数组的forms)并以字节数组的forms返回解密数据的方法:

 public static byte[] decrypt(byte[] keyData, byte[] ciphertext) throws CryptoException, IOException { // First, create the AESKey again. AESKey key = new AESKey(keyData); // Now, create the decryptor engine. AESDecryptorEngine engine = new AESDecryptorEngine(key); // Since we cannot guarantee that the data will be of an equal block length // we want to use a padding engine (PKCS5 in this case). PKCS5UnformatterEngine uengine = new PKCS5UnformatterEngine(engine); // Create the BlockDecryptor to hide the decryption details away. ByteArrayInputStream input = new ByteArrayInputStream(ciphertext); BlockDecryptor decryptor = new BlockDecryptor(uengine, input); // Now, read in the data. byte[] temp = new byte[100]; DataBuffer buffer = new DataBuffer(); for (;;) { int bytesRead = decryptor.read(temp); buffer.write(temp, 0, bytesRead); if (bytesRead < 100) { // We ran out of data. break; } } byte[] plaintext = buffer.getArray(); return plaintext; } 

注意加密/解密不直接使用字符串。 它只适用于字节数组。 因此,作为最终操作,您需要使用String(byte[] bytes)String(byte[] bytes, String enc)构造函数将解密的字节数组转换为字符串。 如果您的字符串使用“ISO-8859-1”编码以外的任何编码进行编码(这是BlackBerry的默认编码),则第二个构造函数非常有用。

更新:

事实certificate,您不在服务器端使用PKCS5填充并将加密的字节数据转换为HEX字符串,然后解决方案代码为:

 // this is to convert HEX to bytes public static byte[] convertHexToBytes(String s) { int len = s.length(); byte[] data = new byte[len / 2]; for (int i = 0; i < len; i += 2) { data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + Character.digit(s.charAt(i+1), 16)); } return data; } // this is the same as initial version, but we don't handle PKCS5 padding here public static byte[] decrypt(byte[] keyData, byte[] ciphertext) throws CryptoException, IOException { // First, create the AESKey again. AESKey key = new AESKey(keyData); // Now, create the decryptor engine. AESDecryptorEngine engine = new AESDecryptorEngine(key); // Create the BlockDecryptor to hide the decryption details away. ByteArrayInputStream input = new ByteArrayInputStream(ciphertext); BlockDecryptor decryptor = new BlockDecryptor(engine, input); // Now, read in the data. byte[] temp = new byte[100]; DataBuffer buffer = new DataBuffer(); for (;;) { int bytesRead = decryptor.read(temp); buffer.write(temp, 0, bytesRead); if (bytesRead < 100) { // We ran out of data. break; } } byte[] plaintext = buffer.getArray(); return plaintext; } // and finally :) String key = "1234567890123456"; String encrypted = "48b983c4f1575280d244b74cf689efe5"; byte[] keyBytes = key.getBytes(); byte[] encryptedBytes = convertHexToBytes(encrypted); // displays "nirav bhandari" Dialog.inform(new String(decrypt(keyBytes, encryptedBytes))); 

当您调用解密function时,如何将密文转换为Byte []?