Шифрование между Android и C # - PullRequest
       0

Шифрование между Android и C #

7 голосов
/ 09 декабря 2010

Я использую следующий исходный код C # для шифрования простого текста с использованием AES (ECB 256):

public static string Encode(string PlainText)
{
 byte[] Key = ASCIIEncoding.UTF8.GetBytes("12345678901234567890123456789012");
 string encrypted = null;


 RijndaelManaged rj = new RijndaelManaged();
 rj.BlockSize = 256;
 rj.KeySize = 256;
 rj.Key = Key;
 rj.GenerateIV();

 byte[] IV  = rj.IV;
 rj.Mode    = CipherMode.ECB;
 rj.Padding = PaddingMode.Zeros;

 try
 {
  using (MemoryStream ms = new MemoryStream())
  {
   using (CryptoStream cs = new CryptoStream(ms, rj.CreateEncryptor(Key, IV), CryptoStreamMode.Write))
   {
    using (StreamWriter sw = new StreamWriter(cs))
    {
     sw.Write(PlainText);
     sw.Close();
     sw.Dispose();
    }

    cs.Close();
    cs.Dispose();
   }

   byte[] encryptArray = ms.ToArray();

   encrypted = (Convert.ToBase64String(encryptArray));

   ms.Close();
   ms.Dispose();
  }
 }
 catch (Exception ex)
 {
  throw ex;
 }

 finally
 {
  rj.Clear();
 }

 return encrypted;
}

И мне нужно расшифровать / зашифровать данные по тому же алгоритму, но я не знаю, как.

Здесь мой класс Java ( не работает ):

 public static String encrypt(byte[] key, String cleartext, boolean base64) throws Exception
 {
  byte[] rawKey   = key;
  byte[] result   = encrypt(rawKey, cleartext.getBytes());

  // Base 64
  if (base64)
   return toBase64(result);

  // Hex
  return toHex(result);
 }

 public static String decrypt(byte[] key, String encrypted)
   throws Exception
 {
  byte[] rawKey = key;
  byte[] enc    = toByte(encrypted);
  byte[] result = decrypt(rawKey, enc);

  return new String(result);
 }

 private static byte[] encrypt(byte[] raw, byte[] clear) throws Exception
 {
  SecretKeySpec skeySpec          = new SecretKeySpec(raw, "AES");
  Cipher cipher                   = Cipher.getInstance("AES/ECB/NoPadding");

  cipher.init(Cipher.ENCRYPT_MODE, skeySpec);

  byte[] encrypted = cipher.doFinal(clear);

  return encrypted;
 }

Java-вызов:

encrypt("12345678901234567890123456789012".getBytes(), "Example Message", true);

Я не знаю, как выбрать размер блока или PaddingMode.Zeros в Java.

¿Есть идеи?

Заранее спасибо

Ответы [ 3 ]

3 голосов
/ 10 декабря 2010

Да, проблема заключается в ограничении 128 битов размера блока в AES (см. * Сильная и неограниченная криптография ').

Наконец, я использовал GNU Crypto , и это работает !. Я импортировал весь исходный код и удалил код, который не использую.

Если кто-то хочет очистить исходный код , он должен только спросить меня.

Спасибо за помощь.

2 голосов
/ 17 января 2011

Вы также должны рассмотреть Bouncy Castle, он доступен как для C #, так и для Java.

1 голос
/ 09 декабря 2010

Читая более этой статьи, кажется, вам может понадобиться использовать версию Java, которая позволяет использовать криптографию неограниченной силы, чтобы вы могли использовать ключи больших размеров (AES-192 и AES-256).Они намеренно ограничивают длины ключей, которые могут использоваться по умолчанию, из-за ограничений контроля импорта, наложенных некоторыми странами.См. Раздел «Криптография с сильной и неограниченной силой» для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...