如何找到与我的 C# 代码兼容的 Android 加密库或类

本文关键字:Android 加密 何找 我的 代码 | 更新日期: 2023-09-27 18:34:17

我在 C# .net 中使用以下类进行数据加密。Java android 中用于在 android 和 Web 服务之间传输数据的等效库或算法是什么?

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Security.Cryptography;
using System.IO;
using System.Text;
/// <summary>
/// Summary description for Crypto
/// </summary>
public enum SymmProvEnum : int
        {
            DES, RC2, Rijndael
        }
public class Crypto
{
    string Globalkey = "test";
        private SymmetricAlgorithm mobjCryptoService;
        /// <remarks>
        /// Constructor for using an intrinsic .Net SymmetricAlgorithm class.
        /// </remarks>
        public Crypto()
        {
            //switch (NetSelected)
            //{
            //    case SymmProvEnum.DES:
            //        mobjCryptoService = new DESCryptoServiceProvider();
            //        break;
            //    case SymmProvEnum.RC2:
            //        mobjCryptoService = new RC2CryptoServiceProvider();
            //        break;
            //    case SymmProvEnum.Rijndael:
            //        mobjCryptoService = new RijndaelManaged();
            //        break;
            //}
            mobjCryptoService = new RijndaelManaged();
        }
        /// <remarks>
        /// Constructor for using a customized SymmetricAlgorithm class.
        /// </remarks>
        //public Crypto(SymmetricAlgorithm ServiceProvider)
        //{
        //    mobjCryptoService = ServiceProvider;
        //}
        /// <remarks>
        /// Depending on the legal key size limitations of a specific CryptoService provider
        /// and length of the private key provided, padding the secret key with space character
        /// to meet the legal size of the algorithm.
        /// </remarks>
        private byte[] GetLegalKey(string Key)
        {
            string key = Globalkey;
            string sTemp;
            if (mobjCryptoService.LegalKeySizes.Length > 0)
            {
                int lessSize = 0, moreSize = mobjCryptoService.LegalKeySizes[0].MinSize;
                // key sizes are in bits
                while (Key.Length * 8 > moreSize)
                {
                    lessSize = moreSize;
                    moreSize += mobjCryptoService.LegalKeySizes[0].SkipSize;
                }
                sTemp = Key.PadRight(moreSize / 8, ' ');
            }
            else
                sTemp = Key;
            // convert the secret key to byte array
            return ASCIIEncoding.ASCII.GetBytes(sTemp);
        }
        public string Encrypt(string Source)
        {
            string Key = Globalkey;
            byte[] bytIn = System.Text.ASCIIEncoding.ASCII.GetBytes(Source);
            // create a MemoryStream so that the process can be done without I/O files
            System.IO.MemoryStream ms = new System.IO.MemoryStream();
            byte[] bytKey = GetLegalKey(Key);
            // set the private key
            mobjCryptoService.Key = bytKey;
            mobjCryptoService.IV = bytKey;
            // create an Encryptor from the Provider Service instance
            ICryptoTransform encrypto = mobjCryptoService.CreateEncryptor();
            // create Crypto Stream that transforms a stream using the encryption
            CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Write);
            // write out encrypted content into MemoryStream
            cs.Write(bytIn, 0, bytIn.Length);
            cs.FlushFinalBlock();
            // get the output and trim the ''0' bytes
            byte[] bytOut = ms.GetBuffer();
            int i = 0;
            for (i = 0; i < bytOut.Length; i++)
                if (bytOut[i] == 0)
                    break;
            // convert into Base64 so that the result can be used in xml
            return System.Convert.ToBase64String(bytOut, 0, i);
        }
        public string Decrypt(string Source)
        {
            string Key = Globalkey;
            // convert from Base64 to binary
            byte[] bytIn = System.Convert.FromBase64String(Source);
            // create a MemoryStream with the input
            System.IO.MemoryStream ms = new System.IO.MemoryStream(bytIn, 0, bytIn.Length);
            byte[] bytKey = GetLegalKey(Key);
            // set the private key
            mobjCryptoService.Key = bytKey;
            mobjCryptoService.IV = bytKey;
            // create a Decryptor from the Provider Service instance
            ICryptoTransform encrypto = mobjCryptoService.CreateDecryptor();
            // create Crypto Stream that transforms a stream using the decryption
            CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Read);
            // read out the result from the Crypto Stream
            System.IO.StreamReader sr = new System.IO.StreamReader( cs );
            return sr.ReadToEnd();
        }
}

如何找到与我的 C# 代码兼容的 Android 加密库或类

我写了一个加密类,在正确的配置下,它应该可以与您的代码一起使用。

你可以在这里查看: https://github.com/Untouchab1e/yubinotes/blob/master/Android/src/com/connectutb/yubinotes/util/Crypto.java

您在示例中使用了 DES,这是一种有缺陷且过时的算法(或者使用 3DES(,因此我建议迁移到提供更好的加密的 AES。

AES由Android和C#支持。

下面是使用 AES 的加密示例:

SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, keySpec);
byte[] encrypted = cipher.doFinal(clearTextBytes);

以下是有关 Android Cipher 类的更多文档:http://developer.android.com/reference/javax/crypto/Cipher.html

希望这对:)有所帮助