The Cryptography API, or How to Keep a Secret(五)

原创 2004年02月07日 22:53:00

CRYPTOAPI 例程

概述

随本文提供的CRYPTOAPI 例程是一个“完整”的加密/解密工具。程序能够向默认的CSP中添加与移除用户,使用或不使用密码进行加密与解密文件,签署与验证签名,显示默认CSP的性能。

程序有下列命令行结构。

Usage: Encrypt switch [arguments]
 
Where switch and optional arguments are one of:
 
Switch           Arguments        Description
 /A[DDUSER]                       to add user to CSP table
 /R[EMOVEUSER]                    to remove user from CSP table
 /E[NCRYPT]      uf ef [pwd]      to encrypt a file
 /D[ECRYPT]      ef uf [pwd]      to decrypt a file
 /S[IGN]         uf sf [desc]     to sign a file
 /V[ERIFY]       uf sf [desc]     to verify a signed file
 /C[SP]                           to show CSP statistics
 
 and   uf   = name of an unencrypted file
       ef   = name of an encrypted file
       sf   = name of a signed file
       pwd  = optional password
       desc = optional signature description

编码问题

写作这篇文章时,需要显式地在例程中定义特定的常量,因为加密API头文件(wincrypt.h) 使用 _WIN32_WINNT 常量来检测正在使用哪个Windows NT版本。当我写此例程时,此常量尽管需要,但当前的编译器仍然未定义它。定义此常量代码才不会编译出错,可以在以后的编译器定义它后再将其移除。

API函数 CryptAcquireContext 有一个未文档化的常量值 MS_DEF_PROV。这个常量用来指代默认CSP。这个值用在 /ADDUSER 命令行开关中。这允许程序使用任何已安装的CSP,不需要知道其名字。

增加或者删除一个用户

/ADDUSER /REMOVERUSER 开关用来增加或删除一个默认的加密客户端。为使其它加密功能运行正常,/ADDUSER 开关必须首先被调用。

下面一系列操作会被执行:

  1. 一个默认密鈅容器被创建
  2. 一个数字签名密鈅对在密鈅容器中被创建
  3. 一个密鈅交换密鈅对在密鈅容器中被创建

这项操作仅需执行一次,除非操作系统重装。假如默认的密鈅容器与密鈅对已经创建,那么再次使用这个开关没有效果。

从命令行运行/ADDUSER 开关如下:

Encrypt /ADDUSER

从命令行运行/REMOVEUSER开关如下:

Encrypt /REMOVEUSER

加密或解密文件

/ENCRYPT 开关用来加密文件。通过这个开关加密的文件以后可以通过 /DECRYPT 开关解密。

注意:为了给默认用户创建一个密鈅容器,必须在进行任何加密前调用/ADDUSER 开关。

从命令行运行/ENCRYPT开关如下:

Encrypt /encrypt <source file> <destination file> [ <password> ]

<source file> 参数指定要加密的明文文件文件名, <destination file>参数指定要创建的加密文件文件名。可选参数 <password>指定一个要加密文件的密码。如果未指定密码,使用一个随机的会话密鈅加密这个文件。会话密鈅然后使用默认用户的交换密鈅公鈅加密后随加密的文件一同保存。在此情况下,相应的密鈅交换私鈅用来解密(用/DECRYPT)会话密鈅,然后用此会话密鈅解密此文件。

从命令行运行/DECRYPT开关如下:

Encrypt /decrypt <source file> <destination file> [ <password> ]

<source file> 参数指定要解密的密文文件文件名,<destination file>参数指定要创建的明文文件文件名。可选参数 <password>指定一个要解密文件的密码。要是向/DECRYPT开关提供一个假密码,不会产生错误。这对安全性起着重要作用,因为这样对某些人来说就没有办法“中断”数据来知道是否他们正在这样做。只有数据的合法接收者才能解密,并且确实知道解密成功。

对文件签名并且验证

/SIGN 开关用于签名文件。通过这个开关签名的文件以后可以通过/VERIFY开关验证。

注意:为了给默认用户创建一个密鈅容器,必须在进行任何加密前调用/ADDUSER 开关。

从命令行运行/SIGN开关如下:

Encrypt /sign <source file> <signature file> <description>

<source file> 参数指定要签名的文件名,<signature file> 参数指定要放置签名数据的文件名。 <description> 参数指定一个对签名数据的文本描述。假如不需要指定描述,此参数可为空引用(””)。参阅联机文档对 CryptSignHash 的说明以获得更多关于签名与描述字符的信息。(译注:description参数在MSDN文档中不被建议使用)

/VERIFY 开关与 /SIGN使用一样的参数。假如源文件内容,签名文件,或描述字符串从文件签名以来改变了,将报告一个错误。

显示 CSP的统计信息

/CSP 开关列出被默认PROV_RSA_FULL提供者支持的算法。默认时是Microsoft RSA Base Provider,它已包含在操作系统中。

注意:为了给默认用户创建一个密鈅容器,必须在进行任何加密前调用/ADDUSER 开关。

从命令行运行/CSP开关如下:

Encrypt /csp

另外为了列出每个被支持的算法的名字,这个开关还列出:

  • 算法的类型(加密,散列,密鈅交换,签名)
  • 算法所使用的密鈅长度 (对散列算法是散列出的散列值的位数)

