Я ищу реализацию шифрования AES в Java, аналогичном тому, что я написал в C#. Вот мое шифрование AES в C#:
public class MyCrypto
{
private const string AesIV = @"1234567812345678";
private const string AesKey = @"4566789945667899";
public MyCrypto()
{
}
public String Encrypt(String txt)
{
return EncryptCBC(txt);
}
public String Decrypt(String txt)
{
return DecryptCBC(txt);
}
public static byte[] EncryptToBytesCBC(string toEncrypt)
{
byte[] src = Encoding.UTF8.GetBytes(toEncrypt);
byte[] dest = new byte[src.Length];
using (var aes = new AesCryptoServiceProvider())
{
aes.BlockSize = 128;
aes.KeySize = 128;
aes.IV = Encoding.UTF8.GetBytes(AesIV);
aes.Key = Encoding.UTF8.GetBytes(AesKey);
aes.Mode = CipherMode.CBC;
aes.Padding = PaddingMode.Zeros;
// encryption
using (ICryptoTransform encrypt = aes.CreateEncryptor(aes.Key, aes.IV))
{
return encrypt.TransformFinalBlock(src, 0, src.Length);
}
}
}
public static string EncryptCBC(string toEncrypt)
{
return Convert.ToBase64String(EncryptToBytesCBC(toEncrypt));
}
public static String DecryptToBytesCBC(byte[] toDecrypt)
{
byte[] src = toDecrypt;
byte[] dest = new byte[src.Length];
using (var aes = new AesCryptoServiceProvider())
{
aes.BlockSize = 128;
aes.KeySize = 128;
aes.IV = Encoding.UTF8.GetBytes(AesIV);
aes.Key = Encoding.UTF8.GetBytes(AesKey);
aes.Mode = CipherMode.CBC;
aes.Padding = PaddingMode.Zeros;
// decryption
using (ICryptoTransform decrypt = aes.CreateDecryptor(aes.Key, aes.IV))
{
byte[] decryptedText = decrypt.TransformFinalBlock(src, 0, src.Length);
return Encoding.UTF8.GetString(decryptedText);
}
}
}
public static string DecryptCBC(string toDecrypt)
{
return DecryptToBytesCBC(Convert.FromBase64String(toDecrypt));
}
}
Мой код Android / java:
public String encrypt(String value)
{
String initVector = "1234567812345678";
String key = "4566789945667899";
String res = "";
try
{
IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
javax.crypto.Cipher cipher = javax.crypto.Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, iv);
byte[] encrypted = cipher.doFinal(value.getBytes());
res = android.util.Base64.encodeToString(encrypted,0);
}
catch (Exception ex)
{
Crashlytics.logException(ex);
}
return res;
}
, но оба (C# и Java) дают мне два разных результата шифрования. Я использую мой код c# в качестве справочного, потому что этот код соответствует шифрованию нашей базы данных. Любая помощь высоко ценится. Спасибо