你的位置:首页 > 软件开发 > ASP.net > 复习做UWP时涉及到的几种加密签名相关

复习做UWP时涉及到的几种加密签名相关

发布时间:2016-11-20 01:00:05
本人菜鸟一枚,大学里凭兴趣学了一点WP的皮毛,后来又幸运(或者不幸)的进了一家专注于Windows生态的公司做了一段时间的UWP。在博客园写点自己遇到的东西,作为分享,也作为自己的备忘,如果有错误的地方,或者可以提升B格的地方,希望园子里的大神们不吝赐教。初进公司时,公司要做支付 ...

本人菜鸟一枚,大学里凭兴趣学了一点WP的皮毛,后来又幸运(或者不幸)的进了一家专注于Windows生态的公司做了一段时间的UWP。在博客园写点自己遇到的东西,作为分享,也作为自己的备忘,如果有错误的地方,或者可以提升B格的地方,希望园子里的大神们不吝赐教。

初进公司时,公司要做支付相关的业务,需要和支付宝、优易付、爱贝等支付渠道对接,对新手的我来说,加密或者是签名简直难到死,学校里哪用过这个,OMG,只能迎着头皮找资料。

这里我想请教大家一个问题,就是如何学习。例如当你遇到一个陌生的东西,你是如何查找资料解决问题的?当我需要做加密的时候我的做法是打开百度搜索“WP 3des加密”,这样找出来的结果基本都不能用。。。后来终于在博客园看到了两篇相关的博客,我才知道原来要实现相关功能需要哪几个类哪几个方法,这个过程大概用了一周吧,效率超低。

解决我燃眉之急的两篇博客分别是:

王磊:http://www.cnblogs.com/webabcd/archive/2013/06/03/3114657.html

老周:http://www.cnblogs.com/tcjiaan/p/4303918.html

看了这两篇博客就知道该使用哪些类了,再接下来就相对简单了。非常感谢两位老师的分享和指导。

在RT应用中,涉及到加/解密的API都在以下几个命名空间里:

1、Windows.Security.Cryptography

2、Windows.Security.Cryptography.Core

3、Windows.Security.Cryptography.DataProtection

接下来分享一下我在项目中做过的几个加密/签名,进行了一下简单的封装,还望大家指点

1.3des加密

复习做UWP时涉及到的几种加密签名相关复习做UWP时涉及到的几种加密签名相关
  internal sealed class TripleDesEncryptHelper  {    //加/解密 第一步     //通过SymmetricKeyAlgorithmProvider的静态方法OpenAlgorithm()得到一个SymmetricKeyAlgorithmProvider实例    //该方法参数是要使用的加/解密算法的名字    internal static SymmetricKeyAlgorithmProvider syprd = SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithmNames.TripleDesEcb);    /// <summary>    /// 加密函数    /// </summary>    /// <param name="data">需要加密的字符串</param>    /// <returns>返回加密后的结果</returns>    public static get='_blank'>string Encrypt(string data, string key)    {      string encryptedData = null;      try      {        byte[] dataBytes = Encoding.UTF8.GetBytes(data);        //这里我自己写了一个pkcs5对齐,不过后来有看到过C#pkcs5和pkcs7是一样的说法,有待验证        byte[] pkcs5databytes = pkcs5(dataBytes);        IBuffer databuffer = pkcs5databytes.AsBuffer();        byte[] keyBytes = Convert.FromBase64String(key);        IBuffer keybuffer = keyBytes.AsBuffer();        //构造CryptographicKey        CryptographicKey cryptographicKey = syprd.CreateSymmetricKey(keybuffer);        //加密        //Encrypt需要三个参数分别为加密使用的Key,需要加密的Data,以及向量IV        //Des加密中Ecb模式和Cbc模式的区别就在于是否必须使用向量IV        IBuffer cryptBuffer = CryptographicEngine.Encrypt(cryptographicKey, databuffer, null);   **************/        byte[] enctyptedBytes = cryptBuffer.ToArray();        //进行base64编码        encryptedData = Convert.ToBase64String(enctyptedBytes);       }      catch (Exception ex)      {        DebugHelper.Log("TripleDesEncryptHelper.Encrypt", ex.Message);      }      return encryptedData.Trim();    }    /// <summary>    /// 解密函数    /// </summary>    /// <param name="data">待解密的字符串</param>    /// <returns>解密后的数据</returns>    public static string Decrypt(string data, string key)    {      string decryptedData = null;      try      {        byte[] dataBytes = Convert.FromBase64String(data);        IBuffer dataBuffer = dataBytes.AsBuffer();        byte[] keyBytes = Convert.FromBase64String(key);        IBuffer keybuffer = keyBytes.AsBuffer();        CryptographicKey cryptographicKey = syprd.CreateSymmetricKey(keybuffer);        IBuffer decryptedBuffer = CryptographicEngine.Decrypt(cryptographicKey, dataBuffer, null);        decryptedData = CryptographicBuffer.ConvertBinaryToString(BinaryStringEncoding.Utf8, decryptedBuffer);        //防止乱码        var result = System.Text.RegularExpressions.Regex.Match(decryptedData, "[a-zA-Z0-9]*");        decryptedData = result.ToString();      }      catch (Exception ex)      {        DebugHelper.Log("TripleDesEncryptHelper.Decrypt", ex.Message);      }      return decryptedData;    }    /// <summary>    /// 把数据进行pkcs5对齐    /// </summary>    /// <param name="databytes">待处理的数据</param>    /// <returns></returns>    private static byte[] pkcs5(byte[] databytes)    {      byte[] newBytes = null;      int datalength = databytes.Length;      int blocksize = (int)syprd.BlockLength;      if (!(datalength % blocksize == 0))      {        int need = blocksize - (datalength % 8);        newBytes = new byte[datalength + need];        for (int i = 0; i < datalength; i++)        {          newBytes[i] = databytes[i];        }        byte xx = 0x0;        switch (need)        {          case 1:            xx = 0x1;            break;          case 2:            xx = 0x2;            break;          case 3:            xx = 0x3;            break;          case 4:            xx = 0x4;            break;          case 5:            xx = 0x5;            break;          case 6:            xx = 0x6;            break;          case 7:            xx = 0x7;            break;        }        for (int i = 0; i < need; i++)        {          newBytes[datalength + i] = xx;        }      }      else      {        newBytes = new byte[datalength + 8];        for (int i = 0; i < datalength; i++)        {          newBytes[i] = databytes[i];        }        byte xx = 0x8;        for (int i = 0; i < 8; i++)        {          newBytes[datalength + i] = xx;        }      }      return newBytes;    }}

原标题:复习做UWP时涉及到的几种加密签名相关

关键词:加密

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。