c++实现C# MD5.ComputeHash方法和调用方式


前言

工作需要C#写的代码需要转c++,
其中hash转换比较棘手,最终查阅相关资料,最后整理如下


提示:个人经验,仅供参考

一、C# hash代码

这里先看C# 怎么计算hash的。

代码如下(示例):

using System;
using System.Text;
using System.Security.Cryptography;


namespace Hash
{
    class Program
    {
        static void Main(string[] args)
        {
            MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
            string sourceWorld = "Hello World!";

            byte[] message;
            byte[] hashByte;
            message = Encoding.Default.GetBytes(sourceWorld);
            hashByte  = md5.ComputeHash(message);
            foreach (byte c in hashByte)
            {
                Console.Write(c);
                Console.Write(" ");
            }
            Console.WriteLine();
        }
    }
}


输出计算字符hash 每个字节的结果如下:

237 7 98 135 83 46 134 54 94 132 30 146 191 197 13 140

一、C++ hash代码

1.引入openssl库.

这里需要引入开源代码openssl.
下载及安装方式请参考:Windows安装使用Openssl

openssl版本间的区别

openssl是个很强大的软件,而强大的软件并不是一蹴而就的,版本经过长期迭代,1.x,2.x,3.x(x代表小版本号,很多不列举了)。
其中1.1.1是目前网上最稳定的,而3.x是发展中的版本,是将来的计划版本,目前最好不要上生产环境。
这里就1.1.1和3.x说明,1.1.1是个很稳定的版本,网上资料基本针对的是1.1.1的,很多地方会加后缀l形成1.1.1l这样的版本(long term support)中文意思表示长期支持。

按照版本号划分

版本号支持时间
1.1.12023年9月11日
3.x一直支持,未来替换1.1.1形成另一个版本LTS

按照包完整度划分

分支内容差异
openssl完整版的OpenSSL
openssl-fips把密码函数库单独抽出来,做成一个满足FIPS 140-2安全一级的密码模块。
openssl-fips-ecp基本同openssl-fips,但是删除了二元域的椭圆曲线,只保留了P元域的,所以是ECP

如何选择

你最关心的是稳定,并且库表现内容和网上资料一致,无脑选openssl-1.1.1l版本,一定要选完整版的,如果你爱倒腾,请无视。
Windows安装使用Openssl

visual studio设置引入库

你安装了,不代表你的在visual studio能用,你没告诉它你安装的东西在哪,所以需要设置下。

在VS的工程设置工程属性
1:右击工程名 ——> 选择“属性”
2:在“VC++目录”——> “包含目录”中添加openSSL的include文件(在您安装openssl的文件下)
3:在“VC++目录”——> “库目录”中添加openSSL的lib文件(在您安装openssl的文件下)
4:在“链接器”——>“输入”——>“附加依赖项”中添加libssl.lib和libcrypto.lib(键盘输入);
5:将OpenSSL安装目录下bin文件夹中的“libcrypto-
1_1-x64.dll”和“libssl-1_1-x64.dll”(名字后面的版本号可能因更新而不同)复制到你新建的项目工程目录下

c++代码实现

代码如下(示例):

#include <iostream>
#include <string>
#include <openssl/md5.h>

using namespace std;

int main()
{
    string SourceWorld = "Hello World!";
    unsigned char outSoucceBuf[16] = {0}; //hash计算值的值是16字节,所以要用一个数组存
    MD5_CTX md5buff;
    MD5_Init(&md5buff);
    MD5_Update(&md5buff, SourceWorld.c_str(), strlen(SourceWorld.c_str()));
    MD5_Final(outSoucceBuf, &md5buff);

    for (auto &p: outSoucceBuf)
    {
        printf("%u", p);
    }
    cout << endl;

}

计算hash值如下:

237 7 98 135 83 46 134 54 94 132 30 146 191 197 13 140

总结

这里c++实现 c#的hash.compute的功能还是比较复杂的,写文章的时候都不知道该怎么组织条理,以后会多多尝试写一些内容。锻炼自己的文笔逻辑性。整理不易,欢迎收藏加转发。转发注明作者。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值