using System;
using Org.BouncyCastle.Security;
using Org.BouncyCastle.Crypto.Engines;
using Org.BouncyCastle.Crypto.Paddings;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Crypto.Generators;
using Org.BouncyCastle.Crypto.Digests;
using Org.BouncyCastle.Crypto.Modes;
namespace B4XEncryption
{
public static class B4XCipher
{
public static byte[] Decrypt(byte[] Data, String Password)
{
byte[] salt = new byte[8];
byte[] iv = new byte[16];
Array.Copy(Data, 0, salt, 0, 8);
Array.Copy(Data, 8, iv, 0, 16);
Pkcs5S2ParametersGenerator pGen = new Pkcs5S2ParametersGenerator(new Sha1Digest());
byte[] pkcs12PasswordBytes = System.Text.Encoding.UTF8.GetBytes(Password);
pGen.Init(pkcs12PasswordBytes, salt, 1024);
CbcBlockCipher aesCBC = new CbcBlockCipher(new AesEngine());
ParametersWithIV aesCBCParams = new ParametersWithIV(pGen.GenerateDerivedParameters(128), iv);
aesCBC.Init(false, aesCBCParams);
PaddedBufferedBlockCipher aesCipher = new PaddedBufferedBlockCipher(aesCBC,
new Pkcs7Padding());
aesCipher.Init(false, (pGen.GenerateDerivedParameters(128)));
byte[] plainTemp = new byte[aesCipher.GetOutputSize(Data.Length - 24)];
int offset = aesCipher.ProcessBytes(Data, 24, Data.Length - 24, plainTemp, 0);
int last = aesCipher.DoFinal(plainTemp, offset);
byte[] plain = new byte[offset + last];
Array.Copy(plainTemp, 0, plain, 0, plain.Length);
return plain;
}
public static byte[] Encrypt(byte[] Data, String Password)
{
SecureRandom rnd = new SecureRandom();
byte[] salt = new byte[8];
rnd.NextBytes(salt);
byte[] iv = new byte[16];
rnd.NextBytes(iv);
Pkcs5S2ParametersGenerator pGen = new Pkcs5S2ParametersGenerator(new Sha1Digest());
byte[] pkcs12PasswordBytes = System.Text.Encoding.UTF8.GetBytes(Password);
pGen.Init(pkcs12PasswordBytes, salt, 1024);
CbcBlockCipher aesCBC = new CbcBlockCipher(new AesEngine());
ParametersWithIV aesCBCParams = new ParametersWithIV(pGen.GenerateDerivedParameters(128), iv);
aesCBC.Init(true, aesCBCParams);
PaddedBufferedBlockCipher aesCipher = new PaddedBufferedBlockCipher(aesCBC,
new Pkcs7Padding());
aesCipher.Init(true, (pGen.GenerateDerivedParameters(128)));
byte[] plainTemp = new byte[aesCipher.GetOutputSize(Data.Length)];
int offset = aesCipher.ProcessBytes(Data, 0, Data.Length, plainTemp, 0);
int last = aesCipher.DoFinal(plainTemp, offset);
byte[] plain = new byte[offset + last + 24];
Array.Copy(salt, 0, plain, 0, 8);
Array.Copy(iv, 0, plain, 8, 16);
Array.Copy(plainTemp, 0, plain, 24, offset + last);
return plain;
}
}
}