铜锁探密,SM3杂凑算法加强至pro版

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 铜锁探密,SM3杂凑算法加强至pro版

前言:


       说实话在进行铜锁探密之前,我对密码最初的概念还保留在,我们登录QQ或者微信输入的“密码”。当老师和我说,那是口令而不是密码时,老师接下来讲的东西成功引起了我的注意。因此处于好奇,我去网上搜了下什么叫密码学?然后它大概是这么说的。


       [密码学(在西欧语文中,源于希腊语kryptós“隐藏的”,和gráphein“书写”)是研究如何隐密地传递信息的学科。在现代特别指对信息以及其传输的数学性研究,常被认为是数学和计算机科学的分支,和信息论也密切相关。著名的密码学者Ron Rivest解释道:“密码学是关于如何在敌人存在的环境中通讯”,自工程学的角度,这相当于密码学与纯数学的异同。密码学是信息安全等相关议题,如认证、访问控制的核心。密码学的首要目的是隐藏信息的涵义,并不是隐藏信息的存在。密码学也促进了计算机科学,特别是在于电脑与网络安全所使用的技术,如访问控制与信息的机密性。密码学已被应用在日常生活:包括自动柜员机的芯片卡、电脑使用者存取密码、电子商务等等。


       密码是通信双方按约定的法则进行信息特殊变换的一种重要保密手段。依照这些法则,变明文为密文,称为加密变换;变密文为明文,称为脱密变换。密码在早期仅对文字或数码进行加、脱密变换,随着通信技术的发展,对语音、图像、数据等都可实施加、脱密变换。]


       说实话,这番解释,给密码又增加了一份神秘的色彩。因此就在想,现存的密码算法真的是那么的严谨和完美嘛?当学到SM3杂凑算法时,我顿时非常感兴趣了,因为SM3杂凑算法是一种不可逆的算法,意思是只能加密,不能被反向解密。但当我深入了解SM3杂凑算法时,好像事情变的有趣了起来。


一、初遇铜锁


自我总结:


       初见铜锁,想放弃,但心有不甘。初极狭,后豁然开朗。从搭建铜锁环境用了差不多半天时间,到后面捣鼓快忘记的C语言,想说,我失去的青春好像回来了。又回到大学课堂,老师带我捣鼓C语言,捣鼓单片机等。


1、环境搭建,一次难忘的经历


       打开手册,开头的实验的环境说明,让我重新回到使用小红帽、centos敲命令的时光。其实个人很喜欢linux系统,也很喜欢Ubuntu。这些系统启动起来特别快,运行程序也比较安全可靠。就是那些命令老是有点记不住,因此还是比较喜欢Windows的图形化界面。

 因为看到可以通过在Windows里面安装Docker环境,实现安装虚拟机的过程,因此准备捣鼓捣鼓一番。说实话,因为公司不常用Docker,在开始学习营之前我只是知道Docker是个容器,相当于一个隔离版的虚拟机。不仅可以跨系统安装很多好玩的,而且不像虚拟机那样占用大量的资源。其实个人理解docker就是一个简单的进程,就如下图所示docker就是一个进程级别的。      


       Docker 是一个黑盒的进程,区别于传统的进程,Docker 可以独立出一个自己的空间,不会使得在 Docker 中的行为以及变量溢出到宿主机上。因此这次Docker环境搭建,让我打开了新世界的大门,让我彻底难忘Docker。


2、键盘敲出的每一个命令,都是最美的音符


       在前面说到铜锁学习需要使用到类似Docker的环境,因此我就开始找很多关于Docker的资料,比如Docker到底是干什么的?Docker有什么用?通过类似下面一张张Docker的图解让我知道为啥Docker会深受开发者的喜欢了。

       虽然安装Docker 时,参考了旧的教程导致自己走了一些弯路,如Docker 其实不需要开启Hyper-V,其实wls2更适合Docker。但在键盘中每一次次调试和敲击,让我认识到学无止境、不进则退。


在安装好Docker后,正式进入了铜锁的学习,按照手册开始一步步的进行实战,让我学会了实战SM4加解密算法的一些原理。但当我在PowerShell中,不断重复输入“echo -n "hello tongsuo" | /opt/tongsuo/bin/tongsuo dgst -sm3 ”命令时,发现每次返回的结果都是一样的。因此我开始萌发了一个大胆的想法。


二、SM3杂凑算法增强改造


 前面我们提到,当我敲同一条SM3杂凑算法加密时发现,每次返回的结果是一样的时候,我从开始的好奇,陷入了沉思。因为在大量的项目实践中,我认识到,人们常用的密码都类似123456,abc123之类的。因为我用计算机记住常用密码 如123456,abc123的杂凑加密值。然后拥有用户档案的数据库查询权限,不就可以暴力破解用户的账号了。

此时我在想如果我是企业老板,我肯定不希望我的员工知道公司客户的密码的。因此我希望在数据库中即便不同用户设置了一样的密码。但保持至数据库的值也是不一样的。因此我开始了我大胆的猜想和增强改造。


三、艺术源于生活


       SM3杂凑算法增强改造的灵感来源家里的智能锁,智能锁有个模式就是前面不管你随便输入多少位密码,只需要在按*键后,再输入正确的密码就可以打开门了。这样即便每次看上去输入的密码都是不一样的,但是每次都能成功打开智能门。


  因此我在SM3杂凑算法中,加个了几个随机数,如在SM3杂凑加密值的前4位拼接4为随机数,第16-20位拼接5位随机数。然后再保存到数据库,这样即便是同样的密码,在数据库中保存的值也都是不一样的。因此即可拿到了数据库的查询值也是很难去暴力枚举破解用户的密码的。因此就将SM3杂凑算法进行了改造,类似部分改造源码如下。

