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

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

本人菜鸟一枚,大学里凭兴趣学了一点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加密

    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 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();//构造CryptographicKeyCryptographicKey cryptographicKey = syprd.CreateSymmetricKey(keybuffer);//加密//Encrypt需要三个参数分别为加密使用的Key,需要加密的Data,以及向量IV//Des加密中Ecb模式和Cbc模式的区别就在于是否必须使用向量IVIBuffer 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;}
}
View Code

2. Sha1签名

根据爱贝的要求,需要先将数据进行sha1 hash,再将hash后的数据进行sha1签名

internal sealed class Sha1SignHelper{/// <summary>/// 用sha1进行签名/// </summary>/// <param name="data">需要签名的数据</param>/// <param name="key">签名私钥</param>/// <returns></returns>internal static string Sha1Sign(string data, string key){string signedData = null;IBuffer dataBuffer = Encoding.UTF8.GetBytes(data).AsBuffer();try{AsymmetricKeyAlgorithmProvider asymmetricAlgorithm = AsymmetricKeyAlgorithmProvider.OpenAlgorithm("RSASIGN_PKCS1_SHA1");//创建一个公钥私钥对CryptographicKey KeyPair = asymmetricAlgorithm.ImportKeyPair(CryptographicBuffer.DecodeFromBase64String(key), CryptographicPrivateKeyBlobType.Pkcs1RsaPrivateKey);//哈希计算dataHashAlgorithmProvider provider = HashAlgorithmProvider.OpenAlgorithm(Windows.Security.Cryptography.Core.HashAlgorithmNames.Sha1);IBuffer hashedData = provider.HashData(dataBuffer);//签名IBuffer signedHashedBuffer = CryptographicEngine.SignHashedData(KeyPair, hashedData);signedData = CryptographicBuffer.EncodeToBase64String(signedHashedBuffer);}catch (Exception ex){DebugHelper.Log("Sha1SignHelper.Sha1Sign", ex.Message);}return signedData;}internal static bool Sha1VerifySignature(string oldText, string signature, string publicKey){bool dataCorrect = false;try{AsymmetricKeyAlgorithmProvider asymmetricAlgorithm = AsymmetricKeyAlgorithmProvider.OpenAlgorithm("RSASIGN_PKCS1_SHA1");//创建一个公钥私钥对IBuffer pubKeyBuffer = Convert.FromBase64String(publicKey).AsBuffer();CryptographicKey KeyPair = asymmetricAlgorithm.ImportPublicKey(CryptographicBuffer.DecodeFromBase64String(publicKey));// 验证签名(通过公钥)IBuffer databuffer = CryptographicBuffer.ConvertStringToBinary(oldText, BinaryStringEncoding.Utf8); ;dataCorrect = CryptographicEngine.VerifySignature(KeyPair, databuffer, Convert.FromBase64String(signature).AsBuffer());}catch (Exception ex){DebugHelper.Log("Sha1SignHelper.Sha1VerifySignature", ex.Message);}return dataCorrect;}}
View Code

对接过支付宝的大神们应该比较熟悉,支付宝与爱贝的区别就在于支付宝是先md5哈希,再sha1签名,可是我将

HashAlgorithmProvider provider = HashAlgorithmProvider.OpenAlgorithm(Windows.Security.Cryptography.Core.HashAlgorithmNames.Sha1);

改为

HashAlgorithmProvider provider = HashAlgorithmProvider.OpenAlgorithm(Windows.Security.Cryptography.Core.HashAlgorithmNames.Md5);

签名后得到的数据却始终与支付宝匹配不上,无奈只能在服务器上完成这一环节,有知道问题所在的大神们可以指点一下。

以上就是我在做支付时用到过的加密/签名算法,自己封装成了类以便使用。

做完这个项目后其实我对加密/签名算法本身还是一头雾水,并不理解算法的本质原理,只是完成了功能而已,所以过程中也遇到了几个问题:

1.永远sha1签名的私钥的格式 CryptographicKey KeyPair = asymmetricAlgorithm.ImportKeyPair(CryptographicBuffer.DecodeFromBase64String(key), CryptographicPrivateKeyBlobType.Pkcs1RsaPrivateKey)中CryptographicPrivateKeyBlobType.Pkcs1RsaPrivateKey和CryptographicPrivateKeyBlobType.Pkcs8RawPrivateKeyInfo的区别

2.pem格式密钥和xml格式密钥怎么转换

3.为什么先md5哈希再rsa签名始终和支付宝对不上?

如果有理解深入的大神,希望可以指点一下。

第一次写博客,可能思路不清晰,望见谅!

 

posted on 2018-05-05 23:13 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/8996711.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/367081.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java中的中介器设计模式-示例教程

中介者模式是行为设计模式之一 &#xff0c;因此它处理对象的行为。 中介器设计模式用于在系统中不同对象之间提供集中式通信介质。 根据GoF&#xff0c;中介者模式意图是&#xff1a; 通过封装不同对象集相互交互和通信的方式&#xff0c;允许松散耦合。 允许每个对象集的动作…

java gc full gc_Java中full gc什么意思?

慕雪6442864除直接调用System.gc外&#xff0c;触发Full GC执行的情况有如下四种。1. 旧生代空间不足旧生代空间只有在新生代对象转入及创建为大对象、大数组时才会出现不足的现象&#xff0c;当执行Full GC后空间仍然不足&#xff0c;则抛出如下错误&#xff1a;java.lang.Out…

springboot-RequestMappingHandlerMapping

作用&#xff1a;查看应用请求对应的ur和方法l情况 实例&#xff1a; RequestMappingHandlerMapping mapping applicationContext.getBean("requestMappingHandlerMapping",RequestMappingHandlerMapping.class);Map<RequestMappingInfo, HandlerMethod> map …

JavaScript中Ajax的用法

XMLHttpRequest 对象的属性和方法&#xff1a; open(method,url,async)  规定请求的类型、URL 以及是否异步处理请求  send(string)        将请求发送到服务器。  responseText       获得字符串形式的响应数据。  responseXML        获得 XM…

axios请求超时,设置重新请求的完美解决方法

自从使用Vue2之后&#xff0c;就使用官方推荐的axios的插件来调用API&#xff0c;在使用过程中&#xff0c;如果服务器或者网络不稳定掉包了, 你们该如何处理呢? 下面我给你们分享一下我的经历。 具体原因 最近公司在做一个项目, 服务端数据接口用的是Php输出的API, 有时候在…

从代码内部:骆驼路由引擎第一部分

因此&#xff0c;最近我重新燃起了对Apache Camel工作原理的兴趣。 Camel是一种功能强大的集成工具&#xff0c;用途非常广泛&#xff0c;但是只要我投入使用&#xff0c;我都会忍不住想&#xff1a;“嗯&#xff0c;这到底是怎么做到的&#xff01;” …猜想我只是有一个诀窍&…

java比较时间sql_如何正确比较日期 java.sql.Date

import java.sql.Date;...............例如今天是2010-12-2Date d1 new Date(System.currentTimeMili());Date d2 new Date(System.currentTimeMili()1);//比d1晚1毫秒日期上&#xff0c;我们认为d1和d2是相等的但是System.out.println(d1.before(d2));输出结果是true;其实我…

各种推导式合集

推导式的套路 之前我们已经学习了最简单的列表推导式和生成器表达式。但是除此之外&#xff0c;其实还有字典推导式、集合推导式等等。 下面是一个以列表推导式为例的推导式详细格式&#xff0c;同样适用于其他推导式。 variable [out_exp_res for out_exp in input_list if o…

javascript总结36:DOM-点击按钮切换图片案例

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>Title</title> </head><body><a href"http://www.baidu.com" id"link">点击切换</a> <br&g…

一个9年的技术最近一直担心找不到工作

我是一个从早期ASP ACCESS程序员慢慢转到一名从设计、前端到PHP后台MYSQL数据库都做的技术。07年末初入上海第一份工作1350RMB/月做ASP开发。到了春节离职了&#xff0c;当时只因同事间的关系没那么和谐&#xff0c;感觉不开心才提出的离职&#xff0c;试用期3个月&#xff0c;…

Spring MVC控制器的单元测试:REST API

Spring MVC提供了一种创建REST API的简便方法。 但是&#xff0c;为这些API编写全面而快速的单元测试一直很麻烦。 Spring MVC测试框架的发布使我们可以编写可读&#xff0c;全面且快速的单元测试。 这篇博客文章描述了如何使用Spring MVC Test框架编写REST API的单元测试。 在…

flask框架基本使用(2)(响应与重定向)

#转载请留言联系 flask 框架基本使用(1)&#xff1a;https://www.cnblogs.com/chichung/p/9756935.html 1. flask 自定义返回状态码与响应头 from flask import Flask,make_responseappFlask(__name__)app.route("/") def index():#666是指定的状态码&#xff0c;nam…

web.xml中webAppRootKey

<context-param> <param-name>webAppRootKey</param-name> <param-value>myproject.root</param-value> </context-param> 1、<param-value>里的值可以随便写配置。如果不配置默认值是"webapp.root"。 2、<param-value…

mpvue小程序以及微信直播踩坑总结

前段时间刚写完一个mpvue的小程序&#xff0c;现在得闲必须赶紧记录和总结一下&#xff0c;不然很多东西又要忘了 我是比较熟悉vue的语法&#xff0c;但是也犹豫过是用原生还是用mpvue&#xff0c;因为那时候原生小程序已经相当成熟而mpvue才刚出来&#xff08;踩坑和填坑的前…

适用于高级Java开发人员的十大书籍

Java是当今最流行的编程语言之一。 有很多适合初学者的书籍。 但是对于那些使用Java进行过一段时间编程的人来说&#xff0c;其中有些人看起来有些简单和多余。 初学者的书没有带来新鲜有趣的想法。 但是&#xff0c;高级Java书籍并不总是一应俱全&#xff0c;部分原因是因为它…

python apscheduler执行_python apscheduler 每两小时执行一次

from datetime import datetimefrom apscheduler.schedulers.blocking import BlockingSchedulerdef job_function():print("Hello World")sched BlockingScheduler()每2小时触发sched.add_job(job_function, interval, hours2)sched.start()设定执行区间sched.add_…

Ajax知识总结

一 AJAX Asynchronous JavaScript and XML&#xff08;异步的 JavaScript 和 XML&#xff09;。 AJAX 不是新的编程语言&#xff0c;而是一种使用现有标准的新方法。AJAX 最大的优点是在不重新加载整个页面的情况下&#xff0c;可以与服务器交换数据并更新部分网页内容。AJAX …

Leetcode 456. 132 Pattern

题目的意思就是给你一个数组 里面一堆数&#xff0c;你是否能找到这样三个数&#xff0c;第一个数比第三个数小&#xff0c;第二个数最大。比如 1, 3, 2 或者 4, 9, 5 这种&#xff0c;数字可以不连续在一起&#xff0c;但是要保证顺序不变&#xff0c;只要有这么一组数就可以…

「起点订阅页」Checkbox 美化引发的蝴蝶效应

本文作者&#xff1a;任家乐 原创声明&#xff1a;本文为阅文前端团队 YFE 成员出品&#xff0c;请尊重原创&#xff0c;转载请联系公众号 (id: yuewen_YFE) 获取授权&#xff0c;并注明作者、出处和链接。 性能风暴 「据说亚马逊雨林的一只蝴蝶偶尔扇动几下翅膀&#xff0c;可…

python polar函数_Python可视化很简单,可是你会吗?python绘制饼图、极线图和气泡图,让我来教教你吧,一文教会!!!...

matplotlib库作为Python数据化可视化的最经典和最常用库&#xff0c;掌握了它就相当于学会了Python的数据化可视化&#xff0c;今天呢&#xff0c;咱们就一起来聊聊关于Python如何去绘制饼图、极线图和气泡图吧好啦&#xff0c;废话少说&#xff0c;咱们就开始吧&#xff01;用…