openssl做文件处理(base64,MD5,sha256等)

这篇具有很好参考价值的文章主要介绍了openssl做文件处理(base64,MD5,sha256等)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这次使用openssl,发现openssl不仅可以用来做加密和解密,实际上也可以用来做文件的处理,比如base64转码、解码,文件md5的计算等。实现这些,即可以从命令行去做,也可以通过代码去实现。

1. 命令行操作

        1. base64转码、解码       

        转码:

        openssl base64 -in file.bin -out file.b64 对file.bin文件进行转码,转码后的文件为file.b64

        上述命令转码生成的文件带有换行符,如果想要生成的base64文件不带换行符,那么使用

        openssl base64 -A -in file.bin -out file.b64。

        解码:

        openssl base64 -d -in file.b64 -out file.bin 对file.b64进行解码,解码后的文件为file.bin

        如果转码时有“-A”,那么解码时也要有-A。

        注:对于大文件,加A可能会有问题。我拿2.3G的绿皮书电影做测试,发现加A后,转码再解码,文件变更大了,电影也无法播放。不加A就没有问题。另外,man openssl-enc中,搜索Bug,也有如下描述:

        The -A option when used with large files doesn't work properly

        2. md5码的生成

        openssl dgst -md5 a.out  计算a.out文件的md5码

        如果生成sha256码,将上面的md5改为sha256即可。

2. 代码实现文件操作

        1. base64转码、解码

        有换行符的转码方式,使用的接口为:

        EVP_ENCODE_CTX_new,EVP_EncodeUpdate,EVP_EncodeFinal,和EVP_ENCODE_CTX_free。

static int t_tob64(char *dst, const unsigned char *src, int size)
{
    EVP_ENCODE_CTX *ctx = EVP_ENCODE_CTX_new();
    int outl = 0, outl2 = 0;

    if (ctx == NULL)
        return 0;

    EVP_EncodeInit(ctx);

    if (!EVP_EncodeUpdate(ctx, (unsigned char *)dst + outl, &outl2, src,
                          size)) {
        EVP_ENCODE_CTX_free(ctx);
        return 0;
    }
    cout<<"first len is "<<outl2<<endl;
    outl += outl2;
    EVP_EncodeFinal(ctx, (unsigned char *)dst + outl, &outl2);
    outl += outl2;
    cout<<"secod len is "<<outl2<<endl;
    cout<<"actual outLen is "<<outl<<endl;


    EVP_ENCODE_CTX_free(ctx);
    return outl;
}

        这个函数将长度为size个字节的,地址为src的源数据,转码后保存在dst中。dst的地址长度应该是多大呢?

        我参考了一些资料,经过验证,用下面这个方法,计算出来的与实际需要使用的更加接近。inputLen是输入字符串的长度。outLen是预计输出字符串的长度。76是指根据RF2045,base64转码后,每超过76个字符,会添加回车换行。前面的%3操作,是补位操作。

    if(inputLen%3==0)
        outLen = inputLen/3 *4;
    else
        outLen = (inputLen/3 +1)*4;       
    outLen = outLen + (outLen-1)/76*2;

       按照这种方法来设计缓存,比实际需要的长度略大。而且我自己最后生成base64时发现,并不是76个字符有一个换行符,而是64个字符有一个换行符。如果把上面的76换成64,然后将回车符用一个字符计算,也就是outLen = outLen + (outLen-1)/64,这样预算的缓存长度最后与实际需要的缓存长度是匹配的。

        不带换行符的转码方式,使用的接口:

        EVP_EncodeBlock。

int t_tob64_block(char *dst, const unsigned char *src, int size)
{
    int outLen=0;

    outLen = EVP_EncodeBlock((unsigned char *)dst ,src,size);

    return outLen;
}

        这种的长度计算只要考虑补位的长度即可。

        2. md5等码值的计算

        使用的接口包括EVP_MD_CTX_new,EVP_DigestInit_ex,EVP_DigestUpdate,EVP_DigestFinal_ex和EVP_MD_CTX_free。

int main(int argc, char *argv[])
 {
     EVP_MD_CTX *mdctx;
     const EVP_MD *md;
     string content = "";
     readFile("file.bin",content);
     unsigned char md_value[EVP_MAX_MD_SIZE];
     unsigned int md_len, i;

     if (argv[1] == NULL) {
         printf("Usage: mdtest digestname\n");
         exit(1);
     }

     md = EVP_get_digestbyname(argv[1]);
     if (md == NULL) {
         printf("Unknown message digest %s\n", argv[1]);
         exit(1);
     }

     mdctx = EVP_MD_CTX_new();
     EVP_DigestInit_ex(mdctx, md, NULL);
     EVP_DigestUpdate(mdctx, (char*)content.c_str(), content.length());
     //EVP_DigestUpdate(mdctx, mess2, strlen(mess2));
     EVP_DigestFinal_ex(mdctx, md_value, &md_len);
     EVP_MD_CTX_free(mdctx);

     printf("Digest is: ");
     for (i = 0; i < md_len; i++)
         printf("%02x", md_value[i]);
     printf("\n");

     exit(0);
 }

        这里输入的参数是码值算法的名字,通过EVP_get_digestbyname函数,根据名字,找到对应的算法。名字怎么命名呢?openssl dgst -list就可以找出所有的支持的算法。如下所示:

        openssl base64,linux,安全,ssl

         因此使用md5,只要输入md5即可。

        文章来源地址https://www.toymoban.com/news/detail-676970.html

