最近一直在写C代码
主要就是实现几个函数
- 实现对一个字符串的base64加密,然后再进行SHA1摘要签名
- base64是调用的openssl的函数,但是加密后再进行SHA1签名的结果却和网上在线网站生成的结果不一致,经过调试发现字符串在base64后会多出来一个行换符。
- 经过网上查询,发现原因是存在一个RFC822规定,要求BASE64Encoder编码每76个字符,需要加上一个回车换行。
- 所以使用现有的base64编码函数时,一定要主要是否有换行,解码函数也要对应。
- 对消息进行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()函数。就这一点,卡了我两天。
- 加解密函数
- 对消息进行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