首页 > 其他分享 >wincrypt des 加密 8字节补齐 跨平台

wincrypt des 加密 8字节补齐 跨平台

时间:2023-07-31 11:46:50浏览次数:45  
标签:bResult DES buffer wincrypt des 跨平台 blob dataLength BYTE

原理:wincrypt des加密时,如果需要加密的buffer大小不是8字节倍数,它会在数据的末尾添加字节,这些字节的值等于缺少的字节数。

源码:

  #include <openssl/des.h>
  const BYTE IV[] = "12345678";
1 DWORD DESEncrypt(WCHAR* data, char* password, BYTE* buffer, DWORD bufferLength) 2 { 3 DWORD dataLength = STD::my_wcslen(data) * 2; 4 5 if (buffer == NULL || bufferLength < dataLength + 8 - (dataLength % 8) || strlen(password) < 8) return 0; 6 #ifdef WIN32 7 memcpy(buffer, (char*)data, dataLength); 8 HCRYPTPROV hProv = NULL; 9 HCRYPTKEY hSessionKey = NULL; 10 bool bResult = TRUE; 11 KeyBlob blob; 12 blob.header.bType = PLAINTEXTKEYBLOB; 13 blob.header.bVersion = CUR_BLOB_VERSION; 14 blob.header.reserved = 0; 15 blob.header.aiKeyAlg = CALG_DES; 16 blob.cbKeySize = 8; 17 memcpy(blob.rgbKeyData, password, 8); 18 bResult &= CryptAcquireContext(&hProv, NULL, MS_DEF_PROV, PROV_RSA_FULL, 0); 19 bResult &= CryptImportKey(hProv, (BYTE*)&blob, sizeof(blob), 0, 0, &hSessionKey); 20 bResult &= CryptSetKeyParam(hSessionKey, KP_IV, (BYTE*)IV, 0); 21 bResult &= CryptEncrypt(hSessionKey, NULL, TRUE, 0, (BYTE*)buffer, &dataLength, bufferLength); 22 bResult &= CryptDestroyKey(hSessionKey); 23 bResult &= CryptReleaseContext(hProv, 0); 24 return bResult ? dataLength : 0; 25 #else 26 DES_cblock key; 27 DES_key_schedule schedule; 28 DES_cblock iv; 29 30 // 设置密钥 31 memcpy(key, password, 8); 32 DES_set_key_unchecked(&key, &schedule); 33 34 // 设置初始化向量(IV) 35 memcpy(iv, IV, 8); 36 37 //填充数据长度 38 size_t nPadded = (8 - (dataLength % 8))%8; 39 DWORD paddedDataLength = dataLength + nPadded; 40 void* p = reinterpret_cast<void*>(data)+ dataLength; 41 memset(p, nPadded, nPadded); 42 43 // 加密数据 44 DES_ncbc_encrypt((BYTE*)data, buffer, paddedDataLength, &schedule, &iv, DES_ENCRYPT); 45 46 return paddedDataLength; 47 #endif 48 }

 

标签:bResult,DES,buffer,wincrypt,des,跨平台,blob,dataLength,BYTE
From: https://www.cnblogs.com/jf-blog/p/17593031.html

相关文章

  • JavaScript学习 -- 对称加密算法DES
    在现代的互联网时代,数据安全性备受关注。为了保护敏感数据的机密性,对称加密算法是一种常用的方法。在JavaScript中,DES(DataEncryptionStandard)是一种常用的对称加密算法。本篇博客将为您展示如何在JavaScript中使用DES算法进行加密和解密,并提供一个实际的例子。首先,我们需要使用Cr......
  • Docker Desktop for Mac使用
    说明:不用编辑从https://github.com/AliyunContainerService/k8s-for-docker-desktop.git下载的images.properties文件,直接切换分支即可相关资料说明DockerDesktopforMac安装Kubernetes解决kubernetesisstarting...https://www.cnblogs.com/darope/p/12624678......
  • XAML - Design Time Data
    为View添加设计时ViewModel,可以在View中对Command和属性F12跳转到Viewmodel文件中相应的位置,同时,在View中输入ViewModel中的Command和属性名称时有只能提示。布局控件内的子控件由csharp代码动态生成,启动程序后才能填充布局。可以在布局容器中放置设计时控件,观察布局效果而无需......
  • Xamarin 2.0:基于Mono跨平台开发框架
    Xamarin在完成其为跨平台移动开发提供一组通用工具的愿景方面又迈出了重要一步。伴随Xamarin2.0的宣布,Xamarin重新命名了其产品,带来了新的IDEXamarinStudio、支持iOS开发的VisualStudio插件和组件商店。跨平台移动开发框架Xamarin今天发布了最新的2.0版......
  • Flutter是跨平台开发终极之选吗?Android开发该如何快速上手Flutter?
    跨端技术是Android程序员乃至所有移动开发程序员一直在研究的课题。3月4日,谷歌正式发布了Flutter的2.0。该版本最大的特性就是可以支持五大主流的操作系统:iOS、Android、Linux、Windows和MacOS。官方甚至还说丰田将会把Flutter带到汽车中。也就是说,我们可以用一套Flutter......
  • 前端跨平台调试代理神器Whistle
    概述抓包一直是平时开发中经常要做的,有一款好用的抓包工具可以让开发体验更棒,以前一直用fiddler,fiddler虽然强悍,但是入手有一定难度,而且较笨重,今天介绍另一款抓包工具:Whistle。Whistle是一款前端调试神器,通过拦截、修改和模拟网络请求,帮助开发人员调试接口、排查网络问题。它提......
  • HHDESK便捷功能介绍三
    1连接便捷显示工作中,往往需要设置很多资源连接。而过多的连接设,往往很容易混淆。在HHDESK中,当鼠标点击连接时,会在下方显示本连接的参数,方便用户查看。2日志查看实际工作中,查看日志是一件很麻烦的事情,需要确定工作文件夹,一个个打开,再找到日志文件;如今HHDESK帮您一键完成,节......
  • Arm Neoverse N2 reference design Technical Overview
    RDN2Intro本文档是ARM提供给SoC设计人员的一份概述设计文档,较为详细的描述了SoC的方方面面,具有很好的参考意义。SoC的系统架构,硬件互联SoC各block的功能描述、细节描述软件栈概述RDN2的其他参考文档DocumentNameDocumentIDLicenseeonlyAMBA4AXI-StreamPr......
  • 跨平台即时通讯软件有哪些?
    随着科技的不断发展,人们使用的设备平台也越来越多。跨平台即时通讯软件成为了现代社会中人们交流的一个重要工具。这些软件可以在不同的操作系统和设备上无缝运作,使得用户可以随时随地与它人沟通交流。那么跨平台即时通讯软件有哪些?这里推荐有度即时通。  有度即时通是一个......
  • Ubuntu Netplane balancing algorithm modes
    目录起因前提知识配置步骤参考文档说明起因因为机房服务器新部署,双网卡服务器。一般来说业务系统的要求配置都是双网线然后配置bond0,主从轮番使用网卡就行。这次不太一样,网络管理员要求使用boud4模式,也是链路融合,所以就查询了一下资料没发现了bond的配置方式,很奇特的是,和Centos不......