Android开发-----与C#服务器的DES加密

Android端

加密

/**
 * 加密
 *
 * @param key  密钥, key的长度不能够小于8位字节
 * @param data 原文
 * @return 密文
 */
public static String encode(String key, byte[] data) throws Exception {
    try {
        DESKeySpec dks = new DESKeySpec(key.getBytes());
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
        Key secretKey = keyFactory.generateSecret(dks);
        Cipher cipher = Cipher.getInstance(ALGORITHM_DES);
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        byte[] bytes = cipher.doFinal(data);
        return Base64.encodeToString(bytes, 3);
    } catch (Exception e) {
        throw new Exception(e);
    }
}`

解密

/**
 * 解密
 *
 * @param key 密钥, key的长度不能够小于8位字节
 * @param data 密文
 * @return 明文
 */
public static byte[] decode(String key, byte[] data) throws Exception {
    try {
        DESKeySpec dks = new DESKeySpec(key.getBytes());
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
        Key secretKey = keyFactory.generateSecret(dks);
        Cipher cipher = Cipher.getInstance(ALGORITHM_DES);
        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        return cipher.doFinal(data);
    } catch (Exception e) {
        throw new Exception(e);
    }
}

`

C#端

加密:

/// <summary> /// 加密字符串   
/// </summary>  
/// <param name="str">要加密的字符串</param>  
/// <param name="key">秘钥</param>  
/// <returns>加密后的字符串</returns>  
public static string Encrypt_ECB(string str, string myKey)
{
    string encryptKeyall = Convert.ToString(myKey);    //定义密钥  
    if (encryptKeyall.Length < 9)
    {
        for (; ; )
        {
            if (encryptKeyall.Length < 9)
                encryptKeyall += encryptKeyall;
            else
                break;
        }
    }
    string encryptKey = encryptKeyall.Substring(0, 8);
    DESCryptoServiceProvider descsp = new DESCryptoServiceProvider();
    byte[] key = Encoding.UTF8.GetBytes(encryptKey); //定义字节数组,用来存储密钥 
    byte[] data = Encoding.UTF8.GetBytes(str);//定义字节数组,用来存储要加密的字符串 
    descsp.Key = key;
    descsp.Mode = CipherMode.ECB;
    descsp.Padding = PaddingMode.PKCS7;
    MemoryStream MStream = new MemoryStream(); //实例化内存流对象    
    //使用内存流实例化加密流对象   
    CryptoStream CStream = new CryptoStream(MStream, descsp.CreateEncryptor(key, key), CryptoStreamMode.Write);
    CStream.Write(data, 0, data.Length);  //向加密流中写入数据     
    CStream.FlushFinalBlock();              //释放加密流     
    return Convert.ToBase64String(MStream.ToArray());//返回加密后的字符串  
}

`

解密

/// <summary>
/// ECB解密
/// </summary>
/// <param name="data">解密字符串</param>
/// <param name="key">秘钥</param>
/// <param name="iv">ECB模式不需要IV</param>
/// <returns></returns>

public static string DESDecrypst(string data, string key, string iv)
{

    string encryptKeyall = Convert.ToString(key);    //定义密钥  
    if (encryptKeyall.Length < 9)
    {
        for (; ; )
        {
            if (encryptKeyall.Length < 9)
                encryptKeyall += encryptKeyall;
            else
                break;
        }
    }
    string encryptKey = encryptKeyall.Substring(0, 8);


    DESCryptoServiceProvider mCSP = new DESCryptoServiceProvider();

    mCSP.Key = Encoding.UTF8.GetBytes(encryptKey);
    //  mCSP.IV = Encoding.UTF8.GetBytes(iv);
    mCSP.Mode = CipherMode.ECB;
    mCSP.Padding = PaddingMode.PKCS7;

    ICryptoTransform iCrypto;
    MemoryStream memory;
    CryptoStream crypto;
    byte[] byt;
    iCrypto = mCSP.CreateDecryptor(mCSP.Key, mCSP.IV);

    byt = Convert.FromBase64String(data);
    memory = new MemoryStream();
    crypto = new CryptoStream(memory, iCrypto, CryptoStreamMode.Write);
    crypto.Write(byt, 0, byt.Length);
    crypto.FlushFinalBlock();
    crypto.Close();
    return Encoding.UTF8.GetString(memory.ToArray());
}

`

DES加密模式详解 - slqt - 博客园 (cnblogs.com)

posted @ 2021-10-28 23:37  予有荣焉  阅读(81)  评论(0编辑  收藏  举报