非ie百度云插件 apikey能使用cryptapi中函数吗

加密技术(20)
一: Creating a Key Container and Generating Keys
创建一个密钥容器,在进行加密,解密文件,并且签名的时候,必须需要一个公/私钥对,下面我们就来创建默认的密钥容器,要注意的是创建密钥容器并不会自动产生公/私钥对.
下面是我们程序的任务:
1,假如密钥容器不存在则创建一个。
2,假如签名密钥不存在则在密钥容器里创建一个。
3,假如交换密钥不存在则在密钥容器里创建一个。
4,获取CSP中的一些参数
下面是具体的步骤:
1,连接缺省的CSP
BOOL WINAPI CryptAcquireContext(
HCRYPTPROV* phProv,
LPCTSTR pszContainer, //in
LPCTSTR pszProvider,
DWORD dwProvType,
DWORD dwFlags
第一个参数是返回的CSP句柄,第二个是密钥容器的名字,第三个是A null-terminated string that specifies the name of the CSP to be used.第四个是指定提供的类型。目前已经有9中CSP类型。如下表所示
例如:CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 0));
如果当前机器的未曾设置过缺省的密钥容器,因此必须为机器创建缺省的密钥容器。
CryptAcquireContext( &hCryptProv, UserName, NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET)大家有没有看到,只是最后一个参数不同而已,多了一个CRYPT_NEWKEYSET而已。
2,取得CSP的参数
BOOL WINAPI CryptGetProvParam(
HCRYPTPROV hProv,
DWORD dwParam,
BYTE* pbData,
DWORD* pdwDataLen,
DWORD dwFlags
第一个参数是CSP的句柄,第二个参数是需要取得的具体参数对象(类型比较多,具体请看MSDN)。
例子:CryptGetProvParam(hCryptProv, PP_CONTAINER, (BYTE *)szUserName, &dwUserNameLen, 0)
3,函数返回所获取密钥类型的句柄(0表失败,非0表成功)
BOOL WINAPI CryptGetUserKey(
HCRYPTPROV hProv,
DWORD dwKeySpec,
HCRYPTKEY* phUserKey
参数比较简单,只谈谈第二次参数,它可以是AT_KEYEXCHANGE(交换密钥) or AT_SIGNATURE(签名密钥),例如:
CryptGetUserKey(hCryptProv,AT_KEYEXCHANGE,&hKey)
4,产生一个随机的交换密钥或者公/私钥对
BOOL WINAPI CryptGenKey(
HCRYPTPROV hProv,
ALG_ID Algid,
DWORD dwFlags,
HCRYPTKEY* phKey
ALG_ID 表明产生私钥所使用的算法。有如下参数:
微软提供的基本算法
CALG_MD2,CALG_MD5,CALG_SHA,CALG_SHA1,CALG_MAC,CALG_HMAC,CALG_SSL3_SHAMD5,CALG_MD2,CALG_MD2
CALG_RSA_SIGN,CALG_RSA_KEYX,CALG_RC2,CALG_RC4,CALG_DES
微软提供的增强型算法:
CALG_MD2,CALG_MD5,CALG_SHA,CALG_SHA1
CALG_MAC,CALG_HMAC ,CALG_SSL3_SHAMD5,CALG_RSA_SIGN,CALG_RSA_KEYX,CALG_RC2,CALG_RC4,CALG_DES,CALG_3DES_112,CALG_3DES
使用DH的CSP有如下两个参数,CALG_DH_EPHEM,CALG_DH_SF
使用公开密钥算法:AT_KEYEXCHANGE,AT_SIGNATURE
dwFlags,,表示密钥使用的长度,参数可以为0,采用默认的密钥长度。或者是进行如下几个参数的或:
CRYPT_ARCHIVABLE:表示在句柄在关闭之前都能够被导出
CRYPT_CREATE_SALT:表示密钥按照一个salt value来随机产生。
CRYPT_EXPORTABLE:表示密钥可以从CSP中导出到BLOB,因为会话密钥产生是必须可导出的,所以必须设置
CRYPT_NO_SALT:表示没有SALT VALUE获取allocated for a forty-bit symmetric key
CRYPT_PREGEN:表示在DH或者DSS密钥产生必须有个初始化。
例如:CryptGenKey(hCryptProv,AT_KEYEXCHANGE,0,&hKey)
5,释放CSP句柄
BOOL WINAPI CryptReleaseContext(
HCRYPTPROV hProv,
DWORD dwFlags //保留字,现在必须为0
6,为CSP增加一个reference count
(用来跟踪COM对象的整数值,当对象创建,值为1。每次对对象的操作都将增加,而对对象的关闭将减少,当值为0是,对象释放,所以与对象相关操作将无效)
BOOL WINAPI CryptContextAddRef(
HCRYPTPROV hProv,
DWORD* pdwReserved,
//保留字,必须为NULL
DWORD dwFlags
//保留字,必须为0
二:Deriving a Session Key from a Password
1,连接CSP
2,使用CryptCreateHash产生一个空的HASH对象
3,对密码进行HASH处理
4,释放HASH以及密码对象
5,释放CSP
下面是具体的步骤:
1,CryptCreateHash初始化一个HASH对象
BOOL WINAPI CryptCreateHash(
HCRYPTPROV hProv,
ALG_ID Algid,
HCRYPTKEY hKey,
DWORD dwFlags,
//in保留字,必须为0
HCRYPTHASH* phHash //out
第二个参数是指定HASH算法,有CALG_HMAC,CALG_MAC,CALG_MD2,CALG_MD5,CALG_SHA,CALG_SHA1,CALG_SSL3_SHAMD5。第三个参数对于那些keyed hash,例如HMAC,MAC算法。但是nonkeyed算法,必须设置为0。
2,CryptHashData对数据使用HASH
BOOL WINAPI CryptHashData(
HCRYPTHASH hHash,
//in,HASH对象句柄
BYTE* pbData,
//in,待HASH的数据
DWORD dwDataLen,
//in,待HASH数据的长度,当dwFlags为CRYPT_USERDATA为0时,必须为0
DWORD dwFlags
//in,一般为0,或者为CRYPT_USERDATA(用在用户进入系统时需要输入PIN)
3,CryptDeriveKey从某一数据产生会话密钥。
有点类似CryptGenKey,但是产生的会话密钥来自固定数据,而CryptGenKey是随机产生的。并且不能产生公/私钥对
BOOL WINAPI CryptDeriveKey(
HCRYPTPROV hProv,
//in,CSP句柄
ALG_ID Algid,
//in,指定的算法,类似CryptGenKey
HCRYPTHASH hBaseData,
//in,HASH对象的句柄
DWORD dwFlags,
//in,指定产生密钥的类型
HCRYPTKEY* phKey
//in,out产生的密钥句柄地址
例如:CryptDeriveKey(hCryptProv, CALG_RC2, hHash, CRYPT_EXPORTABLE, &hKey)
4,CryptDestroyHash(hHash);
5, CryptDestroyKey(hKey);
6, 在这里发现一个不错的函数,就是那种提示输入密码的命令行
&span style="font-size:16"&
void GetConsoleInput(char* strInput, int intMaxChars)
char minChar = ' ';
minChar++;
ch = getch();
while (ch != '\r')
if (ch == '\b' && strlen(strInput) & 0)
strInput[strlen(strInput)-1]
printf("\b \b");
else if (ch &= minChar && strlen(strInput) & intMaxChars)
strInput[strlen(strInput)+1] = '\0';
strInput[strlen(strInput)]
putch('*');
ch = getch();
putch('\n');
三:Duplicating,setting and getting Session key
2,使用CryptGenKey产生一个会话密钥
3,CryptDuplicateKey复制会话密钥
4,CryptSetKeyParam改变密钥产生的过程
5,CryptGenRandom产生随机数
具体过程。
1,CryptDuplicateKe复制会话密钥
BOOL WINAPI CryptDuplicateKey(
HCRYPTKEY hKey,
//in 会话密钥句柄
DWORD* pdwReserved,
//in 保留字,必须为NULL
DWORD dwFlags,
//in 保留字,必须为0
HCRYPTKEY* phKey
//out 新的会话密钥
2,CryptSetKeyParam定制会话密钥的参数
BOOL WINAPI CryptSetKeyParam(
HCRYPTKEY hKey,
DWORD dwParam,
//in 很多,具体请看MSDN
BYTE* pbData,
DWORD dwFlags
只有在dwParam=KP_ALGID才被使用
例如CryptSetKeyParam(hOriginalKey, KP_MODE, (BYTE*)&dwMode, 0)(dwMode = CRYPT_MODE_ECB)
3,CryptGenRandom为空间产生随机字节
BOOL WINAPI CryptGenRandom(
HCRYPTPROV hProv,
DWORD dwLen,
//需要产生的随机比特数
BYTE* pbBuffer
//需要返回数据的空间,这个pbBuffer可以等于CryptSetKeyParam的pbData
例如:CryptGenRandom(hCryptProv, 8, pbData)
4,CryptGetKeyParam获取密钥的一些参数
BOOL WINAPI CryptGetKeyParam(
HCRYPTKEY hKey,
DWORD dwParam,
//in,参数众多
BYTE* pbData,
//out,获取BYTE数据的指针
DWORD* pdwDataLen, //out,获取BYTE数据的长度
DWORD dwFlags
//关键字,必须为0
例如:CryptGetKeyParam(hKey, KP_IV, pbData, &dwCount, 0)
四:Exporting a Session Key
2,CryptGetUserKey获取公/私钥对和交换密钥,公私钥用来签名,而交换密钥用来导出会话密钥
3,CryptGenKey产生会话密钥
4,CryptExportKey创建简单包含有会话密钥的key BLOB
5,释放处理:
具体过程:
1,CryptExportKey函数导出密钥
BOOL WINAPI CryptExportKey(
HCRYPTKEY hKey,
//需要导出的密钥句柄
HCRYPTKEY hExpKey,
//将待导出密钥用交换密钥进行加密,假如是公开的BLOG当然就设置为0
DWORD dwBlobType,
//指定导出的密钥BLOB类型。六个参数见MSDN
DWORD dwFlags,
//CRYPT_DESTROYKEY,CRYPT_SSL2_FALLBACK,CRYPT_OAEP
BYTE* pbData,
//导出的数据指针,以后就可以将这个数据写如磁盘或者别的任务。
DWORD* pdwDataLen
//导出的数据长度
例如:CryptExportKey(hKey, hXchgKey, SIMPLEBLOB, 0, pbKeyBlob, &dwBlobLen)
2,CryptImportKey将密钥从BLOB转换到CSP中
BOOL WINAPI CryptImportKey(
HCRYPTPROV hProv,
BYTE* pbData,
//待转换的BLOB数据
DWORD dwDataLen,
//待转换的数据长度
HCRYPTKEY hPubKey, //对BLOB解密的公钥,譬如上面是用交换密钥密钥加密的,就用交换密钥解密
DWORD dwFlags,
//目前还只应用在当一对公/私钥从PRIVATEKEYBLOB中加入CSP中这种情况。
HCRYPTKEY* phKey
//out导入的密钥
例如:CryptImportKey(hProv,pbKeyBlob,dwBlobLen,0,0,&hPubKey)
五:Encoding and Decoding Messages
编码的处理过程
1,将待编码的数据转化为合适的格式,使用
2,调用CryptMsgOpenToEncode,passing th
3, 调用CryptMsgUpdate函数多次,最后一次调用时,将final参数设置为true
4, 调用CryptMsgGetParam来获取一个需要得到的参数。
5, 调用CryptMsgClose来关闭消息
解码的处理过程
1,检查申请的放编码后数据的空间,利用函数CryptMsgCalculateEncodedLength.
2,调用函数CryptMsgOpenToDecode,passing the necessary argument;
3,调用CryptMsgUpdate一次,这将导致合适的动作去处理信息,以来于信息的格式
4,一些额外的处理,例如额外的解密或者是验证,调用CryptMsgControl,
5,调用CryptMsgGetParam来获取需要得到的参数
6,调用CryptMsgClose来关闭消息
具体的函数介绍:
1,CryptMsgCalculateEncodedLength计算所需要的存储编码的最大空间值
DWORD WINAPI CryptMsgCalculateEncodedLength(
DWORD dwMsgEncodingType,//指定编码类型。一般为X509_ASN_ENCODING|PKCS_7_ASN_ENCODING
DWORD dwFlags,
DWORD dwMsgType,
const void* pvMsgEncodeInfo, //in 指向待编码的数据,数据类型依赖于dwMsgType
LPSTR pszInnerContentObjID,
DWORD cbData
//in 比特数的容量
第二个参数:CMSG_BARE_CONTENT_FLAG,CMSG_DETACHED_FLAG,CMSG_CONTENTS_OCTETS_FLAG,CMSG_CMS_ENCAPSULATED_CONTENT_FLAG
第三个参数:CMSG_DATA,CMSG_SIGNED,CMSG_ENVELOPED,CMSG_SIGNED_AND_ENVELOPED,CMSG_HASHED,CMSG_ENCRYPTED
第五个参数:szOID_RSA_data,szOID_RSA_signedData,szOID_RSA_envelopedData,szOID_RSA_signEnvData,szOID_RSA,digestedData ,
szOID_RSA_encryptedData,SPC_INDIRECT_DATA_OBJID,NULL
返回值:返回需要的一个加密信息所需要的长度
2,CryptMsgOpenToEncode打开一个消息以便进行编码,返回打开消息的句柄
HCRYPTMSG WINAPI CryptMsgOpenToEncode(
DWORD dwMsgEncodingType,
//指定编码类型。一般为X509_ASN_ENCODING|PKCS_7_ASN_ENCODING
DWORD dwFlags,
DWORD dwMsgType,
const void* pvMsgEncodeInfo,
LPSTR pszInnerContentObjID,
//和CryptMsgCalculateEncodedLength一样
PCMSG_STREAM_INFO pStreamInfo //当流没被使用时,该参数为NULL
第二个参数:CMSG_BARE_CONTENT_FLAG,CMSG_DETACHED_FLAG,CMSG_CONTENTS_OCTETS_FLAG,CMSG_CMS_ENCAPSULATED_CONTENT_FLAG,
CMSG_CRYPT_RELEASE_CONTEXT_FLAG
第三个参数:
CMSG_DATA(Not used),CMSG_SIGNED,CMSG_SIGNED_ENCODE_INFO,CMSG_ENVELOPED,CMSG_ENVELOPED_ENCODE_INFO
CMSG_SIGNED_AND_ENVELOPED(Not currently implemented),CMSG_HASHED
3,CryptMsgOpenToDecode打开一个消息以便进行解码,返回打开消息的句柄
CRYPTMSG WINAPI CryptMsgOpenToDecode(
DWORD dwMsgEncodingType,
//指定编码类型。一般为X509_ASN_ENCODING|PKCS_7_ASN_ENCODING
DWORD dwFlags,
//CMSG_DETACHED_FLAG,CMSG_CRYPT_RELEASE_CONTEXT_FLAG
DWORD dwMsgType, //CMSG_DATA,CMSG_ENVELOPED,CMSG_HASHED,CMSG_SIGNED,CMSG_SIGNED_AND_ENVELOPED
HCRYPTPROV hCryptProv,
//指定使用HASHING的句柄,一般设置为0
PCERT_INFO pRecipientInfo,//保留字,必须为NULL
PCMSG_STREAM_INFO pStreamInfo//假如流没被使用,必须为NULL
4,CryptMsgUpdate增加内容到加密信息中
BOOL WINAPI CryptMsgUpdate(
HCRYPTMSG hCryptMsg, //待更新的加密信息句柄
const BYTE* pbData,
//待编码/解码的数据
DWORD cbData,
// pbData 的数据长度
BOOL fFinal
第四个参数:当CMSG_DETACHED_FLAG没有设置,并且信息由CryptMsgOpenToDecode或CryptMsgOpenToEncode打开,那么fFinal被设置为TRUE,并且CryptMsgUpdate只被调用一次。当CMSG_DETACHED_FLAG被设置,并且信息由 CryptMsgOpenToEncode打开,那么仅在最后一次调用CryptMsgUpdate才被设置为TRUE。当CMSG_DETACHED_FLAG被设置,并且信息由CryptMsgOpenToDecode打开,那么仅在信息头单独被处理时CryptMsgUpdate才被设置为TRUE。
5,CryptMsgGetParam在数据编码/解码后获取参数
BOOL WINAPI CryptMsgGetParam(
HCRYPTMSG hCryptMsg,
//in 信息句柄
DWORD dwParamType,
//in 参数众多,参见MSDN
DWORD dwIndex,
//in 可适用的返回参数句柄,假如参数没有被获取,则被忽略或则为0
void* pvData,
//out 获取的数据指针
DWORD* pcbData
//in,out数据长度
6,CryptMsgClose关闭信息句柄
BOOL WINAPI CryptMsgClose(
HCRYPTMSG hCryptMsg
具体的例子:
&span style="font-size:16"&cbEncodedBlob = CryptMsgCalculateEncodedLength(
MY_ENCODING_TYPE,
CMSG_DATA,
cbContent))
hMsg = CryptMsgOpenToEncode(
MY_ENCODING_TYPE,
CMSG_DATA,
CryptMsgUpdate(
pbContent,
cbContent,
CryptMsgGetParam(
CMSG_BARE_CONTENT_PARAM,
pbEncodedBlob,
&cbEncodedBlob))
CryptMsgClose(hMsg);
hMsg = CryptMsgOpenToDecode(
MY_ENCODING_TYPE,
CMSG_DATA,
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:71459次
积分:2792
积分:2792
排名:第9262名
原创:204篇
转载:11篇
评论:12条IECertMngr 使用CryptAPI对IE证书进行操作的演示代码。 包含列举 、导出 、生成PFX证 Windows Kernel 系统编程 265万源代码下载-
&文件名称: IECertMngr& & [
& & & & &&]
&&所属分类:
&&开发工具: Visual C++
&&文件大小: 55 KB
&&上传时间:
&&下载次数: 187
&&提 供 者:
&详细说明:使用CryptAPI对IE证书进行操作的演示代码。代码包含列举IE证书、导出证书、生成PFX证书等功能。-CryptAPI certificate to use IE to operate on the demo code. Code contains the listed IE certificate, export certificate, the certificate generated PFX functions.
文件列表(点击判断是否您需要的文件,如果是垃圾请在下面评价投诉):
&&IECertMngr&&..........\&&..........\&&..........\&&..........\&&..........\&&..........\&&..........\&&..........\&&..........\&&..........\&&..........\&&..........\&&..........\&&..........\&&..........\IECertMngr.aps&&..........\IECertMngr.clw&&..........\&&..........\IECertMngr.dsp&&..........\IECertMngr.dsw&&..........\&&..........\IECertMngr.ncb&&..........\IECertMngr.opt&&..........\IECertMngr.plg&&..........\&&..........\&&..........\&&..........\ReadMe.txt&&..........\res&&&&..........\...\IECertMngr.rc2&&..........\resource.h&&..........\StdAfx.cpp&&..........\StdAfx.h
&[]:一般,勉强可用&[]:很好,推荐下载
&近期下载过的用户:
&相关搜索:
&输入关键字,在本站265万海量源码库中尽情搜索:
&[] - 基于CryptoAPI开发的操作系统和硬件CSP的工具,可以导入导出存储在系统中的p12证书,并能处理私钥文件的格式。
&[] - PKCS#11 读取USB KEY证书,对文件进行签名和验证。
&[] - 一个精简的CA程序,包含根证书创建、用户证书申请及创建、证书管理、证书撤销等许多功能。是了解CA及证书原理的好工具。
&[] - 这是一个delphi程序,演示的是读取数字证书公钥。需要安装用微软件的CSP。& 使用Windows CryptoAPI计算MD5
使用Windows CryptoAPI计算MD5
About Windows CryptoAPI: Application programming interface that enables application developers to add authentication, encoding, and encryption to Windows-based applications.
直接使用Windows提供的CryptAcquireContext、CryptCreateHash、CryptHashData、CryptGetHashParam等API就可以计算MD5了,稍微封装了一下,可以算文件或者字符串的MD5值,文件传入UNICODE类型字符串的路径,字符串使用普通的CHAR,因为UNICODE和非UNICODE算出来的MD5不一样(字符串看上去一样,实际的BYTE不一样)。
计算MD5的测试代码如下:
// Author: 代码疯子
// Blog: http://www.programlife.net/
#include &stdio.h&
#include &windows.h&
#include &Wincrypt.h&
#define CHECK_NULL_RET(bCondition) if (!bCondition) goto Exit0
#define BUFSIZE 1024
#define MD5LEN
BOOL GetContentMD5(
BYTE *pszFilePath,
BOOL bFile,
BOOL bUpperCase,
TCHAR *pszResult,
DWORD &dwStatus)
BOOL bResult = FALSE;
HCRYPTPROV hProv = 0;
HCRYPTHASH hHash = 0;
HANDLE hFile = NULL;
BYTE rgbFile[BUFSIZE];
DWORD cbRead = 0;
BYTE rgbHash[MD5LEN];
DWORD cbHash = 0;
CHAR rgbDigitsL[] = &abcdef&;
CHAR rgbDigitsU[] = &ABCDEF&;
CHAR *rgbDigits = bUpperCase ? rgbDigitsU : rgbDigitsL;
TCHAR szResult[MD5LEN*2+1] = {0};
dwStatus = 0;
bResult = CryptAcquireContext(&hProv,
PROV_RSA_FULL,
CRYPT_VERIFYCONTEXT);
CHECK_NULL_RET(bResult);
bResult = CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash);
CHECK_NULL_RET(bResult);
if (bFile)
hFile = CreateFile((TCHAR *)pszFilePath,
GENERIC_READ,
FILE_SHARE_READ,
OPEN_EXISTING,
FILE_FLAG_SEQUENTIAL_SCAN,
NULL);
CHECK_NULL_RET(!(INVALID_HANDLE_VALUE == hFile));
while (bResult = ReadFile(hFile, rgbFile, BUFSIZE,
&cbRead, NULL))
if (0 == cbRead)
bResult = CryptHashData(hHash, rgbFile, cbRead, 0);
CHECK_NULL_RET(bResult);
bResult = CryptHashData(hHash, pszFilePath, strlen((CHAR *)pszFilePath), 0);
CHECK_NULL_RET(bResult);
cbHash = MD5LEN;
if (bResult = CryptGetHashParam(hHash, HP_HASHVAL, rgbHash, &cbHash, 0))
TCHAR szTmpBuff[3] = {0};
for (DWORD i = 0; i & cbHash; i++)
swprintf(szTmpBuff, TEXT(&%c%c&), rgbDigits[rgbHash[i] && 4],
rgbDigits[rgbHash[i] & 0xf]);
lstrcat(szResult, szTmpBuff);
bResult = TRUE;
dwStatus = GetLastError();
CryptDestroyHash(hHash);
CryptReleaseContext(hProv, 0);
CloseHandle(hFile);
lstrcpy(pszResult, szResult);
return bResult;
int main(int argc, char* argv[])
DWORD dwStatus = 0;
TCHAR szResult[MD5LEN*2+1] = {0};
TCHAR szFilePath[] = TEXT(&C:\\Windows\\System32\\notepad.exe&);
CHAR szContent[] = &explorer.exe&;
GetContentMD5((BYTE *)szFilePath,
TRUE, TRUE, szResult, dwStatus);
MessageBox(NULL, szResult, TEXT(&MD5&), MB_OK);
GetContentMD5((BYTE *)szContent, FALSE, TRUE, szResult, dwStatus);
MessageBox(NULL, szResult, TEXT(&MD5&), MB_OK);
// explorer.exe的MD5为CDE09BCDF5FDE1E2EAC52C0F93362B79
作者:代码疯子(Wins0n) 本站内容如无声明均属原创,转载请保留作者信息与原文链接,谢谢!
您可能对下面的文章也感兴趣:
(推荐使用
(关于作者 Wins0n/代码疯子)
免责声明:本站所有内容仅代表个人观点,无法保证100%准确,如有错误请联系指正,谢谢!
2016年三月 &(1)
2016年二月 &(1)
2016年一月 &(1)
2015年十月 &(1)
2015年六月 &(2)
2015年四月 &(1)
2015年一月 &(1)
2014年十一月 &(5)
2014年十月 &(1)
2014年九月 &(1)
2014年八月 &(2)
2014年七月 &(3)
2014年六月 &(4)
2014年四月 &(1)
2014年三月 &(2)
2014年二月 &(1)
2014年一月 &(1)
2013年十二月 &(1)
2013年十一月 &(2)
2013年十月 &(2)
2013年九月 &(3)
2013年八月 &(2)
2013年七月 &(3)
2013年六月 &(2)
2013年五月 &(1)
2013年四月 &(4)
2013年三月 &(2)
2013年二月 &(1)
2013年一月 &(2)
2012年十二月 &(5)
2012年十一月 &(3)
2012年十月 &(3)
2012年九月 &(4)
2012年八月 &(4)
2012年七月 &(3)
2012年六月 &(3)
2012年五月 &(6)
2012年四月 &(4)
2012年三月 &(6)
2012年二月 &(4)
2012年一月 &(7)
2011年十二月 &(9)
2011年十一月 &(9)
2011年十月 &(13)
2011年九月 &(18)
2011年八月 &(8)
2011年七月 &(7)
2011年六月 &(16)
2011年五月 &(13)
2011年四月 &(21)
2011年三月 &(22)
2011年二月 &(15)
2011年一月 &(7)
2010年十二月 &(23)
2010年十一月 &(33)
2010年十月 &(35)
2010年九月 &(42)输入关键字或相关内容进行搜索
要实现支付宝商户接口开发,首先要很好的理解支付宝的相关资料,做移动支付的时候,我觉得以下三个文件的作用和用处需要理解;
rsa_private_key.pem、rsa_public_key.pem、 pkcs8.pem。
支付宝移动支付的时候,数据需要用rsa 进行加密。
这三个文件的生成办法:
windows 下 是打开你的php环境下的openssl 模块下的openssl.exe, 然后按照支付宝支付接口里的文档说明,按步骤生成 上面三个文件。这三个文件 ,是要和服务器环境保持一致的,如果你的接口运行的服务器更换了,那么要重新生成这三个文件。RSA密钥生成命令
生成RSA私钥
openssl&genrsa -out rsa_private_key.pem 1024
生成RSA公钥
openssl&rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
将RSA私钥转换成PKCS8格式
openssl&pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt
\n在linux 下,直接命令行openssl,也是按照以上方式生成。那么这三个文件的用法呢?
rsa_private_key.pem 是被用在把你订单数据post 给支付宝接口时 加密用的:
rsaSign 函数 是用这个rsa_private_key.pem 文件的函数
```javascript
function rsaSign($data, $private_key_path) {
$priKey = '-----BEGIN RSA PRIVATE KEY-----
这里是私钥字符串
-----END RSA PRIVATE KEY-----';
//file_get_contents($private_key_path);
$res = openssl_get_privatekey($priKey);
openssl_sign($data, $sign, $res);
openssl_free_key($res);
//base64编码
$sign = base64_encode($sign);
$sign = urlencode($sign);
rsa_public_key.pem 公钥文件用法:登陆支付宝商户中心,选择查看KEY ,会在这个页面里,支付宝有 上传你的公钥 和查看支付宝公钥的地方。
点击上传公钥链接,在弹出的对话框里,把 这个文件里的内容 (字符串部分) 填入 ,然后即可生成支付宝公钥。这个支付宝公钥 是用来 验证 从支付宝通知回来的消息是否正确的一个 公钥。在php 语言里 ,是这样写这个公钥的用法的:/**
* @param $data 待签名数据
* @param $ali_public_key_path 支付宝的公钥文件路径
* @param $sign 要校对的的签名结果
* return 验证结果
function rsaVerify($data, $ali_public_key_path, $sign)
$pubKey ='-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCnxj/9qwVfgoUh/y2W89L6BkRA
FljhNhgPdyPuBV64bfQNN1PjbCzkIM6qRdKBoLPXmKKMiFYnkd6rAoprih3/PrQE
B/VsW8OoM8fxn67UDYuyBTqA23MML9q1+ilIZwBC2AQ2UBVOrFXfFl75p6/B5Ksi
NG9zpgmLCUYuLkxpLQIDAQAB
-----END PUBLIC KEY-----';
//在支付宝的商机中心查看到的支付宝公钥
file_get_contents($ali_public_key_path);
$res = openssl_get_publickey($pubKey);
$result = (bool)openssl_verify($data, base64_decode($sign), $res);
openssl_free_key($res);
pkcs8.pem 文件的用法:这个 是当你做原生android开发的时候,发送给支付宝接口的订单数据 在客户端app里生成的时候,需要对订单数据 用pkcs8.pem里面的密钥进行加密;在Builder 开发支付插件时,不需要用这个文件,里的内容。因为 我们的订单数据是在服务器端,和接受支付宝回调通知消息的服务器端 放在一起。
一下是我调用支付插件 的完整页面代码,&!DOCTYPE HTML&
&meta charset=&utf-8&/&
&meta name=&viewport& content=&initial-scale=1.0, maximum-scale=1.0, user-scalable=no&/&
&meta name=&HandheldFriendly& content=&true&/&
&meta name=&MobileOptimized& content=&320&/&
&title&账号信息&/title&
&link rel=&stylesheet& href=&../css/mui.min.css&&
&link rel=&stylesheet& type=&text/css& href=&../css/style.css&/&
&link rel=&stylesheet& type=&text/css& href=&../css/page.css&/&
&link rel=&stylesheet& type=&text/css& href=&../css/feedback-page.css& /&
&!--页面主结构开始--&
&div id=&memberinfo& class=&mui-views&&
&div class=&mui-view&&
&div class=&mui-navbar&&
&div class=&mui-pages&&
&div id=&countinfo& class=&mui-page&&
&!--页面标题栏开始--&
&div class=&mui-navbar-inner mui-bar mui-bar-nav&&
&button type=&button& class=&mui-left mui-action-back mui-btn
mui-btn-link mui-btn-nav mui-pull-left&&
&span class=&mui-icon mui-icon-left-nav&&&/span&
&h1 class=&mui-center mui-title&&余额充值&/h1&
&!--页面标题栏结束--&
&!--页面主内容区开始--&
&div class=&mui-page-content&&
&div class=&mui-scroll-wrapper&&
&div class=&mui-scroll&&
&ul class=&mui-table-view&&
&li class=&mui-table-view-divider&&管理钱包&/li&
&li class=&mui-table-view-cell&&
我的钱包余额:&span class=&mui-pull-right&&
&b id=&info_money&&{{userfen}}&/b& 元&/span&
&div class=&mui-content-padded&&
&ul class=&mui-table-view&&
&li class=&mui-table-view-divider&&选择充值套餐:&/li&
&li class=&mui-table-view-cell mui-radio&&
&span&一年VIP套餐 1800元&/span&
&input type=&radio& name=&money&
value=&1800& /&
&li class=&mui-table-view-cell mui-radio&&
&span&十次信息发布 200元&/span&
&input type=&radio& name=&money&
value=&200& /&
&li class=&mui-table-view-divider&&
不需要套餐,充值其他金额&br/&请输入充值金额:单位(元)&/li&
&li class=&mui-table-view-cell&&
&input type=&number& name=&inputmoney&
placeholder=&请输入数字,比如:10&/&
&div class=&mui-content-padded& id=&button_div&&
&script src=&../js/mui.min.js &&&/script&
&script src=&../js/mui.view.js&&&/script&
&script src=&../js/zepto.min.js&&&/script&
&script src=&../js/config.js&&&/script&
&script src=&../js/vue.min.js&&&/script&
//初始化单页view
var viewApi = mui('#memberinfo').view({
defaultPage: '#countinfo'
//初始化单页的区域滚动
mui('.mui-scroll-wrapper').scroll();
var view = viewApi.
(function($) {
//处理view的后退与webview后退
var oldBack = $.
$.back = function() {
if (viewApi.canBack()) { //如果view可以后退,则执行view的后退
viewApi.back();
} else { //执行webview后退
oldBack();
//数据模型
var vmd = new Vue({
el : '#countinfo',
userfen : '',
//支付列表
var pay_channel =
mui.plusReady(function() {
//获取数据
var users = get_userinfo(true,'../');
var form_data = users[0];
//获取支付通道
plus.payment.getChannels(function(channels){
var str = '';
mui.each(channels, function(index, channel){
if(channel.id =='alipay'){
pay_channel =
str += '&a onclick=&orderpay(\''+ channel.id +'\')& class=&mui-btn mui-btn-warning mui-btn-block&& '+channel.description+'在线付款 &/a&';
document.getElementById('button_div').innerHTML =
},function(e){
plus.nativeUI.alert(&获取支付通道失败:&+e.message);
mui.ajax(_config.url + 'e/kbtool/member.php',{
data : form_data,
dataType : &json&,
type : 'POST',
success : function(json){
//console.log(JSON.stringify(json))
if(json.code ==1){
setinfo(json);
plus.nativeUI.alert('数据获取失败');
error : function(xhr, error){ plus.nativeUI.alert('数据获取失败') }
//支付宝获取订单信息
function orderpay(paytype)
var inputmoney = Zepto(&input[name='inputmoney']&).val();
var selectmoney = Zepto('input[name=&money&]:checked').val();
var paymoney = 0;
if(parseInt(inputmoney * 100) & 0){
paymoney =
if(parseInt(selectmoney) & 0){
paymoney =
if(parseInt(paymoney * 100) & 0){
//调用接口支付
serverpayapi(paytype, paymoney);
plus.nativeUI.alert(&请选择充值套餐,或者输入充值金额&);
function serverpayapi(paytype, paymoney)
var users = get_userinfo();
var form_data = users[0];
form_data.money =
//console.log(JSON.stringify(form_data))
mui.ajax(_config.url + 'e/kbtool/api.php?enews=alipay',{type:'POST',dataType : 'html',
data : {username : form_data.username, password : form_data.password, money : paymoney},
success: function(data){
app_pay_plus(data)
app_pay_plus(sign)
plus.payment.request(pay_channel, sign, function(result){
plus.nativeUI.alert(&支付成功!&,function(){
},function(error){
plus.nativeUI.alert(&支付失败:& + error.code);
//=========
function setinfo(json){
//填充表单
vmd.$data.userfen = json.data['userfen'] ;
//保存修改的资料
saveinfo()
{//获取数据
var users = JSON.parse( _localdata.getItem('$member') || '[]');
var form_data = $(&#form_info&).serialize_json();
form_data = $.extend(form_data, users[0]);
console.log(JSON.stringify(form_data))
mui.ajax(_config.url + 'e/kbtool/eidtinfo.php',{
data : form_data,
dataType : &json&,
type : 'POST',
success : function(json){
if(json.code ==1){
setinfo(json);
plus.nativeUI.toast('保存成功');
viewApi.back();
plus.nativeUI.toast('保存失败');
viewApi.back();
error : function(xhr, error){ plus.nativeUI.toast('数据获取失败') }
要回复问题请先或
关注: 4 人

我要回帖

更多关于 crypt api 的文章

 

随机推荐