DES加密解密—Android IOS C#互通

       公司项目需要,聊天的时候不想明文传输,需要对话双方各有一个密钥,才能解开发送的密文信息!所以自然而然用到了DES加解密。但是问题随之而来了,我们后台是C#做的,客户端有我们Android和IOS,所以我们之间要相互都能解析才能沟通。所以、就是接下来的解决方法啦!


Android端加解密:

/**
 * 加密
 * @param message  原文
 * @param key    密钥
 * @return
 * @throws Exception
 */
	public static String EncryptAsDoNet(String message, String key)throws Exception {
	    	
	    Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
	    DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8"));
	    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
	    SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
	    IvParameterSpec iv = new IvParameterSpec(key.getBytes("UTF-8"));
	    cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
	    byte[] encryptbyte = cipher.doFinal(message.getBytes());
	    return new String(Base64.encode(encryptbyte, Base64.DEFAULT));
	        
	    }
	
/**
 * 解密
 * @param message 密文
 * @param key   密钥
 * @return
 * @throws Exception
 */
    public static String DecryptDoNet(String message, String key)throws Exception {
    	
        byte[] bytesrc = Base64.decode(message.getBytes(), Base64.DEFAULT);
        Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
        DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8"));
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
        SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
        IvParameterSpec iv = new IvParameterSpec(key.getBytes("UTF-8"));
        cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
        byte[] retByte = cipher.doFinal(bytesrc);
        return new String(retByte);
        
    }
 

 

IOS端加解密:

static const char* encryptWithKeyAndType(const char *text,CCOperation encryptOperation,char *key)
{
    NSString *textString=[[NSString alloc]initWithCString:text encoding:NSUTF8StringEncoding];
    //      NSLog(@"[[item.url description] UTF8String=%@",textString);
    const void *dataIn;
    size_t dataInLength;
    
    if (encryptOperation == kCCDecrypt)//传递过来的是decrypt 解码
    {
        //解码 base64
        NSData *decryptData = [GTMBase64 decodeData:[textString dataUsingEncoding:NSUTF8StringEncoding]];//转成utf-8并decode
        dataInLength = [decryptData length];
        dataIn = [decryptData bytes];
    }
    else  //encrypt
    {
        NSData* encryptData = [textString dataUsingEncoding:NSUTF8StringEncoding];
        dataInLength = [encryptData length];
        dataIn = (const void *)[encryptData bytes];
    }
    
    
    CCCryptorStatus ccStatus;
    uint8_t *dataOut = NULL; //可以理解位type/typedef 的缩写(有效的维护了代码,比如:一个人用int,一个人用long。最好用typedef来定义)
    size_t dataOutAvailable = 0; //size_t  是操作符sizeof返回的结果类型
    size_t dataOutMoved = 0;
    
    dataOutAvailable = (dataInLength + kCCBlockSizeDES) & ~(kCCBlockSizeDES - 1);
    dataOut = malloc( dataOutAvailable * sizeof(uint8_t));
    memset((void *)dataOut, 00, dataOutAvailable);//将已开辟内存空间buffer的首 1 个字节的值设为值 0
    
    //NSString *initIv = @"12345678";
    const void *vkey = key;
    const void *iv = (const void *) key; //[initIv UTF8String];
    
    //CCCrypt函数 加密/解密
    ccStatus = CCCrypt(encryptOperation,//  加密/解密
                       kCCAlgorithmDES,//  加密根据哪个标准(des,3des,aes。。。。)
                       kCCOptionPKCS7Padding,//  选项分组密码算法(des:对每块分组加一次密  3DES:对每块分组加三个不同的密)
                       vkey,  //密钥    加密和解密的密钥必须一致
                       kCCKeySizeDES,//   DES 密钥的大小(kCCKeySizeDES=8)
                       iv, //  可选的初始矢量
                       dataIn, // 数据的存储单元
                       dataInLength,// 数据的大小
                       (void *)dataOut,// 用于返回数据
                       dataOutAvailable,
                       &dataOutMoved);
    
    NSString *result = nil;
    
    if (encryptOperation == kCCDecrypt)//encryptOperation==1  解码
    {
        //得到解密出来的data数据,改变为utf-8的字符串
        result = [[NSString alloc] initWithData:[NSData dataWithBytes:(const void *)dataOut length:(NSUInteger)dataOutMoved] encoding:NSUTF8StringEncoding];
    }
    else //encryptOperation==0  (加密过程中,把加好密的数据转成base64的)
    {
        //编码 base64
        NSData *data = [NSData dataWithBytes:(const void *)dataOut length:(NSUInteger)dataOutMoved];
        result = [GTMBase64 stringByEncodingData:data];
    }
    
    return [result UTF8String];
    
}
+(NSString*)encryptWithContent:(NSString*)content type:(CCOperation)type key:(NSString*)aKey
{
    const char * contentChar =[content UTF8String];
    char * keyChar =(char*)[aKey UTF8String];
    const char *miChar;
    miChar = encryptWithKeyAndType(contentChar, type, keyChar);
    return  [NSString stringWithCString:miChar encoding:NSUTF8StringEncoding];
}



