c# - Android和C#之间的加密

标签 c# java .net android encryption

我正在使用以下 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);

我不知道如何在 Java 中选择 block 大小或 PaddingMode.Zeros

¿有什么想法吗?

提前致谢

最佳答案

是的,问题是 AES 中128 位 block 大小的限制(请参阅“强与无限强度密码术”)。

最后,我使用了 GNU Crypto它有效!我已导入所有源代码并删除了不使用的代码。

如果有人想要清理过的源代码,他只需问我。

感谢您的帮助。

关于c# - Android和C#之间的加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4398874/

相关文章:

c# - 对象引用未设置为对象 ViewData ["Title"] = "Index"的实例;

c# - 文本框控件更新后 Bindingsource 将不会更新

java - 当接口(interface)不在子类.jar中时导入子类

java - 无法设置 JFrame 布局

.net - MVVM 中的启动逻辑应该放在哪里?

c# - 从 Web 服务反序列化 PHP 数据

c# - 具有多个控件的 WPF 数据绑定(bind)

c# - 根据 GUID 获取站点 URL? (分享点)

c# - 带有泛型的 NUnit 测试用例

java - AWS SDK Java TransferManager 限制下载大小