Pracowałem nad projektem, w którym musimy bezpiecznie przechowywać plik PDF na karcie SD. Chcemy to zaszyfrować w .net, ponieważ musi zostać przeniesione przez API. Zaimplementowałem w .NET, ale nie można odszyfrować w systemie Android.Jak zaszyfrować plik w .net i odszyfrować w Androidzie
kod do zaszyfrowania pliku
public static void EncryptFile(string inputFile, string outputFile)
{
try
{
string password = @"myKey123"; // Your Key Here
UnicodeEncoding UE = new UnicodeEncoding();
byte[] key = UE.GetBytes(password);
string cryptFile = outputFile;
FileStream fsCrypt = new FileStream(cryptFile, FileMode.Create);
RijndaelManaged RMCrypto = new RijndaelManaged();
RMCrypto.Mode = CipherMode.CBC; //remember this parameter
RMCrypto.Padding = PaddingMode.PKCS7; //remember this parameter
RMCrypto.KeySize = 0x80;
RMCrypto.BlockSize = 0x80;
CryptoStream cs = new CryptoStream(fsCrypt,
RMCrypto.CreateEncryptor(key, key),
CryptoStreamMode.Write);
FileStream fsIn = new FileStream(inputFile, FileMode.Open);
int data;
while ((data = fsIn.ReadByte()) != -1)
{
cs.WriteByte((byte)data);
}
fsIn.Close();
cs.Close();
fsCrypt.Close();
}
catch
{
Console.WriteLine("Encryption failed!", "Error");
}
}
Kod do odszyfrowania plikowi
public static void DecryptFile(string inputFile, string outputFile)
{
{
string password = @"myKey123"; // Your Key Here
UnicodeEncoding UE = new UnicodeEncoding();
byte[] key = UE.GetBytes(password);
FileStream fsCrypt = new FileStream(inputFile, FileMode.Open);
RijndaelManaged RMCrypto = new RijndaelManaged();
RMCrypto.Mode = CipherMode.CBC; //remember this parameter
RMCrypto.Padding = PaddingMode.PKCS7; //remember this parameter
RMCrypto.KeySize = 0x80;
RMCrypto.BlockSize = 0x80;
CryptoStream cs = new CryptoStream(fsCrypt,
RMCrypto.CreateDecryptor(key, key),
CryptoStreamMode.Read);
FileStream fsOut = new FileStream(outputFile, FileMode.Create);
int data;
while ((data = cs.ReadByte()) != -1)
fsOut.WriteByte((byte)data);
fsOut.Close();
cs.Close();
fsCrypt.Close();
}
}
Próbowałem w Android za pomocą poniższego kodu
public static byte[] decodeFile(String key, byte[] fileData) throws Exception
{
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); //this parameters should not be changed
byte[] keyBytes = new byte[16];
byte[] b = key.getBytes("UTF-16");
System.out.println("RAM"+b);
int len = b.length;
if (len > keyBytes.length)
len = keyBytes.length;
System.arraycopy(b, 0, keyBytes, 0, len);
SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
IvParameterSpec ivSpec = new IvParameterSpec(keyBytes);
cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
byte[] decrypted = cipher.doFinal(fileData);
return decrypted;
}
Po uruchomieniu tego kodu otrzymuję błąd:
error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt
Dwie rzeczy, które wyskakują: 1) nie powinny obcinać tablicy kluczy arbitralnie; 2) PKCS7 jest schematem dopełnienia używanym w kodzie .NET, a PKCS5 w kodzie androida. – dbugger
Zauważyłem również wyściółkę. PKCS5 jest podzbiorem PKCS7, więc nie ma gwarancji, że twój kod odszyfrowujący będzie w stanie go rozszyfrować (może faktycznie działać przez pewien czas, ale może być uznany za fuksa). –
Co można zrobić, aby rozwiązać ten problem. Każdy kod lub biblioteka, która może pomóc – user3036123