- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
这个问题一直让我抓狂! :)我正在生成一对公钥/私钥对,但是当我加载私钥时出现错误。我正在使用 C。请注意,我确实在键上使用了密码“password”,它被设置为 #define 但我已经尝试将其作为字符串手动输入,没有任何区别。这是我生成 key 的方式:
FILE *fp;
OpenSSL_add_all_algorithms();
RSA *rsa=NULL;
unsigned char seed[KEYSIZE];
int i;
//Seed PRNG
srand(time(NULL));
RAND_bytes(seed, KEYSIZE - 1);
//Generate a key
if ((rsa=RSA_generate_key(KEYSIZE,65537,NULL,NULL)) == NULL) ERR_get_error();
//Write the public key
fp = fopen(pubkey,"w");
if (!PEM_write_RSA_PUBKEY(fp, rsa)) {
printf("Error writing public key\n"); exit(1);
}
fclose(fp);
//Write the private key
fp = fopen(privkey,"w");
if (!PEM_write_RSAPrivateKey(fp, rsa, EVP_des_ede3_cbc(), NULL, 0, NULL, PASSWORD))
{
printf("Error writing private key\n"); exit(1);
}
fclose(fp);
这成功完成,我最终在适当的地方找到了文件,它们看起来不错。我还使用这些文件在命令行上成功加密/解密,所以我知道它们有效!
这是我加载私钥的方式:
static void decrypt(int locale) {
FILE *key;
RSA *rsa;
key = fopen(PRIVATEKEY, "r");
if (key == NULL) perror("Error reading private key");
rsa = PEM_read_RSAPrivateKey(key, NULL, NULL, PASSWORD); // THIS BREAKS!
if (rsa == NULL) perror("Private Key not valid"); // I always get this error :(
if (rsa != NULL) RSA_free(rsa);
fclose(key);}
有什么建议吗?我浏览了源文件 rsa.c,这基本上就是他们在那里做的,除了他们使用 BIO 而不是 freads。不过,我不明白为什么我的方法行不通!
这是 strace
输出的相关部分:
open("/opt/evoting/keys/priv/mix1.priv", O_RDONLY) = 15
fstat64(15, {st_mode=S_IFREG|0644, st_size=1751, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb773c000
read(15, "-----BEGIN RSA PRIVATE KEY-----\n"..., 4096) = 1751
dup(2) = 16
fcntl64(16, F_GETFL) = 0x2 (flags O_RDWR)
fstat64(16, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 2), ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb773b000
_llseek(16, 0, 0xbfba00d0, SEEK_CUR) = -1 ESPIPE (Illegal seek)
write(16, "Private Key not valid: Resource "..., 56Private Key not valid: Resource temporarily unavailable ) = 56
close(16) = 0
munmap(0xb773b000, 4096) = 0
close(15) = 0
munmap(0xb773c000, 4096) = 0
此外,perror 会产生错误“资源不可用”。我不确定那是什么,但我将硬限制和软限制重新设置为非常高,但它什么也没做。我将该函数复制到它自己的文件中并对其进行了编译,它不会在那里产生错误(尽管它仍然无法读取 key )。
最佳答案
啊哈!好吧,我刚刚学到了很多关于解决这些问题的知识,希望它能帮助其他人。我的大部分信息来自这个线程:http://readlist.com/lists/openssl.org/openssl-users/2/10340.html
基本上我不需要使用 perror
而是使用 ERR_print_errors_fp(stderr)
。这给了我一个像这样的实际错误消息:
3077973640:error:0906B072:lib(9):func(107):reason(114):pem_lib.c:530:
然后我使用命令:openssl errstr 0906B072
并得到:
error:0906B072:PEM routines:PEM_get_EVP_CIPHER_INFO:unsupported encryption
这基本上让我回到了我指定 CBC: EVP_des_ede3_cbc() 的 key 对的创建,RSA 不支持它。好了!
关于c - PEM_read_RSAPrivateKey 在 C 中使用 OpenSSL 库解密时返回 "Illegal Seek",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12885680/
我使用 openssl 库编写了简单的 RSA key 函数。以下是我的代码,我找不到第二个 PEM_read_RSAPrivateKey 函数不起作用的原因。有人可以帮助我吗? { RSA*
我以这种方式使用 PEM_read_RSAPrivateKey 函数: void test(void) { RSA * privateKey = NULL; FILE * fp;
这个问题一直让我抓狂! :)我正在生成一对公钥/私钥对,但是当我加载私钥时出现错误。我正在使用 C。请注意,我确实在键上使用了密码“password”,它被设置为 #define 但我已经尝试将其作为
我是一名优秀的程序员,十分优秀!