美文网首页
【安全篇】.NET,Android,iOS 双向互通DES+

【安全篇】.NET,Android,iOS 双向互通DES+

作者: methodname | 来源:发表于2016-11-25 12:16 被阅读0次

    因为项目的需求,最近几天一直在看关于加密的问题,将项目中使用到的DES加密整理一下,它可以使用适用于NET,Android,iOS三个平台.

    DES加密,DES有两种,一种是DES,对每组分组进行一次加密,另一种是DES的升级版3DES,就是对每组分组进行3此加密,前者最大可使用8位的密匙,后者最大可使用24为密匙。

    看代码:

    .NET

    <pre>
    <code class = 'cs hljs'>
    //////
    /// 密匙
    //////
    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;
    }
    }
    }

    </code></pre>

    Android

    <pre><code class= 'hljs'>
    // 加密
    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);
    

    }

    // 解密
    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));
    

    }
    </code></pre>

    iOS

    <pre>
    <code class='Xcode'>

    /**

    • DES加密解密(封装参数为NSString)
    • @param content 加解密内容
    • @param type 加/解密
    • @param aKey 密匙
    • @return 加/解密后的内容
      /
      +(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];
      }

    /**

    • DES加密解密

    • @param text 需要加/解密的内容

    • @param encryptOperation 加/解密

    • @param key 密匙

    • @return 加/解密后的内容
      /
      static const char
      encryptWithKeyAndType(const char *text,CCOperation encryptOperation,char *key)
      {
      NSString *textString=[[NSString alloc]initWithCString:text encoding:NSUTF8StringEncoding];
      const void *dataIn;//
      size_t dataInLength;
      if (encryptOperation == kCCDecrypt)//传递过来的是decrypt 解码
      {
      //解码 base64 // !!!!!!!!!!!!!!!!!-------->【解密进行了Base64字符串处理】,加密时使用,如要使用,去除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
      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];
      }

    </code></pre>

    iOS中需要用到的GTMBase64库

    如果只需要DES加密的话,将Base64去掉即可

    END

    相关文章

      网友评论

          本文标题:【安全篇】.NET,Android,iOS 双向互通DES+

          本文链接:https://www.haomeiwen.com/subject/tenipttx.html