无法在黑莓中解密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 []?
- 使用C#进行AES加密和使用Java进行解密
- 实施充气城堡aes 256
- 使用Java中的PBKDF2进行密码validation
- 服务器(Java – Cipher)和客户端之间的AES(Javascript – CryptoJS)
- 如何使用CBC实现Java 256位AES加密
- 用于加密/解密的Java SimpleCrypto类在Coldfusion 9和Java(Android)中产生不同的结果
- javax.crypto.IllegalBlockSizeException:解密时最后一个块不完整 – 解密加密的AES字符串
- 使用AES和Base64编码进行加密和解密
- 为什么在用充气城堡解密后附加这些方形符号?