惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Attack and Defense Labs
Attack and Defense Labs
The GitHub Blog
The GitHub Blog
C
Check Point Blog
博客园_首页
MongoDB | Blog
MongoDB | Blog
N
Netflix TechBlog - Medium
F
Full Disclosure
Microsoft Security Blog
Microsoft Security Blog
爱范儿
爱范儿
Recent Announcements
Recent Announcements
阮一峰的网络日志
阮一峰的网络日志
G
GRAHAM CLULEY
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
T
Threat Research - Cisco Blogs
C
Cybersecurity and Infrastructure Security Agency CISA
V
Vulnerabilities – Threatpost
K
Kaspersky official blog
博客园 - 司徒正美
S
Schneier on Security
T
The Exploit Database - CXSecurity.com
Project Zero
Project Zero
云风的 BLOG
云风的 BLOG
Cisco Talos Blog
Cisco Talos Blog
Know Your Adversary
Know Your Adversary
雷峰网
雷峰网
V
V2EX - 技术
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Spread Privacy
Spread Privacy
罗磊的独立博客
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
S
Security Affairs
SecWiki News
SecWiki News
Schneier on Security
Schneier on Security
O
OpenAI News
Jina AI
Jina AI
PCI Perspectives
PCI Perspectives
Cyberwarzone
Cyberwarzone
Y
Y Combinator Blog
Apple Machine Learning Research
Apple Machine Learning Research
B
Blog RSS Feed
I
InfoQ
D
Docker
P
Palo Alto Networks Blog
Recorded Future
Recorded Future
M
MIT News - Artificial intelligence
博客园 - Franky
B
Blog
Scott Helme
Scott Helme
博客园 - 叶小钗
D
DataBreaches.Net

博客园 - 康国庆--thinkinlove

ubuntu flash 乱码解决 Crypto ++ (cryptopp) 与加密 (1) crypto API 与crypto++(前) ubuntu下使用urllib2 发布一个小的实用工具-机票助手 test scribeFire 抓取网页、以及传输网络文件产生 “1ff8” 串的原因 C#和 C++ 关于exe中导出函数限制的疑惑 中秋节体验Xmanager,vnc - 康国庆--thinkinlove linux (ubuntu) 下双屏显示解决? linux下的pdf乱码解决方法 - 康国庆--thinkinlove 针对curl程序库静态链接的问题解决办法 稳定下来了继续写 - 康国庆--thinkinlove SICP:使我着了魔 - 康国庆--thinkinlove 显示器与程序员的效率 认真学习Lisp、FP - 康国庆--thinkinlove 工作之余的休闲假期 - 康国庆--thinkinlove Glusterfs分析报告
cryptoAPI
康国庆--thinkinlove · 2009-01-24 · via 博客园 - 康国庆--thinkinlove

公钥和私钥都是固定长度的二进制比特串(如目前常用的RSA公私钥长度为1024比特),从性质上来讲,他们都可以加解密,

只是人们根据使用的方式不同,将他们进行了区分,有些称为私钥,有些称为公钥。

另外,根据公私钥使用方式的不同,它们在数据加密和签名时的管理方式也不一样。

(1)数字签名

一个用户拥有一个数字证书(签名证书),里面包括一对密钥(公钥和私钥),私钥用于签名,公钥用于验证签名。

如果私钥被攻击者知道,就可以用你的私钥伪造你的签名,所以私钥的安全性要求较高,不允许进行备份(包括CA中心),

私钥丢失时,只能重新生成密钥对,旧的签名可以用备份的公钥进行验证。另外,用户可以自己生成密钥对,在证书注册时提交给CA中心即可。

(2)加解密

一个用户也拥有一个数字证书(加密证书),里面也包括一对密钥(公钥和私钥),私钥用于解密信息,公钥用于加密信息。

当用户A给用户B传送数据时,用户A 以外带的方式(如从CA中心)获取用户B的公钥,并用其加密,加密后的数据传送给用户B,

用户B收到后用私钥解密。加解密私钥要进行备份,否则,当私钥丢失时,以前加密的数据将无法解密。另外,

密钥对只能在注册时由CA中心产生,这个是国家安全政策的原因,国家必须能解密每个用户加密的所有信息。

注:加解密证书和签名证书虽然在本质上一样(密钥对的产生方式及结果一样,即从数学算法的角度考虑一样),

但因其用途的不同导致其安全策略的不同,所以不能混用。

