首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >利用RSA加密实现的简易离线验证功能(C#,含代码)

利用RSA加密实现的简易离线验证功能(C#,含代码)

作者头像
DearXuan
发布于 2022-01-19 10:01:42
发布于 2022-01-19 10:01:42
61500
代码可运行
举报
运行总次数:0
代码可运行

许多软件都有正版验证功能,它们通常需要联网验证,验证的本质则是加密与解密,本文将使用RSA加密算法实现简易的离线验证功能

RSA加密

设p,q是两个超级大的素数,N=pq,数据通过欧拉函数φ(N)来加密,而欧拉函数φ(N)满足φ(N)= φ(pq)=(p-1)(q-1),如果要算出φ(N),就必须知道p和q。并且这有一点好处,某人可以公开宣布他的密钥e以及N,任何人都可以给他发送密文,但是只有他能看懂。因为想要破解密码,就必须知道那两个超级大素数p,q.

p和q的位数决定了密文的安全性。

硬件绑定

由于是离线验证,所以我们能很容易想到可以根据电脑的硬件信息生成一串加密字符串,程序根据加密字符串解密出硬件信息,如果解密出来的信息与实际电脑配置信息相同,则认为验证通过。同时我们还可以在字符串上添加一些额外信息,例如有效期,这样就能做到限定时间的功能。 这里以BIOS为例,使用ManagementClass和ManagementObjectCollection读取硬件信息,注意这两个类的命名空间为System.Management

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ManagementClass mc = null;
ManagementObjectCollection moc = null;
try
{
    mc = new ManagementClass("Win32_BIOS");
    moc = mc.GetInstances();
    foreach (ManagementObject mo in moc)
    {
        bios = mo.Properties["SerialNumber"].Value.ToString();
        break;
    }
}
catch(Exception ex)
{
    bios = null;
}
finally
{
    if (mc != null) mc.Dispose();
    if (moc != null) moc.Dispose();
}

程序读取了BIOS编号,并保存在bios字符串中 现在根据BIOS编号生成密文,C#提供了RSACryptoServiceProvider来帮助加密,注意这个类的命名空间为System.Security.Cryptography

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static string Encrypt(string content)
{
    string publickey = @"<RSAKeyValue><Modulus>5m9m14XH3oqLJ8bNGw9e4rGpXpcktv9MSkHSVFVMjHbfv+SJ5v0ubqQxa5YjLN4vc49z7SVju8s0X4gZ6AzZTn06jzWOgyPRV54Q4I0DCYadWW4Ze3e+BOtwgVU1Og3qHKn8vygoj40J6U85Z/PTJu3hN1m75Zr195ju7g9v4Hk=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";
    RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
    byte[] cipherbytes;
    rsa.FromXmlString(publickey);
    cipherbytes = rsa.Encrypt(Encoding.UTF8.GetBytes(content), false);
    return Convert.ToBase64String(cipherbytes);
}
 
public static string Decrypt(string content)
{
    string privatekey = @"<RSAKeyValue><Modulus>5m9m14XH3oqLJ8bNGw9e4rGpXpcktv9MSkHSVFVMjHbfv+SJ5v0ubqQxa5YjLN4vc49z7SVju8s0X4gZ6AzZTn06jzWOgyPRV54Q4I0DCYadWW4Ze3e+BOtwgVU1Og3qHKn8vygoj40J6U85Z/PTJu3hN1m75Zr195ju7g9v4Hk=</Modulus><Exponent>AQAB</Exponent><P>/hf2dnK7rNfl3lbqghWcpFdu778hUpIEBixCDL5WiBtpkZdpSw90aERmHJYaW2RGvGRi6zSftLh00KHsPcNUMw==</P><Q>6Cn/jOLrPapDTEp1Fkq+uz++1Do0eeX7HYqi9rY29CqShzCeI7LEYOoSwYuAJ3xA/DuCdQENPSoJ9KFbO4Wsow==</Q><DP>ga1rHIJro8e/yhxjrKYo/nqc5ICQGhrpMNlPkD9n3CjZVPOISkWF7FzUHEzDANeJfkZhcZa21z24aG3rKo5Qnw==</DP><DQ>MNGsCB8rYlMsRZ2ek2pyQwO7h/sZT8y5ilO9wu08Dwnot/7UMiOEQfDWstY3w5XQQHnvC9WFyCfP4h4QBissyw==</DQ><InverseQ>EG02S7SADhH1EVT9DD0Z62Y0uY7gIYvxX/uq+IzKSCwB8M2G7Qv9xgZQaQlLpCaeKbux3Y59hHM+KpamGL19Kg==</InverseQ><D>vmaYHEbPAgOJvaEXQl+t8DQKFT1fudEysTy31LTyXjGu6XiltXXHUuZaa2IPyHgBz0Nd7znwsW/S44iql0Fen1kzKioEL3svANui63O3o5xdDeExVM6zOf1wUUh/oldovPweChyoAdMtUzgvCbJk1sYDJf++Nr0FeNW1RB1XG30=</D></RSAKeyValue>";
    RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
    byte[] cipherbytes;
    rsa.FromXmlString(privatekey);
    cipherbytes = rsa.Decrypt(Convert.FromBase64String(content), false);
    return Encoding.UTF8.GetString(cipherbytes);
}

两部分核心代码已经完成,在程序中先获取BIOS编号,然后提示用户输入许可证,这个许可证实际上就是密文,程序解密密文,这里需要注意的是,如果用户输入的密文格式有误,则解密函数会抛出异常,因此需要套上try来执行,如果发生异常,则一律认为验证失败。以下是程序界面

文件读写

验证模块已经完成,但是每次打开都要用户手动输入许可证,及其繁琐,因此我们需要将许可证保存在本地。 首先在D盘创建ducuments目录,在document里创建LICENSE文件,注意需引入命名空间System.IO 定义地址

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private static string dirname = @"D:\documents";
private static string filename = "LICENSE.dx";
private static string path = System.IO.Path.Combine(dirname, filename);

创建目录和文件,这里需注意Create后必须dispose,否则接下来读取时会提示被占用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
System.IO.Directory.CreateDirectory(dirname);
if (!File.Exists(path))
{
    FileStream fileStream = System.IO.File.Create(path);
    fileStream.Dispose();
}

读取和写入

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static string ReadFile()
{
    string key = "";
    string line;
    StreamReader sr = null;
    try
    {
        sr = new StreamReader(path);
        while ((line = sr.ReadLine()) != null)
        {
            key += line;
        }
    }
    catch(Exception ex)
    {
        key = null;
    }
    finally
    {
        if(sr != null)
        {
            sr.Dispose();
        }
    }
    return key;
}
 
public static void WriteFile(string key)
{
    StreamWriter sw = null;
    try
    {
        sw = new StreamWriter(path);
        sw.Write(key);
    }
    catch (Exception ex)
    { }
    finally
    {
        if (sw != null)
        {
            sw.Dispose();
        }
    }
}

StreamReader和StreamWriter可以放在using里面执行,这样就会自动销毁,但是为了显示dispose的重要性,本程序中手动dispose StreamReader将许可证以文本形式写入文件里,而读取也是文本形式读取,所以文件的后缀名可以随便取。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021年7月13日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
零基础漏洞挖掘
目前在读大学生,挖过半年SRC,发现实验室刚入的大一新生有大多数都不是很了解某个具体网站的漏洞要如何挖掘,想借这篇文章总结一下漏洞挖掘的基本步骤。
HACK学习
2019/08/05
2K0
网络安全红队常用的攻击方法及路径
本公众号提供的工具、教程、学习路线、精品文章均为原创或互联网收集,旨在提高网络安全技术水平为目的,只做技术研究,谨遵守国家相关法律法规,请勿用于违法用途,如果您对文章内容有疑问,可以尝试加入交流群讨论或留言私信,如有侵权请联系小编处理。
网络安全自修室
2023/12/21
1.2K0
网络安全红队常用的攻击方法及路径
像追女孩一样去渗透之信息收集
在IT行业摸索了很多年终于找到了一生所爱(信息安全),为了这份爱能传递下去,我将以这份脱单攻略来讲述我是如何get挚爱shell!希望大家都能get到女神的shell
黑伞安全
2019/10/16
3.3K0
web渗透测试——信息收集上(超详细)
渗透测试流程中最重要的就是进行信息收集,在这个阶段,我们要尽可能多的收集目标组织的信息。所谓“知己知彼,百战不殆”,我们越是了解测试目标,渗透测试的工作就越容易。
红队蓝军
2024/07/01
1.3K0
web渗透测试——信息收集上(超详细)
全流程信息收集方法总结
作为一名菜鸟,第一次写文章,有点紧张,希望大佬们轻点。 我写这个是对自己的一个总结和记录,也希望对新手有所帮助!
FB客服
2019/03/08
2.7K0
全流程信息收集方法总结
Web安全班作业 | 企业信息收集之道
https://www.tianyancha.com/company/3414868019
Ms08067安全实验室
2021/09/28
1.3K0
Sudomy:子域名枚举与分析工具
Sudomy是一个使用bash脚本创建的子域枚举工具,用于快速全面地分析域和收集子域。
FB客服
2019/10/10
1.7K0
Sudomy:子域名枚举与分析工具
干货 | 信息搜集的那些资源们(建议收藏)
百度搜索引擎与谷歌搜索引擎相比,百度搜索搜到的结果确实要比谷歌少了不少,通过谷歌语法做信息搜集,我们自然少不了留存一些谷歌镜像站,但是有些时候搜索中文网站相关信息时,百度搜索也许会有意想不到的信息,下面先推荐一些正在维护的谷歌镜像站。
网络安全自修室
2021/11/25
1K0
干货 | 信息搜集的那些资源们(建议收藏)
渗透测试-信息收集-1
进行渗透测试之前,最重要的一步就是信息收集,在这个阶段,我们要尽可能地收集目标组织的信息。所谓”知己知彼,百战不殆“我们越是了解测试目标,测试的工作就越容易,在信息收集汇总中,我们要收集的有服务器的配置信息,网站的,敏感信息,其中包括域名
Baige
2022/03/21
9950
渗透测试-信息收集-1
经验分享 | src信息收集
打开天眼查,输入公司名称—>进入公司主页—>找到知识产权部分。即可看到很多知识产权信息,点击详情即可看到发明人姓名
F12sec
2022/09/29
2.4K0
攻防信息收集之道|外网信息收集
从个人的角度去简单整理下打点前的信息收集那些事。从信息收集本质上来说多数内容都是大同小异,遇到坚壁时,不用死磕,毕竟条条大路通罗马。(大佬们也可以说说看法~向各位大佬学习!!)
亿人安全
2023/08/10
5K1
攻防信息收集之道|外网信息收集
Web渗透测试之信息收集工具大全
在SRC漏洞挖掘或渗透测试中,信息收集占很大一部分,能收集到别人收集不到的资产,就能挖到别人挖不到的洞。
Power7089
2020/04/27
4.5K0
网安学习笔记(信息收集篇)上
通过这些方法可以对网站进行基本的信息收集。 到这里今天的教程已经完成了,希望可以帮到各位如果有更简单的方法欢迎各位大佬评论区留言一起交流呢,同时也希望去更新更多的优质文章去帮助各位开发者呢,最后感谢各位师傅们的阅读 十分感谢
小胡同学
2024/08/14
2860
我的信息搜集之道
前段时间,看了一本书名为《Kali Linux 渗透测试的艺术》,我发现书中第四章信息搜集那部分有些内容不能适应有些内容不能适用国内,这勾起了我想总结一下国内信息搜集的欲望,于是就有了这篇文章。
FB客服
2018/12/28
2.9K0
【渗透技巧】资产探测与信息收集
另外,随着企业内部业务的不断壮大,各种业务平台和管理系统越来越多,很多单位往往存在着“隐形资产”,这些“隐形资产”通常被管理员所遗忘,长时间无人维护,导致存在较多的已知漏洞。
Bypass
2019/07/08
3K0
信息收集
​ Whois是一个标准的互联网协议,可以收集网络注册信息,如域名、IP地址、服务商、域名拥有者、邮箱、电话、地址等。
T1Am0
2022/09/13
1.6K0
信息收集小结
信息收集作为渗透测试的第一步往往至关重要,好的信息收集是打穿内网的基础。曾有大佬言:渗透测试的本质就是信息收集,那么我们从何开始信息收集呢?一般都是通过域名或IP地址进行展开,本小结主要从域名信息收集、子域名信息收集、端口信息收集、CMS指纹识别、敏感信息收集、CDN绕过这几大块进行归纳。
黑战士
2022/10/15
1.1K0
渗透测试流程(信息收集篇)
2.BENCHMARK函数: MySQL有一个内置的BENCHMARK()函数,可以测试某些特定操作的执行速度。 参数可以是需要执行的次数和表达式。 表达式可以是任何的标量表达式,比如返回值是标量的子查询或者函数。请注意:该函数只是简单地返回服务器执行表达式的时间,而不会涉及分析和优化的开销。
R0A1NG
2022/04/08
2.4K0
渗透测试流程(信息收集篇)
干货 | 渗透测试全流程归纳总结
  从旁观者的角度了解整个WEB应用乃至整个目标的全貌,但是资产是收集不完的,可以边收集,边进行一定程度的测试。信息收集最小的粒度应是目录。
HACK学习
2021/03/03
4.5K0
渗透测试之信息收集的问答与讨论
wafw00f waf识别 原站url后门 随便写个 /a.mdb 看有无拦截
天钧
2020/11/03
8340
相关推荐
零基础漏洞挖掘
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档