cryptapi双向认证_[加密解密]CryptoAPI简介

CryptoAPI概述

Windows CryptoAPI是Microsoft 公司提出的安全加密应用服务框架,也是PKI推荐使用的加密 API。它提供了在Win32 环境下使用认证、编码、加密和签名等安全服务时的标准加密接口,用于增强应用程序的安全性与可控性。应用开发者可以在不了解复杂的加密机制和加密算法的情况下,简便、快速地开发出标准、通用和易于扩展的安全加密应用程序。CryptoAPI 提供的功能主要有:密钥管理、数据加密和解密、数字签名和验证、证书管理、可信根证书管理、数据编码和解码、数字证书编码和解码、PKCS#7 标准格式编码和解码等。现在CryptoAPI的最新版本为2.0版本。

微软加密服务体系

微软加密服务体系包含3层结构和两个接口,分别为应用程序层、操作系统层(OS)、加密服务提供者层(Cryptographic Service Provider,CSP)、CryptoAPI接口和加密服务提供者接口(CSPI),其结构图如下图所示。应用程序层通过CryptoAPI接口与操作系统通信,操作系统通过加密服务提供者接口(CSPI)与CSP通信。其编程模型同Windows系统的图形设备接口 GDI比较类似,其中加密服务提供者CSP等同于图形设备驱动程序 ,加密硬件(可选)等同于图形硬件,其上层的应用程序也类似,都不需要同设备驱动程序和硬件直接打交道。CryptoAPI接口面向应用系统,而CryptoSPI 面向加密模块开发商,CryptoAPI 统一由Windows 提供,而底层的CSP由各开发商提供。这样的分层体系结构,使应用系统不必关心底层的加密实现细节和实现方式(软件或硬件),降低了集成难度,并且在一个系统中可以同时加载多个CSP。同时微软公司为开发商制定了CSP 的标准接口,开发商按照标准开发CSP,就可以把自己开发的软件或硬件加密模块紧密集成进CryptoAPI 的体系中。

微软加密服务体系

在微软加密服务体系中,加密服务相关的所有操作都在CSP实现,它是真正实行加密相关服务的独立模块,既可以由软件实现也可以由硬件实现,但是必须符合CryptoAPI接口的规范。每个CSP必须包含有一个动态链接库和一个签名文件,签名文件用于保证底层的CSP 的安全性,CryptoAPI 接口在加载每个CSP 时,需要验证CSP 的签名,如果签名无效,则拒绝加载,CSP 的签名由微软公司签发。同时,每个CSP都有一个名字和一个类型,名字必须唯一的,这样便于CryptoAPI找到对应的CSP。加密服务标准被分为不同的家族,每种家族包含自己的一系列数据格式和协议,不同的家族有不同的数据格式或协议等。在CryptoAPI中,每种CSP类型代表不同的家族。目前已经有9种CSP类型,并且还在增长,不同类型支持的密钥交换算法、签名算法、对称加密算法和Hash算法等如下表所示。

CSP类型

交换算法

签名算法

对称加密算法

Hash算法

PROV_RSA_FULL

RSA

RSA

RC2

RC4

MD5

SHA

PROV_RSA_SIG

none

RSA

none

MD5

SHA

PROV_RSA_SCHANNEL

RSA

RSA

RC4

DES

Triple DES

MD5

SHA

PROV_DSS

DSS

none

DSS

MD5

SHA

PROV_DSS_DH

DH

DSS

CYLINK_MEK

MD5

SHA

PROV_DH_SCHANNEL

DH

DSS

DES

Triple DES

MD5

SHA

PROV_FORTEZZA

KEA

DSS

Skipjack

SHA

PROV_MS_EXCHANGE

RSA

RSA

CAST

MD5

PROV_SSL

RSA

RSA

Varies

Varies

CryptoAPI体系架构

CryptoAPI体系架构共由五大主要部分组成:基本CSP函数(Base Cryptographic Functions)、证书编解码函数(Certificate Encode/Decode Functions)、证书库管理函数(Certificate Store Functions),简单消息函数(Simplified Message Functions)、底层消息函数(Low-level Message Functions)。其结构图如下图所示。

CryptoAPI体系架构

基本加密函数:用于选择CSP、建立CSP连接、产生密钥、交换及传输密钥等操作。这些函数为开发加密应用程序提供了足够灵活的空间。所有CSP 的通讯都是通过这些函数,一个CSP 是实现所有加密操作的独立模块,于是在每一个加密应用程序中至少需要提供一个CSP来完成所需的加密操作。

