RSA加密算法C#实现、基于防火墙技术的网络安全、加密算法比较

之前接触过一点网络空间安全相关的东西,做了一些笔记,简单分享一下。

RSA加密算法C#实现

RSA加密算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用。RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。

C#使用RSA加密算法重要的一个类就是RSACryptoServiceProvider,这个类可以生成一对公钥和私钥,同时也可以加密和解密。

 

生成公钥和私钥的代码如下:

法一:

/// <summary>

/// 生成一对公钥和私钥

/// </summary>

/// <returns></returns>

public KeyValuePair<string, string> GetKeyPair1()

{

    //新建RSACryptoServiceProvider类对象

RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();

// 8 位无符号整数数组的值转换为其用 Base64 数字编码的等效字符串表示形式。

// RSACryptoServiceProvider.ExportCspBlob方法取得生成的公钥和私钥 //false 仅读取公钥

//true 读取所有密钥。参数包括私隐参数类型:System.Boolean如果包含私钥,则为true;否则为false。返回值类型:数组<System.Byte[]一个字节数组,其中包含与RSACryptoServiceProvider对象。

//仅读公钥

string public_Key = Convert.ToBase64String(RSA.ExportCspBlob(false));

//读取所有密钥

    string private_Key = Convert.ToBase64String(RSA.ExportCspBlob(true));

    return new KeyValuePair<string, string>(public_Key, private_Key);

}

法二:

/// <summary>

/// 生成一对公钥和私钥

/// </summary>

/// <returns></returns>

public KeyValuePair<string, string> GetKeyPair2()

{

    RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();

    string public_Key = RSA.ToXmlString(false);

    string private_Key = RSA.ToXmlString(true);

    return new KeyValuePair<string, string>(public_Key, private_Key);

}

注:RSA.ToXmlString()方法

ToXmlString方法创建一个xml字符串,该字符串包含当前RSA对象的公钥,或仅包含当前RSA对象。

当您需要方便地持久化RSA密钥信息时,请使用ToXmlString方法。初始化RSA对象时,使用xml字符串中的键,使用FromXmlString方法。

警告:

将包含私钥的XML字符串持久化到不安全位置是一种安全威胁。如果恶意第三方可以访问您的私钥,则应用程序的安全性可能受到损害。若要安全地持久化私钥,请使用安全密钥容器。有关在密钥容器中持久化私钥的详细信息,请参阅CspParameters.

加密方法,加密方法RSA.Encrypt,解密方法RSA.Decrypt。这个不用多说,关键是导入私钥和公钥。

//方法1

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();

rsa.ImportCspBlob(Convert.FromBase64String(str_Public_Key));

//方法2

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();

rsa.FromXmlString(privateKey);//初始化RSA对象来自XML字符串中的键信息。参数

xmlString类型:System.String包含RSA关键信息。

注:

RSACryptoServiceProvider.ImportCspBlob方法导入表示RSA密钥信息的BLOB。

 参数键块类型:数组<System.Byte[]表示RSA密钥BLOB的字节数组。

Convert.FromBase64String Method将二进制数据编码为基本64位数字,转换为等效的8位无符号整数数组

FromXmlString(privateKey);//初始化RSA对象来自XML字符串中的键信息。

参数xmlString类型:System.String包含RSA关键信息。

 

RSA非对称加密,支持公钥加密私钥解密,或者私钥加密公钥解密,但是C#却只实现了公钥加密私钥解密,如果我们需要实现私钥加密公钥解密,就需要使用到第三方插件,“BouncyCastle.Crypto”

 

注:参考文献(参考CSDN博客论文)

原文链接https://blog.csdn.net/weixin_34342992/article/details/93923786

文章代码解读参考官方方法字典,链接https://docs.microsoft.com/en-us/previous-versions/windows/silverlight/dotnet-windows-silverlight/9zxy6ds8%28v%3dvs.95%29

基于防火墙技术的网络安全

一、我国网络安全问题日益突出的主要标志

1.计算机系统遭受病毒感染或破坏的情况十分严重。据国家应急处理中心等相关部门介绍,从国家计算机病毒应急处理中心日常监测结果看来,当前计算机病毒呈异常活跃态势。据调查,我国约73%的计算机用户曾感染计算机病毒,且成上升姿态。其中,感染3次以上的用户高达59%,而且病毒的破坏性较大,被病毒破坏全部数据的占14%,破坏部分数据的占57%。

2.黑客愈加平凡的活动已成极大威胁。网络安全系统具有致命的脆弱性、易受攻击性和开放性,从我国国内情况来看,我国有95%与互联网相联的中心曾遭受过境内外黑客的攻击或侵入,而其中银行、金融和证券机构是被黑客攻击的重点。

