openssl中涉及到的一些坑

最近一直在写C代码
主要就是实现几个函数

  1. 实现对一个字符串的base64加密,然后再进行SHA1摘要签名
  • base64是调用的openssl的函数,但是加密后再进行SHA1签名的结果却和网上在线网站生成的结果不一致,经过调试发现字符串在base64后会多出来一个行换符。
  • 经过网上查询,发现原因是存在一个RFC822规定,要求BASE64Encoder编码每76个字符,需要加上一个回车换行。
  • 所以使用现有的base64编码函数时,一定要主要是否有换行,解码函数也要对应。
  1. 对消息进行RSA加密
  • 使用的依然是openssl的函数,但是要注意,消息的长度必须与密钥的长度一直,不然需要进行数据填充,填充的方式主要有PKCS1。即如果密钥的长度4096b,那么消息的最大长度为512B。
  • 如果消息的长度大于512B,需要进行分段加密,然后将加密后的密文拼接,解密时,先对密文分段,然后将解密结果拼接。
  • 此时就涉及到如何分段的问题,
    • 加密时,可按照RSA一次最大加密的消息长度进行分割
    • 解密呢,解密我该从哪里分割呢? 其实,RSA每次加密后得到的密文长度是固定的,如密钥的长度为4096b,则密文的长度为512B;密钥的长度为2048b,则密文的长度为256B;密钥的长度为1024b,则密文的长度为128B;因此我们可以这一规律对密文进行分割,拼接。
    • 说一下这里的坑,我对消息加密后的密文使用strlen(encrypt_data),发现长度不为512,且不固定,所以一直想不通如何解密,直到后来看了相关原理,才确定加密后密文的长度固定不变,而之所以strlen(encrypt_data)无法得到,主要是strlen()会在第一次遇到’\0’时,认为结束,不会继续往后。而密文中会有字节为’\0’。
    • 因此,对于密文,切记不可使用strlen()函数。就这一点,卡了我两天。
  1. 加解密函数
    • 对消息进行RSA私钥加密 RSA_private_encrypt()
    • 对消息进行RSA公钥加密 RSA_public_encrypt()
    • 对消息进行RSA私钥解密 RSA_private_decrypt()
    • 对消息进行RSA公钥解密 RSA_public_decrypt()

参考文献:https://blog.csdn.net/qq_30667875/article/details/105427943

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值