相关疑难解决方法(0)

为什么OPENSSL_cleanse看起来如此复杂且线程不安全?

这是OpenSSL 1.0.1i中OPENSSL_cleanse的实现

unsigned char cleanse_ctr = 0;

void OPENSSL_cleanse(void *ptr, size_t len)
{
    unsigned char *p = ptr;
    size_t loop = len, ctr = cleanse_ctr;
    while(loop--)
    {
        *(p++) = (unsigned char)ctr;
        ctr += (17 + ((size_t)p & 0xF));
    }
    p=memchr(ptr, (unsigned char)ctr, len);
    if(p)
        ctr += (63 + (size_t)p);
    cleanse_ctr = (unsigned char)ctr;
}
Run Code Online (Sandbox Code Playgroud)

它看起来很复杂且线程不安全(通过读写全局变量cleanse_ctr).有人可以解释一下这个实现吗?用户是否需要关注其中可能的数据竞争?

c multithreading openssl

7
推荐指数
2
解决办法
2861
查看次数

错误:"在OpenSSL 1.1.0中无效使用不完整类型'RSA {aka struct rsa_st}"

我有旧的代码,用于链接旧版本的openssl.此代码的一部分从PEM文件加载密钥,并尝试通过使用以下代码来了解此密钥是私钥还是公钥:

if( (prv->p==0 || prv->q==0) ) {
    // This is not a private key!
    throw error("No private key for decryption");
}
Run Code Online (Sandbox Code Playgroud)

使用最新版本的openssl,这(有理由)不编译:

crypto.cpp: In function ‘key* decrypt_header(file_t, RSA*)’:
crypto.cpp:158:13: error: invalid use of incomplete type ‘RSA {aka struct rsa_st}’
     if( (prv->p==0 || prv->q==0) ) {
             ^~
Run Code Online (Sandbox Code Playgroud)

我理解直接访问struct的私有成员被替换为一个函数,但我很难搞清楚哪个函数是什么.

c openssl

5
推荐指数
2
解决办法
6673
查看次数

是否可以通过分配内存来恢复秘密数据(例如用于解密的空闲内存中的RSA私钥)?

例如,让我们采用伪代码,该伪代码尝试free使用此方法将RSA私钥存储在已分配(然后是d)的内存中:

int main(){
    bigNum priKey;


    while(true) {
        void *mem = malloc(2024); //allocate a good amount of chunk

        if(rsaKeyIn(mem, &priKey))
            break;
    }

    printf("RSA PRK found: %s", priKey.getText())

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

问题:这可能吗?还是有可能恢复其他秘密数据?

还是free为了安全起见,操作系统将'd内存归零?如果不是这种情况,我们应该在释放内存之前手动用零填充已分配的内存吗?

c malloc cryptography

5
推荐指数
1
解决办法
99
查看次数

标签 统计

c ×3

openssl ×2

cryptography ×1

malloc ×1

multithreading ×1