我正在编写一个使用AES(ECB)模式加密和解密数据的应用程序。 黑莓代码的加密数据通过php代码成功解密。 但问题是,当我从php获取加密文本时,我无法用黑莓代码解密它。即使我没有任何例外。
这是我加密和解密文本的代码。
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;
}
提前感谢..
答案 0 :(得分:3)
这是接受密钥和加密数据(以字节数组的形式)并以字节数组的形式返回解密数据的方法:
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的默认编码),则第二个构造函数非常有用。
<强>更新
事实证明,您不在服务器端使用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)));
答案 1 :(得分:1)
当您调用解密功能时,如何将密文转换为字节[]?