#include <openssl/rsa.h>
#include <openssl/evp.h>
#pragma comment(lib, "libeay32.lib")
DWORD ReadBufferFromFile(LPCSTR lpFileName, PBYTE pBuffer, PDWORD pdwLength)
{
if (NULL == lpFileName
|| NULL == pBuffer
|| NULL == pdwLength)
{
return -1;
}
//----------------------------------------------------------------
// 0. Local variables declaration
DWORD nbytes = 0;
HANDLE hFile = NULL;
DWORD dwBufferLen = *pdwLength;
DWORD dwFileLen = 0;
//----------------------------------------------------------------
// 1. Read certificate to buff
// This certificate contains certificate info (CI) and digital signature (DS)
hFile = CreateFileA(lpFileName, GENERIC_READ, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
if (hFile == INVALID_HANDLE_VALUE)
{
return -1;
}
dwFileLen = GetFileSize(hFile, NULL);
*pdwLength = dwFileLen;
if (dwBufferLen >= dwFileLen)
{
ReadFile(hFile, pBuffer, dwFileLen, &nbytes, NULL);
}
else
{
if (hFile != NULL)
{
CloseHandle(hFile);
}
return -1;
}
if (hFile != NULL)
{
CloseHandle(hFile);
}
return 0;
}
void FlipBuffer(unsigned char *pBuf, unsigned long ulLen)
{
if(0 == ulLen)
{
return;
}
//char tmp;
unsigned char ucTemp;
for(unsigned long i = 0; i < ulLen >> 1; ++i)
{
ucTemp = pBuf[i];
pBuf[i] = pBuf[ulLen - i - 1];
pBuf[ulLen - i - 1] = ucTemp;
}
}
void MSkeyConvertToOpenSSLKey(const char* filename, RSA& Rsa)
{
if (NULL == filename)
{
return;
}
unsigned char byPrivateKeyBlob[2324] = {0};
DWORD dwPrvKeySize = sizeof(byPrivateKeyBlob);
ReadBufferFromFile(filename, byPrivateKeyBlob, &dwPrvKeySize);
BYTE *pszPubBlob = byPrivateKeyBlob;
RSAPUBKEY *rsapubkey = reinterpret_cast<RSAPUBKEY *>(pszPubBlob + sizeof(PUBLICKEYSTRUC));
BYTE *pE = (BYTE *)&(rsapubkey->pubexp);
DWORD dwElen = sizeof(DWORD);
DWORD dwModulusLen = rsapubkey->bitlen / 8;
DWORD dwPrimeLen = rsapubkey->bitlen/16;
BYTE *pOffset = pszPubBlob + sizeof(BLOBHEADER) + sizeof(RSAPUBKEY);
BYTE *pN = pOffset;
pOffset += dwModulusLen;
BYTE *pP = pOffset;
pOffset += dwPrimeLen;
BYTE *pQ = pOffset;
pOffset += dwPrimeLen;
BYTE *pP1 = pOffset;
pOffset += dwPrimeLen;
BYTE *pQ1 = pOffset;
pOffset += dwPrimeLen;
BYTE *pPQ = pOffset;
pOffset += dwPrimeLen;
BYTE *pD = pOffset;
pOffset += dwModulusLen;
FlipBuffer(pE, dwElen);
FlipBuffer(pN, dwModulusLen);
FlipBuffer(pP, dwPrimeLen);
FlipBuffer(pQ, dwPrimeLen);
FlipBuffer(pP1, dwPrimeLen);
FlipBuffer(pQ1, dwPrimeLen);
FlipBuffer(pPQ, dwPrimeLen);
FlipBuffer(pD, dwModulusLen);
while(0x00 == *pE)
{
pE = pE + 1;
dwElen = dwElen - 1;
}
BIGNUM *pBE = BN_new();
pBE = BN_bin2bn(pE, dwElen, pBE);
BIGNUM *pBN = BN_new();
pBN = BN_bin2bn(pN, dwModulusLen, pBN);
BIGNUM *pBP = BN_new();
pBP = BN_bin2bn(pP, dwPrimeLen, pBP);
BIGNUM *pBQ = BN_new();
pBQ = BN_bin2bn(pQ, dwPrimeLen, pBQ);
BIGNUM *pBP1 = BN_new();
pBP1 = BN_bin2bn(pP1, dwPrimeLen, pBP1);
BIGNUM *pBQ1 = BN_new();
pBQ1 = BN_bin2bn(pQ1, dwPrimeLen, pBQ1);
BIGNUM *pBPQ = BN_new();
pBPQ = BN_bin2bn(pPQ, dwPrimeLen, pBPQ);
BIGNUM *pBD = BN_new();
pBD = BN_bin2bn(pD, dwModulusLen, pBD);
Rsa.n = pBN;
Rsa.e = pBE;
Rsa.p = pBP;
Rsa.q = pBQ;
Rsa.dmp1 = pBP1;
Rsa.dmq1 = pBQ1;
Rsa.iqmp = pBPQ;
Rsa.d = pBD;
}
void OpenSSLGenFileHash()
{
RSA* rsa = RSA_new();
MSkeyConvertToOpenSSLKey("Test_1024_Key.prv", *rsa);
const EVP_MD* algrothm = EVP_sha1();
EVP_MD_CTX mdctx;
EVP_MD_CTX_init(&mdctx);
EVP_DigestInit_ex(&mdctx, algrothm, NULL);
byte file[512] = {0};
DWORD dwFileSize = sizeof(file);
ReadBufferFromFile("PublicKey.bin", file, &dwFileSize);
EVP_DigestUpdate(&mdctx, file, dwFileSize);
BYTE signValue[128] = {0};
UINT signLen = 0;
EVP_DigestFinal_ex(&mdctx, signValue, &signLen);
EVP_MD_CTX_cleanup(&mdctx);
RSA_free(rsa);
}
分享到:
相关推荐
"openSSL open source for SSL" 的标题明确指出 OpenSSL 是一个开放源代码的解决方案,专为 SSL 和 TLS 协议设计。 SSL(Secure Socket Layer)是早期的网络通信加密标准,而 TLS(Transport Layer Security)是其...
OpenSSL 是一个强大的安全套接层(SSL/TLS)和通用加密库,广泛应用于网络通信、数据保护以及安全相关的软件开发。它包含了多种加密算法、常用的哈希函数以及证书管理功能,使得开发者能够轻松实现数据的加密解密、...
1. **安全传输**:OpenAS2支持使用SSL/TLS协议进行端到端的数据加密,保护信息在传输过程中的安全,防止被窃听或篡改。 2. **数字签名**:通过MD5或SHA-1等哈希算法生成的消息摘要与文件一起发送,接收方可以通过...
摘要:Java源码,文件操作,数据压缩,文件传输 Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出...
Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...
Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...
Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...
Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...
摘要:Java源码,文件操作,数据压缩,文件传输 Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出...
**信息摘要算法**的`digest.c`文件和`m_*.c`文件组成了EVP系列的信息摘要功能,支持MD5、SHA1等多种摘要算法。 **信息编码算法**的`encode.c`文件提供了ASCII和二进制之间的转换,这对于网络传输中数据格式的标准化...
因此,对于需要高度安全性的场合,如数字签名和SSL证书,MD5已被更安全的算法如SHA-256取代。 5. **替代方案** 为了克服MD5的局限,现在推荐使用更强的哈希函数,如SHA-2系列(SHA-256、SHA-512等)。这些算法提供...
Python FTP文件传输功能涉及的主要知识点包括FTP协议、Python的socket编程、文件操作以及数据完整性校验。...- 安全性:使用更安全的SFTP(SSH文件传输协议)或FTPS(FTP over TLS/SSL)代替纯FTP,保护数据安全。
HMAC-SHA1是使用SHA1哈希函数的特定实现,SHA1是一种广泛使用的哈希函数,能对任意长度的信息产生160位的摘要值。 在OpenSSL库中,HMAC功能由`HMAC_CTX`结构体和相关API提供。在VC6.0环境下,我们需要先下载并安装...
- **OpenPGP支持**:BouncyCastle还支持OpenPGP标准,可以用于实现端到端加密和身份验证。 使用BouncyCastle时,需要注意兼容性和版本问题,因为不同版本的BouncyCastle可能对某些算法的支持程度不同。在Android中...
10. **文件上传**:在POST请求中,可以使用`files`参数来上传文件,例如`requests.post(url, files={'file': open('filename', 'rb')})`。 11. **SSL/TLS安全**:requests库默认启用安全套接层(SSL/TLS),并支持...
2. **开发库**:`lib`目录中的库文件(.lib和.dll)是用于在Windows平台下开发支持SSL/TLS的应用程序的。开发者可以通过这些库链接到他们的C或C++项目中,实现网络通信的安全加密。例如,`libeay32.lib`和`ssleay32....
- **创建数据库**: `NDBM_open`。 - **插入数据**: `NDBM_insert`。 - **查找数据**: `NDBM_fetch`。 **10.4 编程示例** - **示例**: 创建数据库、插入数据、查找数据等。 #### 十一、大数 **11.1 介绍** - **...
5. **文件上传**:通过提供file-like对象,可以方便地将文件上传到服务器,例如`files={'file': open('myfile.txt', 'rb')}`。 6. **自动处理重定向**:requests库会自动处理HTTP状态码为3xx的重定向,除非你手动...
Bouncy Castle是一个开放源代码的安全项目,提供了一整套安全服务,包括加密算法、证书和证书路径验证、SSL/TLS协议以及PKCS#7、PKCS#12、OpenPGP等格式的支持。它是Java社区中广泛使用的加密库,因为它的实现通常比...