到了这里,关于openssl做文件处理(base64,MD5,sha256等)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 前端如何加密数据--五种方式(base64加密、md5加密、sha1加密、字符串方法加密、AES加密)

    1.base64加密(包括小写字母a-z、大写字母A-Z、数字0-9、符号\\\"+\\\"、\\\"/\\\"一共64个字符的字符集,另加一个“=”,实际是65个字符) 字符串转换为base64:str64 = window.btoa(str) base64转换为字符串:str=window.atob(str64) 2.md5加密 3.sha1加密   4.字符串的编码和解码(JS函数的escape()和unescape())

    2024年02月16日
    浏览(59)
  • 使用Win10自带的PowerShell命令校验文件和镜像文件的Hash值(MD5、SHA1/256等)正确性

    通常为了保证我们从网上下载的文件的完整性和可靠性,我们把文件下载下来以后都会校验一下MD5值或SHA1值(例如验证下载的Win10 ISO镜像是否为原始文件),这一般都需要借助专门的MD5检验工具来完成。但其实使用Windows系统自带的Windows PowerShell运行命令即可进行文件MD5、S

    2024年02月16日
    浏览(42)
  • 前端密码加密 —— bcrypt、MD5、SHA-256、盐

     🐔 前期回顾 悄悄告诉你:前端如何获取本机IP,轻松一步开启网络探秘之旅_彩色之外的博客-CSDN博客 前端获取 本机 IP 教程 https://blog.csdn.net/m0_57904695/article/details/131855907?spm=1001.2014.3001.5501           在前端密码加密方案中,bcrypt与SHA-256都是常见的加密算法,它们各有优劣

    2024年02月05日
    浏览(54)
  • Python hashlib 加密方法(MD5、SHA1、SHA256、SHA52)

    Python 提供了 hashlib 模块来进行加密操作。在下面的文章中,我们将介绍 hashlib 模块的常用加密算法。 hashlib 模块是 Python 中用于加密的标准库。它包含了所有常见的哈希函数,例如 SHA1、SHA224、SHA256、SHA384、SHA512、MD5 等。这些哈希函数都是单向的,即只能对信息进行加密,而

    2024年02月07日
    浏览(47)
  • Apifox&Postman请求参数进行SHA256/MD5加密

    Base64加密,代码如下: Base64解密,代码如下: MD5加密,代码如下: SHA256加密,代码如下

    2024年02月16日
    浏览(54)
  • uniapp安卓签名证书生成,签名证书的SHA1,SHA256,MD5获取

    uniapp安卓证书生成有两种方式,一种是去dcloud开发者中心生成证书,另一种是安装jre环境,自己生成证书 第一种 dcloud生成证书 去该项目对应的应用处,生成证书需要等几分钟,生成后可以查看证书信息 第二种 自己生成 先安装jre,再配置一下环境变量 jre8下载地址 去D盘添加

    2024年02月16日
    浏览(64)
  • Android 应用签名证书的SHA1、MD5、SHA256值在哪获取?

    SHA1值分为发布版和调试版。MD5、SHA256与SHA1的获取是一样的。 调试版就是我们平时开发测试时用的默认签名文件。这个默认的签名文件一般是在c盘的用户名目录下的.android文件夹内。 默认文件就是  debug.keystore 获取调试版的SHA1值 : 回车后即可看到调试版的SHA1值了。

    2024年02月12日
    浏览(60)
  • Android studio获取证书的MD5/SHA1/SHA-256以及公钥的方法

    Android studio 获取MD5 SHA1 SHA-256 值命令:./gradlew signingReport Android studio 获取公钥:keytool -export -alias key0 -keystore key.keystore -file zhengshu.cer 一、获取MD5 SHA1 SHA-256 值 在Android项目中执行命令:./gradlew signingReport 然后以上操作执行完成之后,搜索你的证书名称,找到以下数据: 二、获

    2024年02月03日
    浏览(76)
  • Windows(Win10)自带的可用于文件校验(Hash校验,SHA256校验,MD5校验等)的命令: CertUtil 和 Get-FileHash

    Windows(Win10)自带的用于文件校验(Hash校验,SHA256校验,MD5校验等)的命令: certutil 可写为 CertUtil Get-FileHash 可写为 get-filehash CertUtil 是命令行的命令 可以在cmd和powershell中运行 Get-FileHash 是powershell的命令 不能在cmd命令行运行 支持的哈希算法 CertUtil 支持的算法 Get-FileHash 支持的算法 用

    2024年02月15日
    浏览(59)
  • uniapp离线打包 如何查看公钥 /android studio 导出秘钥证书/获取MD5 SHA256 SHA1值

    使用uniapp离线打包 或者 根据 云端证书 获取 秘钥证书 app申请阿里云备案 在android studio 查看 离线打包的的MD5 SHA256 SHA1值 提示:根据证书或者签名 获取 MD5 SHA256 SHA1值 公钥 or 1.根据云端获取 生成证书 查看公钥 2.android studio 获取MD5 SHA256 SHA1值 3.如果没有获取到MD5 file = setting

    2024年01月18日
    浏览(72)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包