C#端加解密:

#region   跨平台加解密(c# 安卓 IOS)
      //  public static string sKey = "12345678";
      //  /// 
      //  /// 解密
      //  /// 
      //  /// 要解密的以Base64
      //  /// 密钥,且必须为8位
      //  /// 已解密的字符串
      //  public static string DesDecrypt(string pToDecrypt)
      //  {
      //      //转义特殊字符
      //      pToDecrypt = pToDecrypt.Replace("-", "+");
      //      pToDecrypt = pToDecrypt.Replace("_", "/");
      //      pToDecrypt = pToDecrypt.Replace("~", "=");
      //      byte[] inputByteArray = Convert.FromBase64String(pToDecrypt);
      //      using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())
      //      {
      //          des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
      //          des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
      //          System.IO.MemoryStream ms = new System.IO.MemoryStream();
      //          using (CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write))
      //          {
      //              cs.Write(inputByteArray, 0, inputByteArray.Length);
      //              cs.FlushFinalBlock();
      //              cs.Close();
      //          }
      //          string str = Encoding.UTF8.GetString(ms.ToArray());
      //          ms.Close();
      //          return str;
      //      }
      //  }
 
      //  /// 
      //  /// 对字符串进行DES加密
      //  /// 
      //  /// 待加密的字符串
      //  /// 加密后的BASE64编码的字符串
      //  public string Encrypt(string sourceString)
      //{
      //   byte[] btKey = Encoding.UTF8.GetBytes(sKey);
      //   byte[] btIV = Encoding.UTF8.GetBytes(sKey);
      //    DESCryptoServiceProvider des = new DESCryptoServiceProvider();
      //    using (MemoryStream ms = new MemoryStream())
      //    {
      //        byte[] inData = Encoding.UTF8.GetBytes(sourceString);
      //        try
      //        {
      //            using (CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(btKey, btIV), CryptoStreamMode.Write))
      //            {
      //                cs.Write(inData, 0, inData.Length);
      //                cs.FlushFinalBlock();
      //            }
 
      //            return Convert.ToBase64String(ms.ToArray());
      //        }
      //        catch
      //        {
      //            throw;
      //        }
      //    }
      //}
        
        #endregion  


参考资料:http://zhidao.baidu.com/link?url=ymdSUCnD9swHbPGdMTeMLmDW5crg7z6lv97J39wLbOrOozbibxg7vuUIKObKxRsZQ9t744yDH4PxbZYglURW8l159aAoOpm1gwnFl0GpqsG&qq-pf-to=pcqq.c2c


结合理解:http://www.cnblogs.com/whoislcj/p/5580950.html

你可能感兴趣的:(Android开发)