3.基础设施普遍面临安全挑战。面对网络安全所表现的严峻形势,我国的网络安全系统在预测、反应、防范和恢复能力方面存在着许多薄弱环节。根据英国《简氏战略报告》和一些其它网络权威组织对各国防护能力的评估,我国被列入防护能力最低的国家之一。我国网络安全不仅大大低于美国、以色列和俄罗斯等安全强国,而且排在韩国、印度之后。近年来,我国国内与网络相关的各类违法行为以每年30%的速度增长。据某市安全管理部门统计,2009年第1季度内,该市共遭受了近37万次网络黑客攻击、以及2.1万次以上病毒入侵和将近57次系统瘫痪。该市某公司的镜像网站在10月份1个月内,就遭到100多个恶意攻击。

4.网络政治颠覆活动发生频繁。近年来,国内外反动势力利用互联网组党结社,进行针对我国党和政府的非法组织和串联活动,猖獗频繁,屡禁不止。尤其是一些非法组织有计划地通过网络渠道,宣传异教邪说,妄图扰乱人心,扰乱社会秩序。例如,据媒体报道,“法轮功”非法组织就是在美国设网站,利用无国界的空间进行反政府活动。

二、国外状况

根据美国FBI的统计,因网络安全问题美国每年所造成的经济损失高达75亿美元,而在全球平均每20秒钟就会发生一起Internet计算机侵入事件。

三、网络安全

主要是在分布网络环境中,对信息载体(处理载体、存储载体、传输载体)和信息处理、传输、存储、访问提供安全保护和漏洞的综合结果。

1、 网络安全问题概述

从狭义的保护角度来看,计算机网络安全是指计算机及其网络系统资源和信息资源不受自然和人为有害因素的威胁和危害,即是指计算机、网络系统的硬件、软件及其系统中的数据受到保护,不因偶然的或者恶意的原因而遭到破坏、更改、泄露,确保系统能连续可靠正常地运行,使网络服务不中断。

从广义来说,凡是涉及到计算机网络上信息的保密性、完整性、可用性、真实性和可控性的相关技术和理论都是计算机网络安全的研究领域。所以,广义的计算机网络安全还包括信息设备的物理安全性,诸如场地环境保护、防火措施、防水措施、静电防护、电源保护、空调设备、计算机辐射和计算机病毒等。

四、网络安全面临的威胁

一般认为,计算机网络系统的安全威胁主要来自黑客的入侵计算机病毒拒绝服务攻击三个方面。

1. 黑客入侵,即黑客进入网络通过非法手段非法使用网络资源。例如采用匿名用户访问进行攻击;通过隐蔽通道进行非法活动;通过网络监听获取网上用户账号和密码;非法获取网上传输的数据;突破防火墙等。

2. 计算机病毒的侵袭。当前,活性病毒达14000多种,计算机病毒侵入网络,对网络资源进行破坏,使网络不能正常工作,甚至造成整个网络的瘫痪。

3. 拒绝服务攻击。例如“点在邮件炸弹”,它的表现形式是用户在很短的时间内收到大量无用的电子邮件,从而影响正常业务的运行。严重时会使系统关机,网络瘫痪。

具体讲,网络系统面临的安全威胁主要有如下表现:身份窃取、非授权访问、数据窃取、拒绝服务、病毒与恶意攻击、冒充合法用户„„等。

五、影响网络安全的因素

1. 单机安全

购买单机时,型号的选择;计算机的运行环境(电压、湿度、防尘条件、强电磁场以及自然灾害等);计算机的操作„„等等,这些都是影响单机安全性的因素。

2. 网络安全

影响网络安全的因素有:节点的安全、数据的安全(保存和传输方面)、文件的安全等。

六、网络安全措施

网络信息安全涉及方方面面的问题,是一个复杂的系统。一个完整的网络信息安全体系至少应包括三类措施:

一是法律政策、规章制度以及安全教育等外部软环境

二是技术方面,如信息加密存储传输、身份认证、防火墙技术、网络防毒等。

三是管理措施,包括技术与社会措施。

主要措施有:提供实时改变安全策略的能力、实时监控企业安全状态、对现有的安全系统实施漏洞检查等,以防患于未然。这三者缺一不可,其中,法律政策是安全的基石,技术是安全的保障,管理和审计是安全的防线。

七、网络安全的关键技术

1. 数据加密

加密就是把明文变成密文,从而使未被授权的人看不懂它。有两种主要的加密类型:私匙加密和公匙加密

2.认证

对合法用户进行认证可以防止非法用户获得对公司信息系统的访问,使用认证机制还可以防止合法用户访问他们无权查看的信息。

3. 防火墙技术

