实现步骤
前言
工作需要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.1 | 2023年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的功能还是比较复杂的,写文章的时候都不知道该怎么组织条理,以后会多多尝试写一些内容。锻炼自己的文笔逻辑性。整理不易,欢迎收藏加转发。转发注明作者。