访问违规写入位置

时间:2009-12-02 16:37:30

标签: c++ openssl rsa

我有以下代码:

#include <openssl/bn.h>
#include <openssl/rsa.h>

unsigned char* key;
RSA* rsa = RSA_new();
rsa = RSA_generate_key(1024,65537,NULL,NULL);
//init pubkey
key[BN_num_bytes(rsa->n)] = '\0';
BN_bn2bin(rsa->n, key);
printf("RSA Pub: %s\n", key);
RSA_free( rsa );
rsa = NULL;

调试器告诉我,我在行

上遇到了“访问冲突写入位置”的问题
key[BN_num_bytes(rsa->n)] = '\0';

如果我注释掉那一行,问题就会转移到

BN_bn2bin(rsa->n, key);

有关如何解决此问题的任何建议都会很棒。

4 个答案:

答案 0 :(得分:2)

由于key未指向任何内容,并且您使用数组表示法下标引用它,因此它就是源代码。密钥如何获得价值。你正在覆盖或践踏不属于你的其他内存块,因此被Windows捕获的“访问冲突”。仔细检查您的代码并确保变量已被malloc'd或new'd。

作为旁注,最好是你的理智宣称它是这样的

unsigned char *key = NULL;

通过这种方式,如果您尝试访问key而没有malloc'd / new'd,您将收到内存异常错误(可以轻松地将其固定到此)。考虑一下,它使调试变得更加容易。

希望这有帮助, 最好的祝福, 汤姆。

答案 1 :(得分:1)

您有访问冲突,因为您尝试使用空终止符分配密钥,但尚未为密钥分配任何内存。我们需要知道你想要完成什么。

答案 2 :(得分:1)

您没有为密钥分配任何内存 - 第一次使用时是您尝试将元素设置为0时。

答案 3 :(得分:0)

在这种情况下分配适量内存的正确解决方案是:

key = malloc(BN_num_bytes(rsa->n));
BN_bn2bin(rsa->n, key);