#include <openssl/evp.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
static int sm3(const unsigned char *in, size_t inlen, unsigned char *out)
{
 EVP_MD_CTX *mctx = NULL;
 if ((mctx = EVP_MD_CTX_new()) == NULL
 || !EVP_DigestInit_ex(mctx, EVP_sm3(), NULL)
 || !EVP_DigestUpdate(mctx, in, inlen)
 || !EVP_DigestFinal_ex(mctx, out, NULL)) {
 EVP_MD_CTX_free(mctx);
 return 0;
 }
 EVP_MD_CTX_free(mctx);
 return 1;
}
int main()
{
//增加4位随机数,保存至数据库的SM3值时,将生成的4位随机数拼接在SM3杂凑值前面,其他的类似
int num[4], cnt = 0, n;
srand(clock()); // 设置随机数种子
while (cnt < 4)
{
n = rand() % 4; // 生成4以内随机数,这样更利于测试
for (int i = 0; i < cnt; i++)
if (num[i] == n) // 遍历数组,有相同的重新生成随机数
continue;
num[cnt++] = n;
}
for (int i = 0; i < cnt; i++) // 打印随机数数组
printf("%d ", num[i]);
return 0;
 unsigned char in[] = "hello tongsuo";
 unsigned char out[EVP_MAX_MD_SIZE];
 int ret;
 ret = sm3(in, strlen(in), out);
 assert(ret == 1);
 for (int i = 0; i < EVP_MD_size(EVP_sm3()); i++)
 printf("%x", out[i]);
 printf("\n");
 return 0;
}
// gcc sm3.c -I/opt/tongsuo/include -L/opt/tongsuo/lib64 -lcrypto -Wl,-rpa
th=/opt/tongsuo/lib64

通过代码库,将自己的想法和代码提交进去了,也让自己学开源贡献了一份微薄的力量。因此在本次训练营学习中,学到了新工具,也表达了自己的新想法,真是Nice!

相关文章
|
1月前
|
算法 安全 物联网
关于SM2、SM3、SM4、SM9这四种国密算法
本文介绍了四种国密算法——SM2、SM3、SM4和SM9。SM2是一种基于椭圆曲线的非对称加密算法,用于数据加密和数字签名;SM3是哈希算法,用于数字签名和消息完整性验证;SM4是对称加密算法,用于数据加密和解密;SM9是基于标识的非对称密码算法,适用于物联网环境中的数据安全和隐私保护。
590 0
|
3月前
|
算法 安全 Serverless
超级好用的C++实用库之国密sm3算法
超级好用的C++实用库之国密sm3算法
132 0
|
7月前
|
算法 JavaScript 前端开发
JavaScript学习 -- SM3算法基本原理
JavaScript学习 -- SM3算法基本原理
126 0
|
算法 JavaScript 前端开发
JavaScript学习 -- SM3算法基本原理
JavaScript学习 -- SM3算法基本原理
246 0
|
存储 算法 区块链
铜锁支持 Bulletproofs 算法
背景零知识证明(ZKP,Zero Knowledge Proof)是隐私计算和区块链领域中非常重要的密码学技术,能够在证明者不向验证者提供任何有用信息的情况下,使验证者相信某个论断是正确的。零知识证明于1985 年提出,至今30多年,但目前主流的零知识证明算法仅有 zk-SNARKs、zk-STARKs 和 Bulletproofs,其中 zk-SNARKs 于 2013 年提出,因其常数级的验证
259 0
铜锁支持 Bulletproofs 算法
商密算法SM2、SM3、SM4的用途和原理
国产商密算法是我国自主研发、具有自主知识产权的一系列密码算法,具有较高安全性,由国家密码局公开并大力推广。
17507 0
|
18天前
|
算法
基于WOA算法的SVDD参数寻优matlab仿真
该程序利用鲸鱼优化算法(WOA)对支持向量数据描述(SVDD)模型的参数进行优化,以提高数据分类的准确性。通过MATLAB2022A实现,展示了不同信噪比(SNR)下模型的分类误差。WOA通过模拟鲸鱼捕食行为,动态调整SVDD参数,如惩罚因子C和核函数参数γ,以寻找最优参数组合,增强模型的鲁棒性和泛化能力。
|
24天前
|
机器学习/深度学习 算法 Serverless
基于WOA-SVM的乳腺癌数据分类识别算法matlab仿真,对比BP神经网络和SVM
本项目利用鲸鱼优化算法(WOA)优化支持向量机(SVM)参数,针对乳腺癌早期诊断问题,通过MATLAB 2022a实现。核心代码包括参数初始化、目标函数计算、位置更新等步骤,并附有详细中文注释及操作视频。实验结果显示,WOA-SVM在提高分类精度和泛化能力方面表现出色,为乳腺癌的早期诊断提供了有效的技术支持。
|
4天前
|
供应链 算法 调度
排队算法的matlab仿真,带GUI界面
该程序使用MATLAB 2022A版本实现排队算法的仿真,并带有GUI界面。程序支持单队列单服务台、单队列多服务台和多队列多服务台三种排队方式。核心函数`func_mms2`通过模拟到达时间和服务时间,计算阻塞率和利用率。排队论研究系统中顾客和服务台的交互行为,广泛应用于通信网络、生产调度和服务行业等领域,旨在优化系统性能,减少等待时间,提高资源利用率。
|
12天前
|
存储 算法
基于HMM隐马尔可夫模型的金融数据预测算法matlab仿真
本项目基于HMM模型实现金融数据预测,包括模型训练与预测两部分。在MATLAB2022A上运行,通过计算状态转移和观测概率预测未来值,并绘制了预测值、真实值及预测误差的对比图。HMM模型适用于金融市场的时间序列分析,能够有效捕捉隐藏状态及其转换规律,为金融预测提供有力工具。