算法的算法标志符。为了使用特定的算法来创建密鈅或者散列,可以将这个值传给适当的加密API函数。

结论

本文向你展示了如何加密与解密文件,如何对文件进行签名与验证。加密API也可以用来实现提供一个安全环境。鉴于微软在API中提供的强大安全性能,我强烈建议你在安全消息上使用它,但不要忘记了加密你数据的密码啊。如果忘了,那么就没办法找回来了。在以后的文章中,我会向你展示如何加密数据,在互联网上或者以其它传输方式公开传输。到那时,乐享“keeping a secret!”吧。

 

译注:下载的例程中需要修改与错误之处在下面标出,我的环境VC6 sp5WinXP专业版

1、运行下载后的ZIP自解压文件,将代码解压到工作目录中,使用VC6打开Encrypt.mdp,提示需要将项目文件转换为VS6的格式

2、将CryptErr.cpp文件从FileView中删除后,再重新引入,解决项目文件中此文件引用错误的问题

3、手工创建并添加stdafx.hstdafx.cpp预处理文件到FileView中。最好从其它项目中直接复制过来,将本项目中用不到的内容删除

CryptErr.cppCencrypt.cppmain.cpp文件最顶部添加预处理头文件

#include "stdafx.h"

4、将CryptErr.h文件中,定义NT版本的定义删除

#ifndef _WIN32_WINNT

#define _WIN32_WINNT 0x0400

#endif

stdafx.h中添加对NT版本的定义

#define _WIN32_WINNT 0x0400

 5、程序在显示CSPCencrypt类有一错误,CEncrypt::Statistics()函数中

将语句

if (!::CryptGetProvParam(this->m_hCryptProvider, PP_ENUMALGS, pbData, &dwDataLen, 0))

中最后参数0改为dwFlags,修改后语句如下:

if (!::CryptGetProvParam(this->m_hCryptProvider, PP_ENUMALGS, pbData, &dwDataLen, dwFlags))

6、运行程序,并使用各个开关查看运行结果

使用cryptography进行AES的cbc模式加密

cryptography 是一个python加密库 cryptography is a package designed to expose cryptographic primitives an...
  • Dawn_StatDust
  • Dawn_StatDust
  • 2017年02月06日 15:18
  • 1170

无语的scrapy安装过程 win7

首先请你卸载掉阿里旺旺,卸载完之后,打开注册表搜索“阿里”将出现的中文注册表项删除,否则肯定会报错。不知道是哪个大神找出来的这个问题,当时我在自己的笔记本上搭了好几遍没成功,后来才想起来忘记卸载阿里旺...
  • yuanzhiweiss
  • yuanzhiweiss
  • 2014年03月24日 21:47
  • 2671

VC 使用Cryptography 微软自带算法加解密文件

// Encrypting_a_File.cpp : Defines the entry point for the console // application. // #include #i...
  • earbao
  • earbao
  • 2014年12月31日 12:04
  • 1630

Google首席工程师Joshua Bloch谈如何设计优秀的API

Google首席工程师Joshua Bloch谈如何设计优秀的API How to Design a Good API and Why it Matters Why is API Desig...
  • doctor_who2004
  • doctor_who2004
  • 2016年07月24日 19:45
  • 1100

加密学教程(Cryptography Tuturials)目录

加密学教程(Cryptography Tuturials)目录
  • sleks
  • sleks
  • 2014年11月11日 09:28
  • 1500

图灵机器人SDK接入指南

图灵机器人SDK接入指南图灵机器人:官网注册账号注册个账号,创建个应用,进入后台,点开机器人接入,你会看到API key和secret下载SDK点击下载Android SDK,解压以后会有libsco...
  • q4878802
  • q4878802
  • 2016年06月03日 14:54
  • 5509

centos 下安装scrapy过程及遇到的问题

问题: 1. centos6.6下自带安装的是python2.6.6(yum使用不了python2.7),而我们使用scrapy需要使用的是python2.7,因此会有一些麻烦,幸运的是在python...
  • QZC295919009
  • QZC295919009
  • 2015年01月04日 11:06
  • 1259

智能聊天机器人之图灵机器人

今天从慕课网学习了图灵机器人的实现,感觉很有意思。视频地址:点击打开链接,因为视频是一年多以前的,现在图灵官网的api接口已经变了,所以视频仅作参考,本文是基于最新api讲解的。 无聊的时候可以找它陪...
  • wdong_love_cl
  • wdong_love_cl
  • 2016年05月17日 23:55
  • 2515

HTTPS连接的前几毫秒发生了什么

原文地址:http://blog.jobbole.com/48369/提示:英文原文写于2009年,当时的Firefox和最新版的Firefox,界面也有很大改动。以下是正文。花了数小时阅读了如潮的好...
  • AloneSword
  • AloneSword
  • 2015年07月25日 20:54
  • 1835

Oracle分析函数KEEP、DENSE_RANK的使用

最近在工作中,碰到一个问题,后来
  • jueduizone
  • jueduizone
  • 2014年10月27日 17:31
  • 3258
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:The Cryptography API, or How to Keep a Secret(五)
举报原因:
原因补充:

(最多只允许输入30个字)