问题描述
我开发一个Android应用程序,它消耗WS。
对于在Android应用程序和WebService之间的信息交换,您必须使用256位密钥的算法加密/解密的Rijndael。
I am developing an Android application that consumes a WS.For exchange of information between the android application and WebService, you must use the algorithm encryption / decryption Rijndael with 256 bit key.
也就是说,从WS返回的所有信息,都将被加密,所以我使用的算法进行解密。
That is, all the information returned from the WS, will be encrypted, so I decrypts them using the algorithm.
同样,所有我发送到WS的信息进行加密。因此,我将使用的加密算法。
Likewise, all the information I send to WS should be encrypted. Therefore, I will use the encryption algorithm.
我还没有发现的Rijndael准备在Android平台上使用。但我在C#中相同的算法。
I have not found the Rijndael ready to be used in the android platform. But I have the same algorithm in C #.
public class KeydKey
{
public KeydKey()
{
}
#region Metodos de Criptografia
#region key
public string key(string vstrTextToBeEncrypted, string vstrEncryptionKey)
{
byte[] bytValue;
byte[] bytKey;
byte[] bytEncoded;
byte[] bytIV = { 121, 241, 10, 1, 132, 74, 11, 39, 255, 91, 45, 78, 14, 211, 22, 62 };
int intLength;
int intRemaining;
MemoryStream objMemoryStream = new MemoryStream();
CryptoStream objCryptoStream;
RijndaelManaged objRijndaelManaged;
//O valor deve estar dentro da tabela ASCII (i.e., no DBCS chars)
bytValue = Encoding.UTF32.GetBytes(vstrTextToBeEncrypted.ToCharArray());
intLength = vstrEncryptionKey.Length;
/*
******A chave cifrada será de 256 bits long (32 bytes)
****** Se for maior que 32 bytes então será truncado.
****** Se for menor que 32 bytes será alocado.
****** Usando upper-case Xs
*/
if (intLength >= 32)
{
vstrEncryptionKey = vstrEncryptionKey.Substring(0, 32);
}
else
{
intLength = vstrEncryptionKey.Length;
intRemaining = 32 - intLength;
string tmp = "";
vstrEncryptionKey = vstrEncryptionKey + tmp.PadRight(intRemaining, 'X');
}
bytKey = Encoding.ASCII.GetBytes(vstrEncryptionKey.ToCharArray());
objRijndaelManaged = new RijndaelManaged();
/* ****** Cria o valor a ser crifrado e depois escreve
****** Convertido em uma disposição do byte
*/
try
{
objCryptoStream = new CryptoStream(objMemoryStream, objRijndaelManaged.CreateEncryptor(bytKey, bytIV), CryptoStreamMode.Write);
objCryptoStream.Write(bytValue, 0, bytValue.Length);
objCryptoStream.FlushFinalBlock();
bytEncoded = objMemoryStream.ToArray();
objMemoryStream.Close();
objCryptoStream.Close();
return Convert.ToBase64String(bytEncoded);
}
catch (Exception ex)
{
return null;
}
}
#endregion
#region dkey
public string dkey(string vstrstringToBeDecrypted, string vstrDecryptionKey)
{
byte[] bytDataToBeDecrypted;
byte[] bytTemp = new byte[0];
byte[] bytIV = { 121, 241, 10, 1, 132, 74, 11, 39, 255, 91, 45, 78, 14, 211, 22, 62 };
MemoryStream objMemoryStream = new MemoryStream();
CryptoStream objCryptoStream;
RijndaelManaged objRijndaelManaged;
byte[] bytDecryptionKey;
int intLength;
int intRemaining;
string strReturnstring = string.Empty;
//Convert base64 cifrada para byte array
bytDataToBeDecrypted = Convert.FromBase64String(vstrstringToBeDecrypted);
intLength = vstrDecryptionKey.Length;
/*
******A chave cifrada será de 256 bits long (32 bytes)
****** Se for maior que 32 bytes então será truncado.
****** Se for menor que 32 bytes será alocado.
****** Usando upper-case Xs
*/
if (intLength >= 32)
{
vstrDecryptionKey = vstrDecryptionKey.Substring(0, 32);
}
else
{
intLength = vstrDecryptionKey.Length;
intRemaining = 32 - intLength;
string tmp = "";
vstrDecryptionKey = vstrDecryptionKey + tmp.PadRight(intRemaining, 'X');
}
bytDecryptionKey = Encoding.ASCII.GetBytes(vstrDecryptionKey.ToCharArray());
objRijndaelManaged = new RijndaelManaged();
Array.Resize(ref bytTemp, bytDataToBeDecrypted.Length);
objMemoryStream = new MemoryStream(bytDataToBeDecrypted);
try
{
objCryptoStream = new CryptoStream(objMemoryStream, objRijndaelManaged.CreateDecryptor(bytDecryptionKey, bytIV), CryptoStreamMode.Read);
objCryptoStream.Read(bytTemp, 0, bytTemp.Length);
//objCryptoStream.FlushFinalBlock();
objMemoryStream.Close();
objCryptoStream.Close();
return Encoding.UTF32.GetString(bytTemp).Replace("\0", "");
}
catch (Exception ex)
{
return null;
}
}
#endregion
#endregion
}
有人告诉我在哪里可以下载Android的算法?或者帮我翻译,我有Java的算法?
Someone tell me where I can get the algorithm for android? Or help me translate the algorithm that I have Java?
感谢您!
推荐答案
Cipher.getInstance(AES / CBC / PKCS5Padding)
应该做的伎俩。你将不得不匹配(字符)-encodings,你可以使用 SecretKeySpec(字节[32])
以创建一个256位的AES密钥。
Cipher.getInstance("AES/CBC/PKCS5Padding")
should do the trick. You will have to match (character)-encodings and you may use SecretKeySpec(byte[32])
to create a 256 bit AES key.
这篇关于使用Rijndael算法在Android上使用256位密钥加密/解密的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!