[英]Encryption / Decryption using Rijndael with key 256bit on Android
我正在开发使用WS的Android应用程序。 为了在android应用程序和WebService之间交换信息,您必须使用带有256位密钥的Rijndael加密/解密算法。
也就是说,将从WS返回的所有信息都将被加密,因此我使用该算法对其进行解密。
同样,我发送给WS的所有信息都应加密。 因此,我将使用加密算法。
我尚未发现Rijndael准备在android平台中使用。 但是我在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的算法?
谢谢!
Cipher.getInstance("AES/CBC/PKCS5Padding")
应该可以解决问题。 您将必须匹配(字符)编码,并且可以使用SecretKeySpec(byte[32])
创建256位AES密钥。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.