我正在尝试在C中使用
WinCrypt API.
我的应用程序需要密码,解密,签名和验证文件,一旦我有正确的密钥,我知道如何做到这一点.但我的问题实际上是,这与生成这些密钥的应用程序不同.
我所拥有的是PEM格式的文件中的公钥和私钥:
-----BEGIN RSA PRIVATE KEY-----
[Base64 encoded]
-----END RSA PRIVATE KEY-----
-----BEGIN RSA PUBLIC KEY-----
[Base64 encoded]
-----END RSA PUBLIC KEY-----
经过一些研究,我发现如何使用以下方法导入公钥:here和here:
> CreateFile& ReadFile读取文件内容
> CryptStringToBinary,使用CRYPT_STRING_BASE64HEADER将PEM格式转换为DER格式(从base64中删除页眉和页脚以及解码)
> CryptDecodeObjectEx with X509_PUBLIC_KEY_INFO
> CryptImportPublicKeyInfo,用于导入密钥
但现在,我的问题是用私钥做同样的事情.
任何帮助真的很感激:)
我正在尝试在C中使用WinCrypt API.我的应用程序需要密码,解密,签名和验证文件,一旦我有正确的密钥,我知道如何做到这一点.但我的问题实际上是,这与生成这些密钥的应用程序不同.我所拥有的是PEM格式的文件中的公钥和私钥:-----BEGIN RSA PRIVATE KEY-----[Base64 encoded]-----END RSA PRIVATE KEY-----而且:-----...
1、
打开
工程B,选择 项目 ->添加现有项,然后选择工程A的rc
文件
。
2、
导入
rc
文件
后,会在工程B的资源视图中看到自己的资源和工程A的资源。此时可以将需要拷贝的对话框复制,粘贴。
3、选中工程A的资源,然后选择 项目 -> 从项目中排除,即可。
当编译器出现
使用
的库与源码不匹配的报错时,处理方式如下:
1. 先看包含的源码的路径有没有正确包含进来,可是在代码中#include一个源码头
文件
试下是否正常。若不正常,则应该先查看下包含
文件
的路径是否正确包含。
2. 查看包含的新库的路径是否正常,确定引用的库是否全部引用!
微软在
win
crypt
.h中定义了大量的加解密算法的API,方便了软件加解密的实现,可以使我们不必关注密码学的算法,就可以实现高效率的软件加密。下面通过一个类,对API实现简单的封装。详细代码如下:
头
文件
:My
Crypt
Opt.h
#pragma once
#include "
win
dows.h"
#include "
win
crypt
.h"
#define MY_EN
不说废话了,直接上代码了。。。
/*按行读取一个
pem
文件
所有字符并拼接为一整个字符串返回,去除首行、尾行及换行符*/
char* Load
Pem
File(char*
pem
FilePath,int* length)
FILE* file;
size_t size = 0;
char* buff;
file = fopen(
pem
FilePath,"rb");
if(file==NULL)
return NULL;
在
C语言
中
使用
RSA
私钥
解密文本的步骤如下:
1. 首先,需要获取RSA
私钥
,
私钥
通常以
文件
的形式存储。
使用
C语言
的
文件
读取函数,如fopen和fread,读取
私钥
文件
的内容,并将其存储在一个变量中。
2. 将密文文本也读取到一个变量中。
3.
使用
C语言
的RSA库,加载
私钥
。可以
使用
openssl库或者其他类似的库。根据加载
私钥
的函数接口,将存储
私钥
的变量作为参数传递给该函数。加载成功后,
私钥
将被存储在内存中的一个结构体中,可以进行后续的解密操作。
4.
使用
加载的
私钥
,调用解密函数对密文进行解密。解密函数的接口可能会要求传入待解密的密文以及一些其他选项。根据具体的库和函数接口,将存储密文的变量以及其他选项作为参数传递给解密函数。解密函数将返回明文信息。
5. 将解密后的明文信息进行处理,比如打印到屏幕上或存储到一个
文件
中。
需要注意的是,RSA
私钥
解密的过程中可能会涉及到一些异常处理的操作,比如加解密错误、内存不足等。因此,在实际的
C语言
代码中,需要进行适当的错误处理和异常判断。
以上是
使用
C语言
进行RSA
私钥
解密文本的基本步骤,具体的实现和细节可能会根据所采用的RSA库和函数接口而有所差异。
### 回答2:
使用
RSA
私钥
解密文本在
C语言
中可以通过以下步骤完成。
首先,我们需要将
私钥
及待解密的密文
导入
到C程序中。
私钥
通常以
PEM
格式
存储在一个
文件
中,我们可以
使用
OpenSSL库中的函数来读取
私钥
文件
并将其存储在内存中。
接着,我们需要
使用
OpenSSL库中的函数将
PEM
格式
的
私钥
转换为RSA结构体。然后,我们可以
使用
RSA结构体中的
私钥
成员变量进行解密操作。
在读取待解密的密文之后,我们可以
使用
RSA
私钥
对其进行解密操作。
使用
OpenSSL库中提供的函数,我们可以将密文中的每个密文块(通常为128字节)传递给解密函数,并将解密后的明文保存在一个缓冲区中。
解密过程完成后,我们就可以
使用
得到的明文数据进行进一步的处理。如果需要保存解密后的明文到
文件
中,我们可以
使用
文件
操作相关的函数来实现。
需要注意的是,在
使用
OpenSSL库的过程中,我们需要包含相关的头
文件
,并链接相应的库
文件
。
总结起来,
使用
RSA
私钥
解密文本在
C语言
中的主要步骤包括:
导入
私钥
文件
、转换
私钥
格式
、读取待解密的密文、
使用
私钥
进行解密、处理解密后的明文。当然,为了更好地理解整个过程以及具体实现方式,建议查阅相关的
C语言
和OpenSSL库的文档及示例代码。
### 回答3:
在
C语言
中,要
使用
RSA
私钥
解密文本,可以
使用
OpenSSL库来实现。下面是一个简单的步骤:
1. 引入OpenSSL库:
#include <openssl/rsa.h>
#include <openssl/
pem
.h>
2. 读取
私钥
文件
:
FILE* file = fopen("private_key.
pem
", "rb");
RSA* rsa = RSA_new();
rsa =
PEM
_read_RSAPrivateKey(file, &rsa, NULL, NULL);
fclose(file);
3. 读取密文并解密:
unsigned char* ciphertext; // 存储密文的一个字符数组
int ciphertext_len; // 密文长度
unsigned char* plaintext; // 存储解密后的明文的一个字符数组
// TODO: 从
文件
或其他来源读取密文,并获取其长度
int plaintext_len = RSA_private_de
crypt
(ciphertext_len, ciphertext, plaintext, rsa, RSA_PKCS1_PADDING);
4. 处理解密结果:
if (plaintext_len == -1) {
// 解密失败
ERR_print_errors_fp(stderr);
// 可以添加处理错误的逻辑
} else {
// 解密成功
printf("解密后的明文:\n%s\n", plaintext);
// 内存释放
RSA_free(rsa);
free(ciphertext);
free(plaintext);
上述代码仅为示例,实际
使用
中可能需要进行适当的修改和改进。同时,还需要确保正确引入OpenSSL库,并正确配置编译环境。