证书编/解码函数:用于数据加密、解密、哈希等操作。这类函数支持数据的加密/解密操作;在应用程序中完成计算哈希、创建和校验数字签名操作;用来对证书、证书撤销列表、证书请求和证书扩展进行编码和解码操作。

证书库管理函数:用于数字证书及证书库管理等操作。这组函数用于管理证书、证书撤销列表和证书信任列表的使用、储存、获取等。

简单消息函数:用于消息处理,比如消息编码/解码、消息加/解密、数字签名及签名验证等操作。它是把多个低层函数包装在一起以完成某个特定任务,以方便用户的使用。

底层消息函数:低级消息函数对传输的PKCS#7 数据进行编码,对接收到的PKCS#7 数据进行解码,并且对接收到的消息进行解密和验证。它可以实现简单消息函数可以实现的所有功能,它提供更大的灵活性,但一般会需要更多的函数调用。对于绝大多数应用,我们不推荐使用低级消息函数,使用简化消息函数更为方便。

CryptoAPI基本功能

利用CryptoAPI,开发者可以给基于Windows的应用程序添加安全服务,包括: ASN.1编码及解码、数据加密/解密、身份论证、数字证书管理,同时支持PKI、对称密码技术等。应用程序开发者直接使用这些安全功能而无须了解其底层实现。

1. 加密密钥

密钥是密码体系操作的中心,它们必须安全保存,任何人获得某个密钥则对此密钥有关的任何数据都拥有了访问的权限。例如,某人得到了加密某文件的密钥,则他就可以解密此文件了。再比如,获取了对某消息签名的密钥,则可以伪造数字签名。

在CryptoAPI中,支持两种类型密钥:会话密钥、公/私密钥对。

会话密钥也称为对称密钥,用于对称加密算法,例如RC2、RC4、DES等。在CryptoAPI中,一般使用CryptGenKey 或 CryptDeriveKey函数产生会话密钥。为了保证密钥的安全性,这些密钥都保存在CSP内部。当然,用户也可以通过CryptExportKey函数把密钥以加密密钥块形式导出到具体应用空间内,以备以后使用或传输给其他用户。

公/私密钥对(包括公钥、私钥)用于非对称加密算法,例如RSA等。非对称加密算法主要用于加解密会话密钥和数字签名。在CryptoAPI中,一般来说,大多数 CSP产生的密钥容器包含两对密钥对,一对用于加密会话密钥,称为交换密钥对,一对用于产生数字签名,称为签名密钥对;但也有些CSP没有存储密钥对,或者存储不止两对密钥对。

在CryptoAPI中,所有的密钥都存储在CSP,CSP负责产生、销毁密钥,并使用它们完成各种密码操作。也可以利用CryptoAPI函数从CSP中导出密钥。

2. 数据编码/解码

通过通信媒介(例如电话线路)传输数据,必须先把数据序列化,即把数据转化为0、1串。在序列化操作中,接到数据的计算机必须能够把数据转化为其原始格式。序列化完成的操作规则称为通信协议,它由软件和数据传输硬件共同完成,其协议一般包含多层,图3-3为一个简化了的通信协议层。

下图表示:计算机1应用程序层先传输原文数据到编码/解码层,编码/解码层编码原文数据为计算机字节流,然后发送到硬件层,硬件层把字节流数据转化为0、1串流传输到计算机2。计算机2接到数据后,反向操作,转化0、1串流为计算机字节流,发送到编码/解码层,编码/解码层解码计算机字节流为原文数据。

一种可接受的软件设计原理是使用抽象化,即根据问题或对象的一般参数来描述,而不是要描述解决问题的所有细节或对象的所有细节。利用抽象化,设计者说明软件对象的特定性质而不必关心其具体实现,它简化了说明文档。抽象化是大多数现代软件规范的特点,并且多数通信协议都包含一些列的抽象化。

简化通信协议层

描述抽象对象的一个普遍方式为:ASN.1(抽象语法标记1),ASN.1在CCITT推荐文件X.208中定义,描述对象转换为0、1串的ASN.1规则称为DER(精确编码规则),在CCITT推荐文档X.509 8.7节定义。CryptoAPI采用的就是这种编码方式,表示数据发送方发送时先把数据抽象为ASN.1对象,然后使用DER编码规则把ASN.1对象转化为可传输的0、1串;接收方接到数据后,利用DER解码规则把0、1串转化为ASN.1对象,然后再把ASN.1对象转化为具体应用支持的数据对象。

3. 数据加/解密

