先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Web前端全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024c (备注前端)
正文
hKey=GenKeyByPassword( hCryptProv, szPassword);
}
//--------------------------------------------------------------------
// 因为加密算法按ENCRYPT_BLOCK_SIZE 大小块加密,所以被加密的
// 数据长度必须是ENCRYPT_BLOCK_SIZE 的整数倍。下面计算一次加密的
// 数据长度。
dwBlockLen = 1000 - 1000 % ENCRYPT_BLOCK_SIZE;
//--------------------------------------------------------------------
// 确定加密后密文数据块大小. 若是分组密码模式,则必须有容纳额外块的空间
if(ENCRYPT_BLOCK_SIZE > 1)
dwBufferLen = dwBlockLen + ENCRYPT_BLOCK_SIZE;
else
dwBufferLen = dwBlockLen;
//-------------------------------------------------------------------
// 分配内存空间.
if(pbBuffer = (BYTE *)malloc(dwBufferLen))
{
printf(“已经为缓冲区分配了内存. \n”);
}
else
{
HandleError(“所需内存不够. \n”);
}
//-------------------------------------------------------------------
// 循环加密 原文件
do
{
//-------------------------------------------------------------------
// 每次从原文件中读取dwBlockLen字节数据.
dwCount = fread(pbBuffer, 1, dwBlockLen, hSource);
if(ferror(hSource))
{
HandleError(“读取明文文件出错!\n”);
}
//-------------------------------------------------------------------
// 加密数据.
if(!CryptEncrypt(
hKey, //密钥
0, //如果数据同时进行散列和加密,这里传入一个散列对象
feof(hSource), //如果是最后一个被加密的块,输入TRUE.如果不是输入FALSE.
//这里通过判断是否到文件尾来决定是否为最后一块。
0, //保留
pbBuffer, //输入被加密数据,输出加密后的数据
&dwCount, //输入被加密数据实际长度,输出加密后数据长度
dwBufferLen)) //pbBuffer的大小。
{
HandleError(“Error during CryptEncrypt. \n”);
}
//-------------------------------------------------------------------
// 把加密后数据写到密文文件中
fwrite(pbBuffer, 1, dwCount, hDestination);
if(ferror(hDestination))
{
HandleError(“写入密文时出错.”);
}
} while(!feof(hSource));
//-------------------------------------------------------------------
// 关闭文件
if(hSource)
{
if(fclose(hSource))
HandleError(“关闭原文文件出错!”);
}
if(hDestination)
{
if(fclose(hDestination))
HandleError(“关闭目标文件出错!”);
}
//-------------------------------------------------------------------
// 释放内存空间.
if(pbBuffer)
free(pbBuffer);
//-------------------------------------------------------------------
// 销毁会话密钥
if(hKey)
{
if(!(CryptDestroyKey(hKey)))
HandleError(“Error during CryptDestroyKey”);
}
//-------------------------------------------------------------------
// 释放CSP句柄
if(hCryptProv)
{
if(!(CryptReleaseContext(hCryptProv, 0)))
HandleError(“Error during CryptReleaseContext”);
}
return(TRUE);
} // end Encryptfile
//获取加密提供者句柄
HCRYPTPROV GetCryptProv()
{
HCRYPTPROV hCryptProv; // 加密服务提供者句柄
//获取加密提供者句柄
if(CryptAcquireContext(
&hCryptProv, // 加密服务提供者句柄
NULL, // 密钥容器名,这里使用登陆用户名
MS_ENHANCED_PROV, // 加密服务提供者
PROV_RSA_FULL, // 加密服务提供者类型,可以提供加密和签名等功能
0)) // 标志
{
printf(“加密服务提供者句柄获取成功!\n”);
}
else
{
//重新建立一个新的密钥集
if(!CryptAcquireContext(&hCryptProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_NEWKEYSET))
{
HandleError(“重新建立一个新的密钥集出错!”);
}
}
return hCryptProv;
}
// HandleError:错误处理函数,打印错误信息,并退出程序
void HandleError(char *s)
{
printf(“程序执行发生错误!\n”);
printf(“%s\n”,s);
printf(“错误代码为: %x.\n”,GetLastError());
printf(“程序终止执行!\n”);
exit(1);
}
// GenKeyByRandom:通过随机数创建会话密钥
// 参数:hCryptProv CSP句柄
// hDestination 目标文件,导出的会话密钥保存在此文件中
HCRYPTKEY GenKeyByRandom(HCRYPTPROV hCryptProv,FILE* hDestination)
{
HCRYPTKEY hKey;
HCRYPTKEY hXchgKey;
PBYTE pbKeyBlob;
DWORD dwKeyBlobLen;
if(CryptGenKey(
hCryptProv,
ENCRYPT_ALGORITHM,
KEYLENGTH | CRYPT_EXPORTABLE,
&hKey))
{
printf(“一个会话密钥已经被创建. \n”);
}
else
{
HandleError(“Error during CryptGenKey. \n”);
}
//--------------------------------------------------------------
// 创建交换密钥
if(CryptGenKey(
hCryptProv,
AT_KEYEXCHANGE,
0,
&hXchgKey))
{
printf(“交换密钥对已经创建.\n”);
}
else
{
HandleError(“在试图创建交换密钥时出错.\n”);
}
//--------------------------------------------------------------
// 确定密钥数据块长度,并分配空间.
if(CryptExportKey(
hKey,
hXchgKey,
SIMPLEBLOB,
0,
NULL,
&dwKeyBlobLen))
{
printf(“此密钥块的长度是 %d 字节. \n”,dwKeyBlobLen);
}
else
{
HandleError(“计算密钥数据块长度出错! \n”);
}
if(pbKeyBlob =(BYTE *)malloc(dwKeyBlobLen))
{
printf(“已经问此密钥块分配了内存. \n”);
}
else
{
HandleError(“所需内存不够. \n”);
}
//--------------------------------------------------------------
// 导出会话密钥到简单密钥数据块中.
if(CryptExportKey(
hKey,
hXchgKey,
SIMPLEBLOB,
0,
pbKeyBlob,
&dwKeyBlobLen))
{
printf(“此会话密钥已经被导出. \n”);
}
else
{
HandleError(“Error during CryptExportKey!\n”);
}
//--------------------------------------------------------------
//释放交换密钥句柄.
if(hXchgKey)
{
if(!(CryptDestroyKey(hXchgKey)))
HandleError(“Error during CryptDestroyKey”);
hXchgKey = 0;
}
//--------------------------------------------------------------
// 写密钥块长度到目标文件.
fwrite(&dwKeyBlobLen, sizeof(DWORD), 1, hDestination);
if(ferror(hDestination))
{
HandleError(“写密钥块长度出错.”);
}
else
{
printf(“密钥块长度已经被写入. \n”);
}
//--------------------------------------------------------------
//写密钥块数据到目标文件.
fwrite(pbKeyBlob, 1, dwKeyBlobLen, hDestination);
if(ferror(hDestination))
{
HandleError(“写密钥数据出错”);
}
else
{
printf(“此密钥块数据已经被写入目标文件. \n”);
}
// 释放内存空间.
free(pbKeyBlob);
//返回创建的会话密钥
return hKey;
}
// GenKeyByRandom:通过输入密码创建会话密钥
// 参数:hCryptProv CSP句柄
// szPassword 输入密码
HCRYPTKEY GenKeyByPassword(HCRYPTPROV hCryptProv,PCHAR szPassword)
{
HCRYPTKEY hKey;
HCRYPTHASH hHash;
//-------------------------------------------------------------------
// 创建哈希句柄.
if(CryptCreateHash(
hCryptProv,
CALG_MD5,
0,
0,
&hHash))
{
printf(“一个哈希句柄已经被创建. \n”);
}
else
{
HandleError(“Error during CryptCreateHash!\n”);
}
//-------------------------------------------------------------------
// 计算输入密码的哈希值.
if(CryptHashData(
hHash,
(BYTE *)szPassword,
strlen(szPassword),
0))
{
printf(“密码已经被添加到了哈希表中. \n”);
}
else
{
HandleError(“Error during CryptHashData. \n”);
最后
小编的一位同事在校期间连续三年参加ACM-ICPC竞赛。从参赛开始,原计划每天刷一道算法题,实际上每天有时候不止一题,一年最终完成了 600+:
凭借三年刷题经验,他在校招中很快拿到了各大公司的offer。
入职前,他把他的刷题经验总结成1121页PDF书籍,作为礼物赠送给他的学弟学妹,希望同学们都能在最短时间内掌握校招常见的算法及解题思路。
整本书,我仔细看了一遍,作者非常细心地将常见核心算法题和汇总题拆分为4个章节。
而对于有时间的同学,作者还给出了他结合众多数据结构算法书籍,挑选出的一千多道题的解题思路和方法,以供有需要的同学慢慢研究。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
他的学弟学妹,希望同学们都能在最短时间内掌握校招常见的算法及解题思路。**
整本书,我仔细看了一遍,作者非常细心地将常见核心算法题和汇总题拆分为4个章节。
而对于有时间的同学,作者还给出了他结合众多数据结构算法书籍,挑选出的一千多道题的解题思路和方法,以供有需要的同学慢慢研究。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)
[外链图片转存中…(img-esFo7aAQ-1713421778966)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!