防火墙就是用来阻挡外部不安全因素影响的内部网络屏障,其目的就是防止外部网络用户未经授权的访问。目前,防火墙采取的技术,主要是包过滤、应用网关、子网屏蔽等。但是,防火墙技术在网络安全防护方面也存在一些不足:防火墙不能防止内部攻击防火墙不能取代杀毒软件;防火墙不易防止反弹端口木马攻击等。

4. 检测系统

入侵检测技术是网络安全研究的一个热点,是一种积极主动的安全防护技术,提供了对内部入侵、外部入侵和误操作的实时保护,在网络系统受到危害之前拦截相应入侵。

随着时代的发展,入侵检测技术将朝着三个方向发展:分布式入侵检测、智能化入侵检测和全面的安全防御方案。

5. 防病毒技术

随着计算机技术的发展,计算机病毒变得越来越复杂和高级,计算机病毒防范不仅仅是一个产品、一个策略或一个制度,它是一个汇集了硬件、软件、网络、以及它们之间相互关系和接口的综合系统。

6. 文件系统安全

在网络操作系统中,权限是一个关键性的概念,因为访问控制实现在两个方面:本地和远程。建立文件权限的时候,必须在Windows中首先实行新技术文件系统(New Technology File System,NTFS)。一旦实现了NTFS,你可以使用Windows资源管理器在文件和文件夹上设置用户级别的权限。你需要了解可以分配什么样的权限,还有日常活动期间一些规则是处理权限的。Windows操作系统允许建立复杂的文件和文件夹权限,你可以完成必要的访问控制。

八、访问控制技术

而在计算网络的安全中,保护网络数据和程序等资源,以免受到有意或无意地破坏或越权修改与占用的技术,称为访问控制技术。实现访问控制技术的最好办法就是有一个好的安全策略,在这个安全策略上使用防火墙技术。因此,为了实现网络安全,必须了解防火墙技术的体系结构。

九、防火墙技术

网络安全防范措施有:防火墙技术,安全内核术,WEB安全技术,网络反病毒技术,鉴别技术。

防火墙技术作为一种比较成熟的网络安全技术,其安全性直接关系到用户的切身利益。针对网络安全独立元素——防火墙技术,通过对防火墙日志文件的分析,设计相应的数学模型和软件雏形,采用打分制的方法,判断系统的安全等级,实现对目标网络的网络安全风险评估,为提高系统的安全性提供科学依据。

对网络安全的威胁主要表现在:非授权访问,冒充合法用户,破坏数据完整性,干扰系统正常运行,利用网络传播病毒,线路窃听等方面。这以要求我们与Internet互连所带来的安全性问题予以足够重视。计算机网络技术的飞速发展使网络安全问题日益突出,而防火墙是应用最广泛的安全产品。

目前,普遍所采取的防火墙技术是一种非常有效的网络安全模型。主要用来保护内部网络免受来自不安全网络的攻击、入侵。防火墙技术不只用于Internet之中,也用于Internet中的部门之间的网络。从逻辑上讲,防火墙是由过滤器,分析器和限制器组成;从物理上讲,防火墙可通过多种方式实现。通常,防火墙是一组硬件设备--路由器、主计算机,或者是路由器、计算机和配有的软件的网络的组合。不同的防火墙其配置的方法也不同,这取决于安全策略,全面规划以及预算等。

防火墙可以根据自己的需要创建防火墙规则控制互联网到PC以及PC到互联网的所有连接,并屏蔽入侵企图,还可以保护人们在网上浏览时免受黑客的攻击,实时防范网络黑客的侵袭。

防火可以有效地保护信息的安全、阻截各种恶意攻击;邮件内容检测可以实时监视邮件系统的内容,并阻挡一切针对硬盘的恶意活动;信息泄漏拦截遏制邮件病毒的蔓延、保证安全地浏览网页。

用户可以根据自己的需求,通过参数设定,达到控制个人计算机网络与互联网之间的信息交流,阻止恶性信息、黑客对本机的攻击,比如聊天室炸弹ICMPnood攻击木马破译并修改邮件密码等。并且防火墙能够实时记录其它计算机系统试图对本机系统的访问、入侵,使个人计算机在连接到互联网时避免受到网络攻击或资料泄漏等安全威胁。

个人防火墙是在单机操作系统上,采取一系列安全防护措施,使个人计算机机的信息得到一定的保护。个人防火墙是按一定的规则对TCP,UDP,ICMP和IGMP等报文进行过滤,对系统进程和网络的信息流进行监控,防止一些恶意的攻击的面向单机操作系统的一种小型安全防护软件,