CryptoAPI(一个应用程序编程接口)目的就是提供开发者在 Windows 下使用 PKI 的编
程接口。CryptoAPI 提供了很多函数,包括编码、解码、加密、解密、哈希、数字证书、
证书管理和证书存储等功能。对于加密和解密,CryptoAPI 同时提供基于会话密钥和公
钥/私钥对的方法。

CryptoAPI  2.0  中提供了管理和使用
证书的函数,另外,2.0 版本中也提供了编码和解码 PKCS#7(ASN.1)消息。

该API提供了基本加密函数,所有 CSP 的通讯都是通过这些函数。  
一个CSP 是实现所有加密操作的独立模块。在每一个应用程序中至少需要提供一个CSP。如果不选用CSP
该API会自动选用默认的CSP。
如果使用多于一个以上的 CSP,在加密函数调用中就要指定所需的 CSP。微软基本加密
提供者(Microsoft Base Cryptographic Provider),是缺省绑定到 CryptoAPI 里的。如果没有
指定其他 CSP 时,这个 CSP 就是却省的。  
每一个 CSP 对 CryptoAPI 提供了一套不同的实现。一些提供了更加强大的加密算法,
而其他一些 CSP 包含了对硬件的支持,比如智能卡。另外,一些 CSP 偶尔和使用者直接通

讯,比如数字签名就使用了用户的签名私钥。

以下是主要API功能:

CryptAcquireContext
获得CSP的函数接口
CryptReleaseContext  
释放。。
CryptEnumProviderTypes  
枚举CSP类型

密钥产生函数创建、配置和销毁加密密钥。他们也用于和其他用户进行交换密钥。

CryptDeriveKey
从一个密码中派生一个密钥
CryptDestoryKey
销毁密钥
CryptDuplicateKey
制作一个密钥和密钥状态的精确复制
CryptExportKey
把 CSP 的密钥做成 BLOB 传送到应用程序的内存空间中
CryptGenKey
创建一个随机密钥
CryptGenRandom
产生一个随机数
CryptGetKeyParam
得到密钥的参数
CryptGetUserKey
得到一个密钥交换或签名密钥的句柄
CryptImportKey
把一个密钥 BLOB 传送到 CSP 中
CryptSetKeyParam
指定一个密钥的参数

编码/解码函数:
CryptDecodeObject
对 lpszStructType 结构进行解码
CryptDecodeObjectEx
对 lpszStructType 结构进行解码,此函数支持内存分配选项
CryptEncodeObject
对 lpszStructType 结构进行编码
CyptEncodeObjectEx
对 lpszStructType 结构进行编码,此函数支持内存分配选项

CryptEncrypt 和 CryptDecrypt 要求在被调用前指定一个密钥。
这个密钥可以由 CryptGenKey、CryptDeriveKey 或 CryptImportKey 产生。创建密
钥时要指定加密算法。CryptSetKeyParam 函数可以指定额外的加密参数。
CryptDecrypt
使用指定加密密钥来解密一段密文
CryptEncrypt
使用指定加密密钥来加密一段明文
CryptProtectData
执行对 DATA_BLOB 结构的加密
CryptUnprotectData

执行对 DATA_BLOB 结构的完整性验证和解密

计算哈希、创建和校验数字签名:
CryptCreateHash
创建一个空哈希对象
CryptDestoryHash
销毁一个哈希对象
CryptDuplicateHash
复制一个哈希对象
CryptGetHashParam
得到一个哈希对象参数
CryptHashData
对一块数据进行哈希,把它加到指定的哈希对象中
CryptHashSessionKey
对一个会话密钥进行哈希,把它加到指定的哈希对象中
CryptSetHashParam
设置一个哈希对象的参数
CryptSignHash
对一个哈希对象进行签名
CryptVerifySignature

校验一个数字签名

具体的代码可在msdn上和下面的网址找到

http://www.vckbase.com/document/viewdoc/?id=974

另外据有人在使用时,会有些许不兼容的情况,该同学列出了在xp下解密成功而2000下失败的情况。

cryptoAPI 适用于双边都是windows的情况,且证书操作比较频繁,可以尝试使用该API。

.NET 下面可以用System.Security.Cryptography 命名空间提供加密服务,

其中包括数据的安全编码和解码、哈希、随机数生成和消息身份验证。这个空间应该是CrpytoCom的实现。