OpenSSL坑点记录

Posted on 2019-11-07 19:59  Volcano3511  阅读(622)  评论(0编辑  收藏  举报

TOC

OpenSSL 内置的API的类型和方法有很多,实现同一个功能的有很多API,要搞清这些API的用法和区别还是要时间的,因为不同的API的具体用法还是要自己去试试的

总结一下坑点:

  • openssl的RSA两种公钥格式
    需要不同的API来读取
    在用命令行生成的时候需要加上不同的选项
  • 关于MD5生成
    好像有两种,有一种比较复杂:
    有init()、update()、还有一个结束的函数,忘了名字

我用的是简单的实现,就是一个MD5(),看网上,这个简单的函数底层也是调用上面复杂的函数实现的

而且在进行MD5生成的时候,用sizeof和strlen的结果都可能是不同的

  • 关于RSA加解密问题
    因为RSA加密16字节,得到的是128字节的密文,所以在接收和发送的时候需要进行注意接收的大小、分块加密发送、和接收数组的大小问题
  • 在RSA加解密函数返回-1的可能
  1. 数组的大小不对
  2. 加密解密的密钥不配对
  • AES加密的时候不是直接使用16字节的随机数组
    OpenSSl中提供了根据16字节数组生成AES加密解密的AES结构体
    在进行AES加解密的时候就是使用这个结构体
  • 个人感觉 OpenSSL的稳定性不是特别好
    有时候会出现一些问题

关于RSA PEM文件格式

PEM私钥格式文件

-----BEGIN RSA PRIVATE KEY-----
-----END RSA PRIVATE KEY-----

PEM公钥格式文件

-----BEGIN PUBLIC KEY-----
-----END PUBLIC KEY-----

提取PEM格式公钥:

openssl rsa -in key.pem -RSAPublicKey_out -out pubkey.pem
    -in 指定输入的密钥文件
    -out 指定提取生成公钥的文件(PEM RSAPublicKey格式)

API:

//从BIO重加载PublicKey格式公钥证书
RSA *PEM_read_RSA_PUBKEY(FILE *fp, RSA **x, pem_password_cb *cb, void *u);

PEM RSAPublicKey公钥格式文件

-----BEGIN RSA PUBLIC KEY-----
-----END RSA PUBLIC KEY-----

提取:

openssl rsa -in key.pem -RSAPublicKey_out -out pubkey.pem
    -in 指定输入的密钥文件
    -out 指定提取生成公钥的文件(PEM RSAPublicKey格式)

API:

//从BIO重加载RSAPublicKey格式公钥证书
RSA *PEM_read_bio_RSAPublicKey(BIO *bp, RSA **x, pem_password_cb *cb, void *u);

关于0xC0000005: 读取位置 xxx时发生访问冲突

一般都是指针的问题

  • 申请的内存没有释放
  • 出现死循环导致内存泄露
  • 所有的第三方类库存在内存泄露相关的BUG

常见的溢出主要有:

  • 内存分配未成功,却使用了它
  • 内存分配虽然成功,但是尚未初始化就引用它。
  • 内存分配成功并且已经初始化,但操作越过了内存的边界。
  • 使用free 或delete 释放了内存后,没有将指针设置为NULL。导致产生“野指针”。

区别: RSA_private_decrypt and RSA_private_encrypt

  • 没有padding的时候,这两个函数是相同的
  • 指定padding之后,RSA_private_encrypt会在模指数运算之前加上padding;RSA_private_decrypt会在模指数运算之后剪掉padding