目前市场上大多数的防火墙产品仅仅是基于网关的防火墙,虽然它们的功能已经相当强大,但由于它们是基于内部网是可靠安全的,一切威胁都来自网外的假设。因此,这些防火墙防外而不防内,不能很好的解决每一个拨号上网用户所在主机的安全问题,也难以实现对企业内部局域网之间的安全通信,而多数个人上网之时,并没有置身于得到安全防护的内部网络之中。

个人上网用户使用的操作系统多为Windows操作系统,而Windows操作系统,虽然经过长久发展,但由于自身过于庞大等一系列因素,导致Windows操作系统,特别是Windows XP操作系统本身的安全性就不高。Windows各种漏洞不断被公布,对个人计算机的攻击也日趋频繁。这些攻击一般都是利用操作系统在设计的安全漏洞以及通信协议的安全漏洞来实现的。例如假冒 IP 包对通信双方之间进行欺骗:对主机大量发送数据包进行轰炸攻击,使之际崩溃;及蓝屏攻击等。因此,为了保护个人计算机的安全通信,研制行之有效的个人防火墙技术必要。

所谓的防火墙是指设置在不同网络(如可信任的企业内部网和不可信的公共网)或网络安全域之间的一系列部件的组合 。它可通过监测、限制、更改跨越防火墙的数据流,尽可能地对外部屏蔽网络内部的信息、结构和运行状况, 以此来实现网络的安全保护。在逻辑上,防火墙是一个分离器,一个限制器,也是一个分析器,有效地监控了内部网和Internet 之间的任何活动, 保证了内部网络的安全。一个高效可靠的防火墙必须具有以下典型的特性:

1. 只有本地安全策略所授权的通信才可允许通过;

2. 防火墙本身是免疫的,不能被穿透的;

3. 从外到里和从里到外的所有通信都必须通过防火墙

防火墙图示

 

十、 防火墙发展简介

从防火墙近年内的发展来看,可将其发展分为四个阶段:

第一阶段:基于路由器的防火墙

第一代防火墙几乎与路由器同时出现,多数路由器本身包含有分组过滤的功能,所以网络访问控制功能可通过路由控制来实现,而这种采用包过滤技术的防火墙为第一代防火墙产品。

第一代防火墙特点为:

1、防火墙和路由器是一体化的。

2、防火墙是利用路由器对组的解析,使用访问控制表的方式实现对分组的过滤。

3、进行过滤判决的依据是:端口号、地址、IP旗标和其它网络特征

由于早期认识不足,防火墙其明显的不足之处:

1、由于路由器协议的灵活性,以及路由协议本身的安全漏洞,外部非安全网络进入内部网络十分容易

2、由于路由器采用的分组过滤规则,其设置和配置存在安全隐患,导致防火墙亦存在安全隐患

3、信息在网络上是以明文的方式传送的,因此攻击者可以采用伪造的路由信息,通过假冒”地址欺骗防火墙

4、路由器防火墙本质性缺陷:路由器的主要功能是为网络访问提供灵活、动态的路由,而防火墙则要对访问行为实施固定的、静态的控制,这是其难以调和的矛盾,由此防火墙的设置将会会大大降低路由器的性能。

因此,基于路由器的防火墙只是人们早期认识不足,对网络安全的所采取的一种应急措施,用这种权宜之计来对付黑客的入侵是非常危险的。

第二阶段:用户化的防火墙工具套

由于路由器防火墙的诸多不足,很多大型用户纷纷希望用经过专门开发的防火墙来保护其的网络安全,在这样的前提下推动了用户化防火墙工具套的出现。

第二代防火墙,即用户化的防火墙工具套具有以下特征:

1、根据用户需求,提供模块化的软件包;

2、将路由器中的过滤功能独立出来,并添加报警和审计功能;

3、比第一代防火墙价格低,安全性高;

4、为纯软件产品,用户可以从网上直接下载,可以自己手动构建防火墙。

第二代防火墙作为纯软件产品,其在维护和管理上都变得十分复杂,因此它也有不足之处:

1、对用户的技术要求很高;

2、配置和维护过程费时、复杂;

3、本身的实现、处理速度、安全性均有局限;

4、在使用是容易出现差错。

第三阶段:建立于通用操作系统上的防火墙

基于软件的防火墙对技术的要求,配置维护时的复杂,以及其易出差错的不足促使了防火墙开发商很快推出了新一代建立在通用操作系统上的防火墙产品,这种商业防火墙产品,广泛用于近些年的市场,它具有以下特点:

1、实现了前两代防火墙的功能

2、批量上市的专用防火墙产品;

3、安装了专用的代理系统,可监控所有协议的数据及指令;

4、安全性和速度明显提高;

5、保护用户可配置内核参数的设置,保护用户的编程空间。