把明文转化为密文的过程称为加密,反之把密文转化为明文的过程称为解密。加密较大的数据,CryptoAPI中约定用对称加密算法,这种算法中,在加密和解密过程中都使用同一个对称密钥或会话密钥。CryptoAPI中,通过其封装好的加解密函数来实现数据加解密操作,不同CSP提供不同的加解密算法,但常用的算法,一般CSP都提供。

4. 哈希与数字签名

哈希与数字签名一般用于确定数据的完整性和身份鉴别。CryptoAPI中,通过其封装好的哈希与数字签名函数来实现相关操作。微软提供的CSP产生的数字签名遵循RSA标准(PKCS#6),其他CSP可能遵循其他标准。

5. 数字证书

数字证书主要用于安全通信中的身份鉴别。CryptoAPI中,对数字证书的使用管理分为证书与证书库函数、证书验证函数。

6. 数字消息

任何被编码的数据都可称为消息,它是发送给其他人或实体(或从其他人或实体接收到)的编码数据,包括数字证书。在CryptoAPI环境中,消息一般会被签名或加密,或者同时被签名和加密。在CryptoAPI2.0版本中,消息处理函数一般分为两类:底层消息函数,简单消息函数。低级消息函数直接和PKCS#7 消息工作,简化消息函数是比较高级的函数,是对几个低级消息函数和证书函数的封装,用来执行指定任务。

下篇文章介绍如何使用CryptoAPI进行文件加解密,把我那烂代码拿出来给大家看。

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

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

相关文章

vue前后分离session实现_vue2 前后端分离项目ajax跨域session问题解决

最近学习使用vuejs前后端分离,重构一个已有的后台管理系统,遇到了下面这个问题:实现跨域请求时,每次ajax请求都是新的session,导致无法获取登录信息,所有的请求都被判定为未登陆。1、 vuejs ajax跨域请求最…

win10时间和linux不同步时间,ubuntu16和windows10的时间同步问题

一句话搞定sudo hwclock --localtime --systohc命令: hwclock全称: hardware clock硬件时钟作用: Query or set the hardware clock.Functions:-h, --help show this help text and exit-r, --show read hardware clock and print result--get re…

linux直接用iso文件装服务,linux系统安装iso文件方法

摘要:linux系统下怎么安装iso文件?安装步骤:1、在/mnt目录下,创建相应的iso文件夹,例如iso。2、运行以下命令,挂载iso文...安装步骤:1、在/mnt目录下,创建相应…

smbus协议的command_SMBus总线概述

1.概述:系统管理总线是一种两线制接口。它基于I2C 总线原理演变而来,可以认为是简化版的I2C总线。SMBus最初是应用到智能电池,如电池充电器和一个微控制器。其提供一个系统和电源管理相关的任务控制总线。如今,SMBus总线可以连接的…

在电脑上显示未知发布者怎么办_电脑提示未知发布者 - 卡饭网

IE浏览器提示未知发布者安全警告怎么办IE浏览器提示未知发布者安全警告怎么办 IE浏览器提示未知发布者安全警告的解决方法, IE浏览器提示未知发布者怎么办?安下小编就来分析一下. 1.打开IE浏览器,从右上角打开Internet选项; 2.点击切换到"高级"选项卡; 3.在设置列表…

linux 邮件日志,linux下如何建立邮件日志

先关闭sendmailservice sendmail stopchkconfig sendmail off安装DNSmount /dev/cdrom /mntyum install bind-*配置主DNS服务器vim /var/named/chroot/etc/named.confoptions {directory "/var/named";};zone "daijingjie.com" {type master;file &qu…

linux 修改网卡报错xe,centos修改端口出现Failed to start OpenSSH server daemon 启动报错和-xe报错的解决方法...

修改SSH端口:# vi /etc/ssh/sshd_config里面找port 22,在前面加上#,去掉注释,然后把22改成你想要的端口。#port 22建议去掉注释之前,先增加你需要的端口,比如:12345端口,生效后在删除…

python中issubset是什么_python3解释器执行 {2, 3, 4}.issubset({2, 3, 4})的结果为__。

【单选题】一个1拖4的USB集线器,用外接电源供电的情况下,为下游USB供电的电流是()?【单选题】组成容量为128K32位的存储器,需用( )片具有16位地址码可同时存取8位数据的RAM集成芯片。【判断题】在排料过程中,系统可以自…

scp linux 自动化,expect(spawn) 自动化git提交和scp拷贝---centos(linux)

在进行SCP文件拷贝中,往往需要进行用户密码的输入,即用户交互。若采用自动化脚本的方式进行,则可用以下方式#!/usr/bin/expect# 设置参数set src [lindex $argv 0]set dest [lindex $argv 1]set password [lindex $argv 2]set appId [lindex …

java或异运算_java中与运算,或运算,异或运算,取反运算

//与运算 & 规则 :都为1时才为1System.out.println( 7 & 9);/** 7二进制 0111* 9二进制 1001* -----------* 0001 1* *///或运算 | 规则:有一个为1,则为1System.out.println(7 | 9);/** 7二进制 0111* 9二进制 1001* ---…

迷你linux操作系统,自己动手做一个迷你型Linux操作系统

本文要构建的这个迷你型的 Linux 系统只能在一台特定的单机上运行,如果读者朋友们有兴趣的话,在这个系统的基础上加以改进,是可以构建出通用的、可以在大多数常规 PC 机上即插即用的系统来的。但是这已经不在本文的话题之内了,读者…

linux查看vtk版本,vtk在linux下的安装(12月8日更新)

安装前准备运行环境:ubuntu14.04 LTS, 64bit //本人在ubuntu 14.10下安装失败安装版本:vtk6.1.0.tar.gz vtkdata6.1.0.tar.gz编译器:g$ sudo apt-cache search gcc*g以保证能搜索到g,然后$ sudo apt-get install gmak…

手动开启群辉php_如何使用Synology从php页面连接到mysql服务器?

我有一个较旧的Synology设备(DSM v5.2-5967 Update 4,phpmyadmin v4.4.7-0103),它有一些带有工作php页面的本地网站.我想将其迁移到我的新Synology设备(DSM V6.1.3-15152 Update 1,phpmyadmin v4.6.6-0172).从Package Center安装新版本的phpmyadmin时,我也需要下载Maria DB和PH…

瑞斯康达nms_瑞斯康达接入网设备维护手册免费.pdf

瑞斯康达接入网设备维护手册免费瑞斯康达接入网设备维护手册瑞斯康达科技发展股份有限公司广东办事处编制二零一三年五月瑞斯康达接入网设备维护手册目录一、 MSAP 产品介绍 41、OPCOM3500E-12 设备简介 42、OPCOM3500E-6 设备简介 53、 ITN2100-12 设备简介 64、 ITN203 设备简…

linux gcc延时怎么写,Clang / GCC是否真的支持延迟加载功能?

如果您 确实经历过与上述标题相关的事情,您是否愿意对此发表评论?我试图使共享对象在Ubuntu上同时被Clang和GCC延迟加载(我实际上不介意使用哪个编译器),但是它们看起来并没有真正支持任何延迟加载功能(我期望延迟加载功能)在需要此功能时&am…

常数乘以无穷大等于多少_请教一个数学问题:无穷大乘以无穷小等于多少?

实在受不了了,只好出来说两句。好歹也是数学这一行的,看她被你们糟蹋成这样实在不忍心。“无穷大量”和“无穷小量”在高等数学中都是趋于特定极限的变量的称呼,一个变量在某一极限过程中趋于无穷大(小),那么此变量称为“无穷大(小…

深度linux支持安卓,深度操作系统 V20(1003)内测版招募:新增手机助手,支持安卓和 iOS 端,管理手机应用、文件...

IT之家9月28日消息 深度操作系统今天发布深度操作系统 20(1003)内测活动招募说明,IT之家获悉,本次操作系统将新增手机助手,支持安卓和iOS端,方便管理手机应用、文件等。更新说明:1、新增手机助手,支持安卓和…

java socket发送定长报文_java socket报文通信(二)报文的封装

昨天我们谈了怎么建立socket通信的服务端和客户端,今天我们就来谈一谈怎么封装报文。什么是报文这里我就不在阐述了,不清楚的朋友可以自己去查资料。我们今天要谈的报文主要友以下几个部分组成:3位同步校验位8位报文长度报文头报文体32位MD5校…

linux nginx 安装stream,Centos7-64bit-编译安装配置Nginx stream四层负载均衡 动态加载

Centos7-64bit-编译安装配置Nginx stream四层负载均衡 动态加载2018-08-10 17:12分享人:老牛yum install screen -y && screen -S nginxsudo yum -y groupinstall "Development Tools" && yum -y epel-release wget gc autoconf automake…

选择排序(java)

选择排序 选择排序是默认前面都是已经排序好的,然后从后面 选择最小的放在前面排序好的的后面,首先第一轮循环的时候默认的排序好的为空,然后从后面选择最小的放到数组的第一个位置,第二轮循环的时候默认第个元素是已经 排序好的…