Я немного застрял в точке, вот сценарий.У нас есть приложение на C #, которое шифрует данные с помощью следующих функций.
private static readonly byte[] iv = new byte[] { 97, 190, 45, 87, 145, 210, 157, 160 };
public static String EncVal(String valueToEncrypt)
{
TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
des.IV = new byte[8];
PasswordDeriveBytes pdb = new PasswordDeriveBytes(iv, new byte[0]);
des.Key = pdb.CryptDeriveKey("RC2", "MD5", 128, new byte[8]);
MemoryStream ms = new MemoryStream(valueToEncrypt.Length * 2);
CryptoStream encStream = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
byte[] plainBytes = Encoding.UTF8.GetBytes(valueToEncrypt);
encStream.Write(plainBytes, 0, plainBytes.Length);
encStream.FlushFinalBlock();
byte[] encryptedBytes = new byte[ms.Length];
ms.Position = 0;
ms.Read(encryptedBytes, 0, (int)ms.Length);
encStream.Close();
return Convert.ToBase64String(encryptedBytes);
}
Я называю это так
static void Main(string[] args)
{
string name = "Test";
string nameEncrypted = Cryptography.EncVal(name);
//I get bfq0D2qnaRc=
}
Теперь я хочу расшифровать это значение в Android
Ниже приводится функция, которую я использую для нее
private static final byte[] IV = new byte[] { 97, (byte)190, 45, 87, (byte)145, (byte)210, (byte)157, (byte)160 };
private static final byte[] key = new byte[] {(byte)213,(byte)219,66,(byte)134,(byte)252,60,114,37,(byte)176,(byte)237,(byte)137,(byte)137,34,(byte)174,94,(byte)132};
public static void main(String[] args) {
// TODO Auto-generated method stub
String decyptedValue = DecodeString("bfq0D2qnaRc="); //=>should get Test, but getting exception here
//
//javax.crypto.BadPaddingException: Given final block not properly padded. Such issues can arise if a bad key is used during decryption.
//
}
public static String DecodeString(String input)
{
try
{
Cipher c = Cipher.getInstance("RC2/CBC/PKCS5Padding");
c.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key, "RC2"), new RC2ParameterSpec(key.length*8, IV, 0));
byte[] decrypted = c.doFinal(Base64.getDecoder().decode(input));
return new String(decrypted, "UTF-8");
}
catch(Exception exp)
{
System.out.println(exp.getMessage());
}
return "";
}
Я получаю следующее исключение javax.crypto.BadPaddingException: Given final block not properly padded. Such issues can arise if a bad key is used during decryption.
Есть идеи?Обратите внимание, что мы не можем изменить код C #, единственный вариант - реализовать код Android / Java.