第三代防火墙所具有的特点保证了其稳定快速的运行,已得到广大用户认同。但是随着使用时间的推延,安全问题的改变,网络发展日益不断的变化,次代防火墙亦表现出不少问题

第四阶段:具有安全操作系统的防火墙

具有安全操作系统的防火墙解决了第三代防火墙的致命缺陷,由于其本身就是一款操作系统,因而得到了操作系统和防火墙厂商的共同支持,其本身具有如下特点:

1、防火墙厂商拥有该操作系统的源代码,可实现安全内核;

2、对各个服务器、子系统作安全处理,一旦遭到黑客攻击,它将会被隔离在当前服务器内,不会对网络中其他服务器、子系统造成威胁;

3、功能上除了实现前三代的固有功能之外还加上了应用网关、电路级网关、而且具有加密与鉴别功能;

十一、防火墙的功能

无论是何种类型防火墙,从总体上来看,都应具备以下五大基本功能:过滤进、出网络的数据;管理进、出网络访问行为;封堵某些禁止的业务;记录通过防火墙的信息内容和活动;对网络攻击的检测和报警。

防火墙的主要功能就是控制对受保护网络的非法访问,它通过监视、限制、更改通过网络的数据流,一方面尽可能屏蔽内部网的拓扑结构,另一方面对内屏蔽外部危险站点,用以防范外对内、内对外的非法访问。

由软件和硬件组成的防火墙应该具有以下功能:

1(所有进出网络的通信流都应该通过防火墙;

2(所有穿过防火墙的通信流都必须有安全策略和计划的确认和授权;

3(理论上说,防火墙是穿不透的。利用防火墙能保护站点不被任意联接,甚至能建立跟踪工具,帮助总结并记录有关正在进行的联接资源、服务器提供的通信量以及试图闯入者的任何企图。

总之,防火墙是阻止外面的人对你的网络进行访问的任何设备,此设备通常是软件和硬件的组合体,它通常根据一些规则来挑选想要或不想要的地址。

十二、防火墙具体功能

1、包过滤

包过滤是一种网络数据安全保护机制,包过滤可以控制流入和流出网络的数据信息,它是由定义的各条数据安全规则所组成的,防火墙设置可基于源端口、源地址、目的端口、目的地址、时间和协议;可以根据地址簿进行设置规则

2、认证和应用代理

认证指防火墙对访问者合法身份的确认。代理是指防火墙内置用户认证数据库,提供FTP、SMTP和HTTP代理功能,并可以对这三种协议进行访问控制,并且支持URL过滤功能。

3、地址转换

网络地址变换是将外部网络或内部网络的IP地址进行转换,可分为源地址转换和目的地址转换。源地址转换是用于对内部网络地址进行转换,而对外部网络则隐藏起内部网络的结构,以避免受到来自外部的其他网络非授权访问或恶意攻击、入侵等行为。同时将有限的IP地址采用动态或静态的方式的与内部IP地址相对应起来,以此缓解地址空间短缺问题,节省资源,降低成本。目的地址转换主要用于外部网络主机访问内部网络主机。

4、透明和路由

防火墙将网关隐藏在公共系统之后,从而使其免遭直接攻击。隐蔽智能网关提供了对互联网服务进行透明的访问,并阻止外部未授权访问者对专用网络的非法访问;防火墙还提供静态路由功能,支持路由方式,支持内部网络多个子网之间的安全访问

参考文献:基于防火墙技术的网络安全

原文链接http://www.docin.com/p-187757115.html

加密算法比较

1、对称加密算法:对称加密(也叫私钥加密)指加密和解密使用相同密钥的加密算法。有时又叫传统密码算法,就是加密密钥能够从解密密钥中推算出来,同时解密密钥也可以从加密密钥中推算出来。而在大多数的对称算法中,加密密钥和解密密钥是相同的,所以也称这种加密算法为秘密密钥算法或单密钥算法。它要求发送方和接收方在安全通信之前,商定一个密钥。对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人都可以对他们发送或接收的消息解密,所以密钥的保密性对通信性至关重要。对称加密算法的优点在于加解密的高速度和使用长密钥时的难破解性。不足之处是,交易双方都使用同样钥匙,安全性得不到保证。

2、非对称加密算法:非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法

非对称密码体制的特点:算法强度复杂、安全性依赖于算法与密钥但是由于其算法复杂,而使得加密解密速度没有对称加密解密的速度快。对称密码体制中只有一种密钥,并且是非公开的,如果要解密就得让对方知道密钥。所以保证其安全性就是保证密钥的安全,而非对称密钥体制有两种密钥,其中一个是公开的,这样就可以不需要像对称密码那样传输对方的密钥了。这样安全性就大了很多。

3、加密模式:

(1)电子密码本(Electronic Code Book,ECB):在 ECB 模式中,每块明文都是独立于其他块加密的。虽然这样做比较高效(可以并行执行多个数据块的加密)但这种方法有一个很大的问题。例如,在 ECB 模式中,对相同明文块的加密总是产生相同的密文块,这为某些类型的密码分析攻击打开了方便之门。ECB 方式通常被认为不适合保护敏感数据。

 

(2)密码块链接(Cipher Block Chaining,CBC):在 CBC 模式中,文本块是连续加密的,在加密当前明文块之前,用前一次块加密的结果修改当前明文块。这个过程改进了加密的一些特征(例如,相同的明文块不会产生相同的密文块),但是由于其加密过程是连续的,CBC 方式不支持加密的并行化。CBC 方式使用一个称作初始化向量(Initialization Vector,IV)的附加文本来开始链接过程。IV 用于修改被加密的第一个明文块。

密码反馈(Cipher Feedback,CFB):在 CFB 模式中,先加密前一个块,然后将得到的结果与明文相结合产生当前块,从而有效地改变用于加密当前块的密钥。这里密钥的值是不断变化的,这个过程与流加密类似,但是性能则远不如流加密。与 CBC 方式一样,这里要使用一个初始化向量作为加密过程的种子

输出反馈(Output Feedback,OFB):在 OFB 方式中,使用一个种子或 IV 来开始加密过程。加密种子后,将加密结果与明文块结合产生密文。之后被加密的种子再度被加密,如此重复此过程,直到遍及全部明文。同样,结果类似于流加密

密码文本窃用(Cipher Text Steal):模式处理任何长度的纯文本并产生长度与纯文本长度匹配的密码文本。除了最后两个纯文本块外,对于所有其他块,此模式与CBC模式的行为相同

DES:数据加密标准(DES,Data Encryption Standard)是一种使用密钥加密的块密码,它基于使用56位密钥的对称算法。DES现在已经不被视为一种安全的加密算法,主要因为它使用的56位密钥过短。为了提供实用所需的安全性,可以使用DES的派生算法3DES来进行加密,在2001年,DES作为一个标准已经被高级加密标准(AES)所取代。

使用DES加密字符串:

        /// <summary>

        /// 使用DES加密字符串

         /// </summary>

        /// <param name="source">要加密的字符串</param>

        /// <param name="key">加密密匙</param>

        /// <returns>加密后的字符串</returns>

        private static string EncryptByDES(string source, string key)

        {

            byte[] input = Encoding.Default.GetBytes(key);

            byte[] temp = new byte[16] { 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200 };

            if (input.Length > 16)

            {

                Console.WriteLine("只能输入8个汉字或者16个字符!");

                return null;

            }

            input.CopyTo(temp, 0);

            DESCryptoServiceProvider cryptoService = new DESCryptoServiceProvider();//实例化DES加密服务类

              cryptoService.Mode = CipherMode.CBC;//使用的加密模式

              cryptoService.IV = temp.Take(8).ToArray();//定义偏移量

              cryptoService.Key = temp.Skip(8).ToArray();//定义密钥

              ICryptoTransform encryptor = cryptoService.CreateEncryptor();//使用加密服务对象创建一个对流执行加密转换的加密器

              byte[] byteArr = Encoding.Default.GetBytes(source);//把源字符串放到字节数组中

              return Convert.ToBase64String(encryptor.TransformFinalBlock(byteArr, 0, byteArr.Length));//使用加密器加密数据

        }

使用DES解密字符串:

        /// <summary>

        /// 使用DES解密字符串

         /// </summary>

        /// <param name="source">要解密的字符串</param>

        /// <param name="key">解密密匙</param>

        /// <returns>解密后的字符串</returns>

        private static string DecryptByDES(string source, string key)

        {

            byte[] input = Encoding.Default.GetBytes(key);

            byte[] temp = new byte[16] { 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200 };

            if (input.Length > 16)

            {

                Console.WriteLine("错误的密匙");

                return null;

            }

            input.CopyTo(temp, 0);

            DESCryptoServiceProvider cryptoService = new DESCryptoServiceProvider();

            cryptoService.Mode = CipherMode.CBC;

            cryptoService.IV = temp.Take(8).ToArray();

            cryptoService.Key = temp.Skip(8).ToArray();

            byte[] byteArr = Convert.FromBase64String(source);//把源字符串放到字节数组中

              ICryptoTransform decryptor = cryptoService.CreateDecryptor();//使用加密服务对象创建一个对流执行解密转换的解密器

              return Encoding.Default.GetString(decryptor.TransformFinalBlock(byteArr, 0, byteArr.Length));//使用解密器解密数据,密匙错误会抛异常

        }

3DES:(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称。它相当于是对每个数据块应用三次DES加密算法。由于计算机运算能力的增强,原版DES密码的密钥长度变得容易被暴力破解;3DES即是设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的块密码算法。

使用3DES加密字符串:

        /// <summary>

        /// 使用3DES加密字符串

         /// </summary>

        /// <param name="source">要加密的字符串</param>

        /// <param name="key">加密密匙</param>

        /// <returns>加密后的字符串</returns>

        public static string EncryptBy3DES(string source, string key)

        {

            Regex reg = new Regex(@"[\w\W]{0,8}");

            MatchCollection matchs = reg.Matches(key);

            string result = source;

            foreach (Match match in matchs)

            {

                result = EncryptByDES(result, match.ToString());

            }

            return result;

        }

3DES解密字符串

        /// <summary>

        /// 使用3DES解密字符串

         /// </summary>

        /// <param name="source">要解密的字符串</param>

        /// <param name="key">解密密匙</param>

        /// <returns>解密后的字符串</returns>

        public static string DecryptBy3DES(string source, string key)

        {

            Regex reg = new Regex(@"[\w\W]{0,8}");

            MatchCollection matchs = reg.Matches(key);

            string result = source;

            for (int i = matchs.Count - 1; i >= 0; i--)

            {

                result = DecryptByDES(result, matchs[i].ToString());

            }

            return result;

        }

散列:Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。

散列函数的性质:

所有散列函数都有如下一个基本特性:如果两个散列值是不相同的(根据同一函数),那么这两个散列值的原始输入也是不相同的。这个特性是散列函数具有确定性的结果。但另一方面,散列函数的输入和输出不是一一对应的,如果两个散列值相同,两个输入值很可能是相同的,但并不能绝对肯定二者一定相等。输入一些数据计算出散列值,然后部分改变输入值,一个具有强混淆特性的散列函数会产生一个完全不同的散列值。 典型的散列函数都有无限定义域,比如任意长度的字节字符串,和有限的值域,比如固定长度的比特串。在某些情况下,散列函数可以设计成具有相同大小的定义域和值域间的一一对应。一一对应的散列函数也称为排列。可逆性可以通过使用一系列的对于输入值的可逆“混合”运算而得到

SHA-1及其他: SHA1对长度小于264的输入,产生长度为160bit的散列值,因此抗穷举(brute-force)性更好。SHA-1 设计时基于和MD4相同原理,并且模仿了该算法。散列是一种单向算法,一旦数据被转换,将无法再获得其原始值,只能对加密后的数据进行比较。

MD5 MD5是 Rivest 于1991年对MD4的改进版本。它对输入仍以512位分组,其输出是4个32位字的级联,与 MD4 相同。MD5比MD4来得复杂,并且速度较之要慢一点,但更安全,在抗分析和抗差分方面表现更好。

使用SHA1加密:

        /// <summary>

        /// 使用SHA1加密

         /// </summary>

        /// <param name="source">要加密的字符串</param>

        /// <returns>加密后的字符串</returns>

        public static string EncryptBySHA1(string source)

        {

            SHA1 sha1 = new SHA1CryptoServiceProvider();

            byte[] byteArr = sha1.ComputeHash(Encoding.Default.GetBytes(source));

            sha1.Clear();

            return Convert.ToBase64String(byteArr);

        }

使用SHA256加密

        /// <summary>

        /// 使用SHA256加密

         /// </summary>

        /// <param name="source">要加密的字符串</param>

        /// <returns>加密后的字符串</returns>

        public static string EncryptBySHA256(string source)

        {

            SHA256 sha256 = new SHA256CryptoServiceProvider();

            byte[] byteArr = sha256.ComputeHash(Encoding.Default.GetBytes(source));

            sha256.Clear();

            return Convert.ToBase64String(byteArr);

        }

使用SHA384加密:

        /// <summary>

        /// 使用SHA384加密

         /// </summary>

        /// <param name="source">要加密的字符串</param>

        /// <returns>加密后的字符串</returns>

        public static string EncryptBySHA384(string source)

        {

            SHA384 sha384 = new SHA384CryptoServiceProvider();

            byte[] byteArr = sha384.ComputeHash(Encoding.Default.GetBytes(source));

            sha384.Clear();

            return Convert.ToBase64String(byteArr);

        }

使用SHA512加密:

        /// <summary>

        /// 使用SHA512加密

         /// </summary>

        /// <param name="source">要加密的字符串</param>

        /// <returns>加密后的字符串</returns>

        public static string EncryptBySHA512(string source)

        {

            SHA512 sha512 = new SHA512CryptoServiceProvider();

            byte[] byteArr = sha512.ComputeHash(Encoding.Default.GetBytes(source));

            sha512.Clear();

            return Convert.ToBase64String(byteArr);

        }

使用MD5加密:

        /// <summary>

        /// 使用MD5加密

         /// </summary>

        /// <param name="source">要加密的字符串</param>

        /// <returns>加密后的字符串</returns>

        public static string EncryptByMD5(string source)

        {

            MD5 md5 = new MD5CryptoServiceProvider();

            byte[] byteArr = md5.ComputeHash(Encoding.Default.GetBytes(source));

            md5.Clear();

            return Convert.ToBase64String(byteArr);

        }

AES:密码学中的高级加密标准(Advanced Encryption Standard,AES)是一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。高级加密标准已然成为对称密钥加密中最流行的算法之一。它可以使用128、192 和 256 位密钥。(16字节、24字节、32字节)

使用AES加密字符串:

        /// <summary>

        /// 使用AES加密字符串

         /// </summary>

        /// <param name="source">要加密的字符串</param>

        /// <param name="key">加密密匙</param>

        /// <returns>加密后的字符串</returns>

        private static string EncryptAES(string source, string key)

        {

            byte[] input = Encoding.Default.GetBytes(key);

            byte[] temp = new byte[32] { 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200 };

            input.CopyTo(temp, 0);

            RijndaelManaged aes = new RijndaelManaged();

            aes.Mode = CipherMode.CBC;

            aes.Key = temp.Take(16).ToArray();

            aes.IV = temp.Skip(16).ToArray();

            ICryptoTransform cTransform = aes.CreateEncryptor();

            byte[] byteArr = Encoding.Default.GetBytes(source);

            return Convert.ToBase64String(cTransform.TransformFinalBlock(byteArr, 0, byteArr.Length));

        }

使用AES解密字符串:

        /// <summary>

        /// 使用AES解密字符串

         /// </summary>

        /// <param name="source">要解密的字符串</param>

        /// <param name="key">解密密匙</param>

        /// <returns>解密后的字符串</returns>

        private static string DecryptAES(string source, string key)

        {

            byte[] input = Encoding.Default.GetBytes(key);

            byte[] temp = new byte[32] { 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200 };

            input.CopyTo(temp, 0);

            RijndaelManaged aes = new RijndaelManaged();

            aes.Mode = CipherMode.CBC;

            aes.Key = temp.Take(16).ToArray();

            aes.IV = temp.Skip(16).ToArray();

            ICryptoTransform cTransform = aes.CreateDecryptor();

            byte[] byteArr = Convert.FromBase64String(source);

            return Encoding.Default.GetString(cTransform.TransformFinalBlock(byteArr, 0, byteArr.Length));

        }

RSA:RSA加密算法是一种非对称加密算法,只有短的RSA钥匙才可能被强力方式破解。还没有任何可靠的攻击RSA算法的方式,只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被破解的。RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。RSA是被研究得最广泛的公钥算法,从提出到现在的三十多年里,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。由于进行的都是大数计算,使得RSA最快的情况也比DES慢上好几倍,无论是软件还是硬件实现。速度一直是RSA的缺陷

使用RSA加密字符串:

        /// <summary>

        /// 使用RSA加密字符串

         /// </summary>

        /// <param name="source">要加密的字符串</param>

        /// <param name="publicKey">生成的公匙</param>

        /// <param name="privateKey">生成的私匙</param>

        /// <returns>加密后的字符串</returns>

        public static string EncryptByRSA(string source, out string publicKey, out string privateKey)

        {

          RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();//实例化RSA加密服务类

            publicKey = Convert.ToBase64String(RSA.ExportCspBlob(false));//使用RSA加密服务生成公匙

            privateKey = Convert.ToBase64String(RSA.ExportCspBlob(true));//使用RSA加密服务生成私匙

            byte[] byteArr = RSA.Encrypt(Encoding.Default.GetBytes(source),true);//使用RSA加密数据

            return Convert.ToBase64String(byteArr);

        }

使用RSA解密字符串:

        /// <summary>

        /// 使用RSA解密字符串

         /// </summary>

        /// <param name="source">要解密的字符串</param>

        /// <param name="privateKey">使用的私匙</param>

        /// <returns>解密后的字符串</returns>

        public static string DecryptByRSA(string source, string privateKey)

        {

          RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();

          byte[] publicKey = Convert.FromBase64String(privateKey);//使用私匙生成公匙

            RSA.ImportCspBlob(publicKey);//导入公匙信息

            return Encoding.Default.GetString(RSA.Decrypt(Convert.FromBase64String(source), true));//使用RSA解密数据

        }

参考文章网站:https://www.cnblogs.com/-zgm/archive/2012/10/26/2741041.html

猜你喜欢

转载自blog.csdn.net/dujuancao11/article/details/109138491