Android和C之间的加密#

前端之家收集整理的这篇文章主要介绍了Android和C之间的加密#前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我使用以下C#源代码使用AES(ECB 256)加密纯文本:
  1. public static string Encode(string PlainText)
  2. {
  3. byte[] Key = ASCIIEncoding.UTF8.GetBytes("12345678901234567890123456789012");
  4. string encrypted = null;
  5.  
  6.  
  7. RijndaelManaged rj = new RijndaelManaged();
  8. rj.BlockSize = 256;
  9. rj.KeySize = 256;
  10. rj.Key = Key;
  11. rj.GenerateIV();
  12.  
  13. byte[] IV = rj.IV;
  14. rj.Mode = CipherMode.ECB;
  15. rj.Padding = PaddingMode.Zeros;
  16.  
  17. try
  18. {
  19. using (MemoryStream ms = new MemoryStream())
  20. {
  21. using (CryptoStream cs = new CryptoStream(ms,rj.CreateEncryptor(Key,IV),CryptoStreamMode.Write))
  22. {
  23. using (StreamWriter sw = new StreamWriter(cs))
  24. {
  25. sw.Write(PlainText);
  26. sw.Close();
  27. sw.Dispose();
  28. }
  29.  
  30. cs.Close();
  31. cs.Dispose();
  32. }
  33.  
  34. byte[] encryptArray = ms.ToArray();
  35.  
  36. encrypted = (Convert.ToBase64String(encryptArray));
  37.  
  38. ms.Close();
  39. ms.Dispose();
  40. }
  41. }
  42. catch (Exception ex)
  43. {
  44. throw ex;
  45. }
  46.  
  47. finally
  48. {
  49. rj.Clear();
  50. }
  51.  
  52. return encrypted;
  53. }

我需要通过相同的算法解密/加密数据,但我不知道如何.

这是我的Java类(不工作):

  1. public static String encrypt(byte[] key,String cleartext,boolean base64) throws Exception
  2. {
  3. byte[] rawKey = key;
  4. byte[] result = encrypt(rawKey,cleartext.getBytes());
  5.  
  6. // Base 64
  7. if (base64)
  8. return toBase64(result);
  9.  
  10. // Hex
  11. return toHex(result);
  12. }
  13.  
  14. public static String decrypt(byte[] key,String encrypted)
  15. throws Exception
  16. {
  17. byte[] rawKey = key;
  18. byte[] enc = toByte(encrypted);
  19. byte[] result = decrypt(rawKey,enc);
  20.  
  21. return new String(result);
  22. }
  23.  
  24. private static byte[] encrypt(byte[] raw,byte[] clear) throws Exception
  25. {
  26. SecretKeySpec skeySpec = new SecretKeySpec(raw,"AES");
  27. Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
  28.  
  29. cipher.init(Cipher.ENCRYPT_MODE,skeySpec);
  30.  
  31. byte[] encrypted = cipher.doFinal(clear);
  32.  
  33. return encrypted;
  34. }

Java调用

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

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

任何的想法?

提前致谢

解决方法

是的,问题是AES中128位块大小的限制(参见“强对比无限强度加密”).

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

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

谢谢您的帮助.

猜你在找的Android相关文章