精华内容
下载资源
问答
  • 常用数据加密算法
    千次阅读
    2019-01-10 14:34:46

    对称加密

    指加密和解密使用相同密钥的加密算法。对称加密算法的优点在于加解密的高速度和使用长密钥时的难破解性。

    假设两个用户需要使用对称加密方法加密然后交换数据,则用户最少需要2个密钥并交换使用,如果企业内用户有n个,则整个企业共需要n×(n-1) 个密钥,密钥的生成和分发将成为企业信息部门的恶梦。

    对称加密算法的安全性取决于加密密钥的保存情况,但要求企业中每一个持有密钥的人都保守秘密是不可能的,他们通常会有意无意的把密钥泄漏出去——如果一个用户使用的密钥被入侵者所获得,入侵者便可以读取该用户密钥加密的所有文档,如果整个企业共用一个加密密钥,那整个企业文档的保密性便无从谈起。

    常见的对称加密算法:DES、3DES、DESX、Blowfish、IDEA、RC4、RC5、RC6和AES

    非对称加密

    指加密和解密使用不同密钥的加密算法,也称为公私钥加密。假设两个用户要加密交换数据,双方交换公钥,使用时一方用对方的公钥加密,另一方即可用自己的私钥解密。

    如果企业中有n个用户,企业需要生成n对密钥,并分发n个公钥。由于公钥是可以公开的,用户只要保管好自己的私钥即可,因此加密密钥的分发将变得十分简单。同时,由于每个用户的私钥是唯一的,其他用户除了可以可以通过信息发送者的公钥来验证信息的来源是否真实,还可以确保发送者无法否认曾发送过该信息。

    非对称加密的缺点是加解密速度要远远慢于对称加密,在某些极端情况下,甚至能比非对称加密慢上1000倍。

    常见的非对称加密算法:RSA、ECC(移动设备用)、Diffie-Hellman、El Gamal、DSA(数字签名用)

    Hash算法

    Hash算法特别的地方在于它是一种单向算法,用户可以通过Hash算法对目标信息生成一段特定长度的唯一的Hash值,却不能通过这个Hash值重新获得目标信息。因此Hash算法常用在不可还原的密码存储、信息完整性校验等。

    常见的Hash算法:MD2、MD4、MD5、HAVAL、SHA、SHA-1、HMAC、HMAC-MD5、HMAC-SHA1

    加密算法的效能通常可以按照算法本身的复杂程度、密钥长度(密钥越长越安全)、加解密速度等来衡量。上述的算法中,除了DES密钥长度不够、MD2速度较慢已逐渐被淘汰外,其他算法仍在目前的加密系统产品中使用。

    加密算法的选择

    前面的章节已经介绍了对称解密算法和非对称加密算法,有很多人疑惑:那我们在实际使用的过程中究竟该使用哪一种比较好呢?

    我们应该根据自己的使用特点来确定,由于非对称加密算法的运行速度比对称加密算法的速度慢很多,当我们需要加密大量的数据时,建议采用对称加密算法,提高加解密速度。

    对称加密算法不能实现签名,因此签名只能非对称算法。

    由于对称加密算法的密钥管理是一个复杂的过程,密钥的管理直接决定着他的安全性,因此当数据量很小时,我们可以考虑采用非对称加密算法。

    在实际的操作过程中,我们通常采用的方式是:采用非对称加密算法管理对称算法的密钥,然后用对称加密算法加密数据,这样我们就集成了两类加密算法的优点,既实现了加密速度快的优点,又实现了安全方便管理密钥的优点。

    如果在选定了加密算法后,那采用多少位的密钥呢?一般来说,密钥越长,运行的速度就越慢,应该根据的我们实际需要的安全级别来选择,一般来说,RSA建议采用1024位的数字,ECC建议采用160位,AES采用128为即可。

    对称加密算法
    对称加密算法用来对敏感数据等信息进行加密,常用的算法包括:

    DES(Data Encryption Standard):数据加密标准,速度较快,适用于加密大量数据的场合;

    3DES(Triple DES):是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高;

    AES(Advanced Encryption Standard):高级加密标准,是下一代的加密算法标准,速度快,安全级别高。

    非对称算法
    RSA:由 RSA 公司发明,是一个支持变长密钥的公共密钥算法,需要加密的文件块的长度也是可变的;

    DSA(Digital Signature Algorithm):数字签名算法,是一种标准的 DSS(数字签名标准);

    ECC(Elliptic Curves Cryptography):椭圆曲线密码编码学。

    ECC和RSA相比,在许多方面都有对绝对的优势,主要体现在以下方面:

    抗攻击性强。相同的密钥长度,其抗攻击性要强很多倍。

    计算量小,处理速度快。ECC总的速度比RSA、DSA要快得多。

    存储空间占用小。ECC的密钥尺寸和系统参数与RSA、DSA相比要小得多,意味着它所占的存贮空间要小得多。这对于加密算法在IC卡上的应用具有特别重要的意义。

    带宽要求低。当对长消息进行加解密时,三类密码系统有相同的带宽要求,但应用于短消息时ECC带宽要求却低得多。带宽要求低使ECC在无线网络领域具有广泛的应用前景。

    散列算法
    散列是信息的提炼,通常其长度要比信息小得多,且为一个固定长度。加密性强的散列一定是不可逆的,这就意味着通过散列结果,无法推出任何部分的原始信息。任何输入信息的变化,哪怕仅一位,都将导致散列结果的明显变化,这称之为雪崩效应。散列还应该是防冲突的,即找不出具有相同散列结果的两条信息。具有这些特性的散列结果就可以用于验证信息是否被修改。

    单向散列函数一般用于产生消息摘要,密钥加密等,常见的有:

    MD5(Message Digest Algorithm 5):是RSA数据安全公司开发的一种单向散列算法,非可逆,相同的明文产生相同的密文;

    SHA(Secure Hash Algorithm):可以对任意长度的数据运算生成一个160位的数值。

    SHA-1与MD5的比较:

    因为二者均由MD4导出,SHA-1和MD5彼此很相似。相应的,他们的强度和其他特性也是相似,但还有以下几点不同:

    对强行供给的安全性:最显著和最重要的区别是SHA-1摘要比MD5摘要长32 位。使用强行技术,产生任何一个报文使其摘要等于给定报摘要的难度对MD5是2128数量级的操作,而对SHA-1则是2160数量级的操作。这样,SHA-1对强行攻击有更大的强度;

    对密码分析的安全性:由于MD5的设计,易受密码分析的攻击,SHA-1显得不易受这样的攻击;

    速度:在相同的硬件上,SHA-1的运行速度比MD5慢。

    对称与非对称算法比较
    以上综述了两种加密方法的原理,总体来说主要有下面几个方面的不同:

    在管理方面:公钥密码算法只需要较少的资源就可以实现目的,在密钥的分配上,两者之间相差一个指数级别(一个是n一个是n2)。所以私钥密码算法不适应广域网的使用,而且更重要的一点是它不支持数字签名;

    在安全方面:由于公钥密码算法基于未解决的数学难题,在破解上几乎不可能。对于私钥密码算法,到了AES虽说从理论来说是不可能破解的,但从计算机的发展角度来看。公钥更具有优越性;

    从速度上来看:AES的软件实现速度已经达到了每秒数兆或数十兆比特。是公钥的100倍,如果用硬件来实现的话这个比值将扩大到1000倍。
    了解更多

    更多相关内容
  • 常用数据加密和解密方法汇总

    千次阅读 2021-05-26 16:57:34
    数据加密技术是网络中最基本的安全技术,主要是通过对网络中传输的信息进行数据加密来保障其安全性,这是一种主动安全防御策略,用很小的代价即可为信息提供相当大的安全保护。 一、加密的基本概念 “加密”,是一种...

    数据加密技术是网络中最基本的安全技术,主要是通过对网络中传输的信息进行数据加密来保障其安全性,这是一种主动安全防御策略,用很小的代价即可为信息提供相当大的安全保护。

    一、加密的基本概念

    “加密”,是一种限制对网络上传输数据的访问权的技术。原始数据(也称为明文,plaintext)被加密设备(硬件或软件)和密钥加密而产生的经过编码的数据称为密文(ciphertext)。将密文还原为原始明文的过程称为解密,它是加密的反向处理,但解密者必须利用相同类型的加密设备和密钥对密文进行解密。
    加密的基本功能包括:

    1. 防止不速之客查看机密的数据文件;
    2. 防止机密数据被泄露或篡改;
    3. 防止特权用户(如系统管理员)查看私人数据文件;
    4. 使入侵者不能轻易地查找一个系统的文件。
      数据加密是确保计算机网络安全的一种重要机制,虽然由于成本、技术和管理上的复杂性等原因,目前尚未在网络中普及,但数据加密的确是实现分布式系统和网络环境下数据安全的重要手段之一。

    数据加密可在网络OSI七层协议(OSI是Open System Interconnect的缩写,意为开放式系统互联。国际标准组织(国际标准化组织)制定了OSI模型。这个模型把网络通信的工作分为7层,分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。)的多层上实现、所以从加密技术应用的逻辑位置看,有三种方式:

    ①链路加密:通常把网络层以下的加密叫链路加密,主要用于保护通信节点间传输的数据,加解密由置于线路上的密码设备实现。根据传递的数据的同步方式又可分为同步通信加密和异步通信加密两种,同步通信加密又包含字节同步通信加密和位同步通信加密。

    ②节点加密:是对链路加密的改进。在协议传输层上进行加密,主要是对源节点和目标节点之间传输数据进行加密保护,与链路加密类似.只是加密算法要结合在依附于节点的加密模件中,克服了链路加密在节点处易遭非法存取的缺点。

    ③端对端加密:网络层以上的加密称为端对端加密。是面向网络层主体。对应用层的数据信息进行加密,易于用软件实现,且成本低,但密钥管理问题困难,主要适合大型网络系统中信息在多个发方和收方之间传输的情况。

    二、数据加密的应用
    1、 媒体加密:DRM
    2、 文件加密:文本加密、pdf、word
    3、 数据加密:ASP.NET(C#)中的数据加密
    4、 硬件加密:加密狗
    三.加密技术发展趋势

    ①私用密钥加密技术与公开密钥加密技术相结合:鉴于两种密码体制加密的特点,在实际应用中可以采用折衷方案,即结合使用DES/IDEA和RSA,以DES为"内核",RSA为"外壳",对于网络中传输的数据可用DES或IDEA加密,而加密用的密钥则用RSA加密传送,此种方法既保证了数据安全又提高了加密和解密的速度,这也是目前加密技术发展的新方向之一。

    ②寻求新算法:跳出以常见的迭代为基础的构造思路,脱离基于某些数学问题复杂性的构造方法。如刘尊全先生提出的刘氏算法,是一种基于密钥的公开密钥体制,它采用了随机性原理构造加解密变换,并将其全部运算控制隐匿于密钥中,密钥长度可变。它是采用选取一定长度的分割来构造大的搜索空间,从而实现一次非线性变换。此种加密算法加密强度高、速度快、计算开销低。

    ③加密最终将被集成到系统和网络中,例如IPV6协议就已有了内置加密的支持,在硬件方面,Intel公司正研制一种加密协处理器。它可以集成到微机的主极上。

    四、加密技术的分类

    加密类型可以简单地分为四种:

    1. 根本不考虑解密问题;
    2. 私用密钥加密技术:对称式加密(Symmetric Key Encryption):对称式加密方式对加密和解密使用相同的密钥。通常,这种加密方式在应用中难以实施,因为用同一种安全方式共享密钥很难。如:RC4、RC2、DES 和 AES 系列加密算法。
    3. 公开密钥加密技术:非对称密钥加密(Asymmetric Key Encryption):非对称密钥加密使用一组公共/私人密钥系统,加密时使用一种密钥,解密时使用另一种密钥。公共密钥可以广泛的共享和透露。当需要用加密方式向服务器外部传送数据时,这种加密方式更方便。如: RSA
    4. 数字证书。(Certificate):数字证书是一种非对称密钥加密,但是,一个组织可以使用证书并通过数字签名将一组公钥和私钥与其拥有者相关联。

    五、对称加密之DES加密与解密

    1、对称加密
    对称加密,是一种比较传统的加密方式,其加密运算、解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码(称为对称密码)。因此,通信双方都必须获得这把钥匙,并保持钥匙的秘密。

    单钥密码系统的安全性依赖于以下两个因素:

    第一、加密算法必须是足够强的,仅仅基于密文本身去解密信息在实践上是不可能的。
    第二、加密方法的安全性依赖于密钥的秘密性,而不是算法的秘密性,因此,我们没有必要确保算法的秘密性(事实上,现实中使用的很多单钥密码系统的算法都是公开的),但是我们一定要保证密钥的秘密性。
    DES(Data Encryption Standard)和TripleDES是对称加密的两种实现。
    DES和TripleDES基本算法一致,只是TripleDES算法提供的key位数更多,加密可靠性更高。
    DES使用的密钥key为8字节,初始向量IV也是8字节。
    TripleDES使用24字节的key,初始向量IV也是8字节。

    两种算法都是以8字节为一个块进行加密,一个数据块一个数据块的加密,一个8字节的明文加密后的密文也是8字节。如果明文长度不为8字节的整数倍,添加值为0的字节凑满8字节整数倍。所以加密后的密文长度一定为8字节的整数倍。

    2、加密解密过程

    在这里插入图片描述

    Figure 1. DES加密解密过程

    上图是整个DES和TripleDES算法的加密解密过程,下面以TripleDES为例,结合dotnet分析加密解密的各个步骤,并给出相关实现代码。

    说到软件安全保护,小编为大家推荐几款给力的加密解密软件保护工具,希望对您有所帮助。

    慧都科技响应“全面加强知识产权保护,推动构建新发展格局”号召,加密解密产品为您的应用程序保驾护航!在线购买享受限时特惠,Go!>>

    ★VMProtect

    VMProtect是新一代的软件保护实用程序,具有内置的反汇编程序,可与Windows和Mac OS X可执行程序配合使用,还可以链接编译器创建的MAP文件,以快速选择代码片段进行保护。

    VMProtect的基本原则是通过使应用程序代码和逻辑非常复杂以进行进一步分析和破解,从而有效保护应用程序代码免受检查。VMProtect的主要软件代码保护机制适用于:虚拟化,变异和组合保护,涉及应用程序代码的突变以及随后的虚拟化。

    VMProtect与其他软件保护程序的主要区别在于:它能够使用不同的方法保护代码的不同部分:部分代码可以虚拟化,另一部分进行模糊处理,使用组合方法保护关键片段。

    VMProtect中使用的虚拟化方法的关键优势:

    执行虚拟化代码片段的虚拟机嵌入到受保护应用程序的结果代码中——VMProtect保护的应用程序不需要第三方库或模块来运行
    VMProtect允许使用多个不同的虚拟机来保护同一应用程序的不同代码片段——黑客必须分析多个虚拟机的体系结构
    网络评价:加密的安全级别非常高,破解难度很大,但是加密数据多,需要注意系统的性能。

    ★Themida

    Themida是先进的Windows软件保护系统,它被用于满足软件开发人员对于所开发应用程序安全保护的需求,使其远离被先进的逆向工程和软件破解的危险。

    通过Themida,集中在软件保护器所具有的主要弱点,从而提供了解决这些问题的完整解决方案。Themida使用SecureEngine®保护技术,当以最高优先级运行时,实施前所未见的保护技术,以保护应用程序免受高级软件破解。

    SecureEngine®会破坏可用于受保护应用程序的所有当前破解工具,并确保受保护的应用程序仅在安全的环境中运行。

    Themida的主要特点:

    •检测/欺骗任何类型的调试器的反调试器技术 •任何Ring3和Ring0转储器的反内存转储器技术 •每个受保护应用程序中的加密算法和密钥不同
    •反API扫描程序技术,可避免重建原始导入表 •目标应用中的自动反编译和加扰技术 •先进的Mutator引擎
    •反“调试器隐藏器”技术 •目标应用中的反内存修补和CRC技术 •针对文件和注册表监视器的反监视技术
    •SDK与保护层的通信 •适用于任何静态和交互式拆卸器的反拆卸技术 •目标应用程序中的动态加密
    网络评价:用好其虚拟机保护功能,将关键敏感代码用虚拟机保护起来,能很好提高强度。

    ★WinLicense

    WinLicense是一个功能强大的保护系统,专为希望保护其应用程序免受高级逆向工程和软件破解的软件开发人员而设计。开发人员不需要任何源代码更改或编程经验来使用WinLicense保护其应用程序。WinLicense使用SecureEngine®保护技术,该技术能够以最高优先级运行其代码,以实现前所未有的保护技术; 这可以保护任何具有最高安全级别的应用程序。

    WinLicense的主要特点:

    保护功能:WinLicense的主要目标是涵盖软件保护中的所有当前漏洞,例如过时的保护技术、操作系统限制执行等等。
    试用/许可功能:WinLicense提供最广泛的选项和功能,以便为应用程序创建试用版和注册版。WinLicense还提供自动处理所有可能情况的功能,例如应用程序到期,许可证损坏等,从而使开发人员无需在应用程序中包含额外的代码。
    WinLicense专门用于解决当前许可证管理器的一些主要缺陷。
    网络评价:WinLicense主要比Themida多了一个协议,可以设定使用时间,运行次数等功能,两者核心保护是一样的。

    展开全文
  • 常用数据加密和解密方法

    万次阅读 2018-07-17 13:54:07
    ASP.NET(C#)常用数据加密和解密方法汇总  一、数据加密的概念 1、 基本概念 2、 基本功能 3、 加密形式  二、 数据加密的项目应用和学习 1、 媒体加密:DRM 2、 文件加密:文本加密、pdf、word 3、 ...

    http://www.cnblogs.com/sunxuchu/p/5484018.html

    关键词:数据加密用哪种方式更好?

    ASP.NET(C#)常用数据加密和解密方法汇总 

    一、数据加密的概念

    1、  基本概念

    2、  基本功能

    3、  加密形式 

    二、 数据加密的项目应用和学习

    1、  媒体加密:DRM

    2、  文件加密:文本加密、pdf、word

    3、  数据加密:ASP.NET(C#)中的数据加密

    4、  硬件加密:加密狗

    三、 数据加密的发展趋势 

    四、 网络数据加密算法分类

    1、  根本不考虑解密问题:MD5、

    2、  私用密钥加密:DES、AES

    3、  公用密钥加密:RSA

    4、  数字证书: 

    五、对称加密之DES加密和解密的讲解 

    六、 非对称加密之RSA加密和解密的讲解 

    七、 ASP.NET(C#) 常用加密类实例调用讲解

    ASP.NET(C#)常用数据加密和解密方法汇总 

      

    数据加密技术是网络中最基本的安全技术,主要是通过对网络中传输的信息进行数据加密来保障其安全性,这是一种主动安全防御策略,用很小的代价即可为信息提供相当大的安全保护。

    一、加密的基本概念 

    "加密",是一种限制对网络上传输数据的访问权的技术。原始数据(也称为明文,plaintext)被加密设备(硬件或软件)和密钥加密而产生的经过编码的数据称为密文(ciphertext)。将密文还原为原始明文的过程称为解密,它是加密的反向处理,但解密者必须利用相同类型的加密设备和密钥对密文进行解密。

    加密的基本功能包括:

    1. 防止不速之客查看机密的数据文件;

    2. 防止机密数据被泄露或篡改;

    3. 防止特权用户(如系统管理员)查看私人数据文件;

    4. 使入侵者不能轻易地查找一个系统的文件。

    数据加密是确保计算机网络安全的一种重要机制,虽然由于成本、技术和管理上的复杂性等原因,目前尚未在网络中普及,但数据加密的确是实现分布式系统和网络环境下数据安全的重要手段之一。

    数据加密可在网络OSI七层协议(OSIOpen System Interconnect的缩写,意为开放式系统互联。国际标准组织(国际标准化组织)制定了OSI模型。这个模型把网络通信的工作分为7层,分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。)的多层上实现、所以从加密技术应用的逻辑位置看,有三种方式:

    链路加密:通常把网络层以下的加密叫链路加密,主要用于保护通信节点间传输的数据,加解密由置于线路上的密码设备实现。根据传递的数据的同步方式又可分为同步通信加密和异步通信加密两种,同步通信加密又包含字节同步通信加密和位同步通信加密。

    节点加密:是对链路加密的改进。在协议传输层上进行加密,主要是对源节点和目标节点之间传输数据进行加密保护,与链路加密类似.只是加密算法要结合在依附于节点的加密模件中,克服了链路加密在节点处易遭非法存取的缺点。

    端对端加密:网络层以上的加密称为端对端加密。是面向网络层主体。对应用层的数据信息进行加密,易于用软件实现,且成本低,但密钥管理问题困难,主要适合大型网络系统中信息在多个发方和收方之间传输的情况。

    二、数据加密的应用 

    1、  媒体加密:DRM

    2、  文件加密:文本加密、pdf、word

    3、  数据加密:ASP.NET(C#)中的数据加密

    4、  硬件加密:加密狗

     

    三.加密技术发展趋势 

    私用密钥加密技术与公开密钥加密技术相结合:鉴于两种密码体制加密的特点,在实际应用中可以采用折衷方案,即结合使用DES/IDEA和RSA,以DES为"内核",RSA为"外壳",对于网络中传输的数据可用DES或IDEA加密,而加密用的密钥则用RSA加密传送,此种方法既保证了数据安全又提高了加密和解密的速度,这也是目前加密技术发展的新方向之一。

    寻求新算法:跳出以常见的迭代为基础的构造思路,脱离基于某些数学问题复杂性的构造方法。如刘尊全先生提出的刘氏算法,是一种基于密钥的公开密钥体制,它采用了随机性原理构造加解密变换,并将其全部运算控制隐匿于密钥中,密钥长度可变。它是采用选取一定长度的分割来构造大的搜索空间,从而实现一次非线性变换。此种加密算法加密强度高、速度快、计算开销低。

    加密最终将被集成到系统和网络中,例如IPV6协议就已有了内置加密的支持,在硬件方面,Intel公司正研制一种加密协处理器。它可以集成到微机的主极上。

    四、加密技术的分类 

    加密类型可以简单地分为四种:

    1. 根本不考虑解密问题; 

    2. 私用密钥加密技术:对称式加密(Symmetric Key Encryption):对称式加密方式对加密和解密使用相同的密钥。通常,这种加密方式在应用中难以实施,因为用同一种安全方式共享密钥很难。如:RC4、RC2、DES 和 AES 系列加密算法。

    3. 公开密钥加密技术:非对称密钥加密(Asymmetric Key Encryption):非对称密钥加密使用一组公共/私人密钥系统,加密时使用一种密钥,解密时使用另一种密钥。公共密钥可以广泛的共享和透露。当需要用加密方式向服务器外部传送数据时,这种加密方式更方便。如: RSA

    4. 数字证书。(Certificate):数字证书是一种非对称密钥加密,但是,一个组织可以使用证书并通过数字签名将一组公钥和私钥与其拥有者相关联。 

    五、对称加密之DES加密与解密 

    一、  对称加密 

    对称加密,是一种比较传统的加密方式,其加密运算、解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码(称为对称密码)。因此,通信双方都必须获得这把钥匙,并保持钥匙的秘密。

    单钥密码系统的安全性依赖于以下两个因素:

    第一、加密算法必须是足够强的,仅仅基于密文本身去解密信息在实践上是不可能的。

    第二、加密方法的安全性依赖于密钥的秘密性,而不是算法的秘密性,因此,我们没有必要确保算法的秘密性(事实上,现实中使用的很多单钥密码系统的算法都是公开的),但是我们一定要保证密钥的秘密性。

    DES(Data Encryption Standard)和TripleDES是对称加密的两种实现。

    DES和TripleDES基本算法一致,只是TripleDES算法提供的key位数更多,加密可靠性更高。

    DES使用的密钥key为8字节,初始向量IV也是8字节。

    TripleDES使用24字节的key,初始向量IV也是8字节。

    两种算法都是以8字节为一个块进行加密,一个数据块一个数据块的加密,一个8字节的明文加密后的密文也是8字节。如果明文长度不为8字节的整数倍,添加值为0的字节凑满8字节整数倍。所以加密后的密文长度一定为8字节的整数倍。

    二、  加密解密过程 

     

    Figure 1. DES加密解密过程

    上图是整个DES和TripleDES算法的加密解密过程,下面以TripleDES为例,结合dotnet分析加密解密的各个步骤,并给出相关实现代码。

    1 生成keyIV

    System.Security.Cryptography. TripleDESCryptoServiceProvider类是dotnet中实现TripleDES算法的主要的类。

    TripleDESCryptoServiceProvider类只有一个构造方法TripleDESCryptoServiceProvider(),这个方法把一些属性初始化:

    KeySize(加密密钥长度,以位为单位)= 192(24字节)

    BlockSize(加密处理的数据块大小,以位为单位)= 64(8字节)

    FeedbackSize(加密数据块后返回的数据大小,以位为单位)= 64(8字节)

     

    TripleDESCryptoServiceProvider构造方法同时会初始化一组随机的key和IV。

    默认的TripleDESCryptoServiceProvider的key为24字节,IV为8字节,加密数据块为8字节。

    生成key和IV的代码很简单:

    TripleDESCryptoServiceProvider tDESalg = new TripleDESCryptoServiceProvider();
    byte[] keyArray = tDESalg.Key;
    byte[] IVArray = tDESalg.IV;

    生成的key和IV在加密过程和解密过程都要使用。

    2 字符串明文转成某一代码页对应的编码字节流 

    待加密的数据可能有两种形式,一种是二进制的数据,本身就是一组字节流,这样的数据可以跳过这一步,直接进入加密步骤。还有一种情况是字符串数据,字符串中同样的字符使用不同的代码页会生成不同的字节码,所以从字符串到字节流的转换是需要指定使用何种编码的。在解密之后,要从字节流转换到字符串就要使用相同的代码页解码,否则就会出现乱码。

    // 待加密的字符串

    string plainTextString = "Here is some data to encrypt. 这里是一些要加密的数据。";

    // 使用utf-8编码(也可以使用其它的编码)

    Encoding sEncoding = Encoding.GetEncoding("utf-8");

    // 把字符串明文转换成utf-8编码的字节流

    byte[] plainTextArray = sEncoding.GetBytes(plainTextString);

     

    3 加密操作 

    加密的原料是明文字节流,TripleDES算法对字节流进行加密,返回的是加密后的字节流。同时要给定加密使用的key和IV。

    // 把字符串明文转换成utf-8编码的字节流

    复制代码

    byte[] plainTextArray = sEncoding.GetBytes(plainTextString);
    public static byte[] EncryptString(byte[] plainTextArray, byte[] Key, byte[] IV)
    {
        // 建立一个MemoryStream,这里面存放加密后的数据流
        MemoryStream mStream = new MemoryStream();
        // 使用MemoryStream 和key、IV新建一个CryptoStream 对象
        CryptoStream cStream = new CryptoStream(mStream,
            new TripleDESCryptoServiceProvider().CreateEncryptor(Key, IV),
            CryptoStreamMode.Write);
        // 将加密后的字节流写入到MemoryStream
        cStream.Write(plainTextArray, 0, plainTextArray.Length);
        //把缓冲区中的最后状态更新到MemoryStream,并清除cStream的缓存区
        cStream.FlushFinalBlock();
        // 把解密后的数据流转成字节流
        byte[] ret = mStream.ToArray();
        // 关闭两个streams.
        cStream.Close();
        mStream.Close();
        return ret;
    }

    复制代码

    4 解密操作 

    解密操作解密上面步骤生成的密文byte[],需要使用到加密步骤使用的同一组Key和IV。

    // 调用解密方法,返回已解密数据的byte[]

    复制代码

    byte[] finalPlainTextArray = DecryptTextFromMemory(Data, keyArray, IVArray);
    public static byte[] DecryptTextFromMemory(byte[] EncryptedDataArray, byte[] Key, byte[] IV)
    {
        // 建立一个MemoryStream,这里面存放加密后的数据流
        MemoryStream msDecrypt = new MemoryStream(EncryptedDataArray);
        // 使用MemoryStream 和key、IV新建一个CryptoStream 对象
        CryptoStream csDecrypt = new CryptoStream(msDecrypt,
            new TripleDESCryptoServiceProvider().CreateDecryptor(Key, IV),
            CryptoStreamMode.Read);
        // 根据密文byte[]的长度(可能比加密前的明文长),新建一个存放解密后明文的byte[]
        byte[] DecryptDataArray = new byte[EncryptedDataArray.Length];
        // 把解密后的数据读入到DecryptDataArray
        csDecrypt.Read(DecryptDataArray, 0, DecryptDataArray.Length);
        msDecrypt.Close();
        csDecrypt.Close();
        return DecryptDataArray;
    }

    复制代码

    有一点需要注意,DES加密是以数据块为单位加密的,8个字节一个数据块,如果待加密明byte[]的长度不是8字节的整数倍,算法先用值为“0”的byte补足8个字节,然后进行加密。所以加密后的密文长度一定是8的整数倍。这样的密文解密后如果补了0值的byte,则解密后这些0值的byte依然存在。比如上例中要加密的明文是:

    “Here is some data to encrypt. 这里是一些要加密的数据。”

    转成明文byte[]后是66个字节,DES算法就会补上6个0值的byte,补到72个字节。这样加密后再解密回来的密文byte[]解码后的字符串就是这样的:

    "Here is some data to encrypt. 这里是一些要加密的数据。\0\0\0\0\0\0"

    5 从编码字节流转成字符串明文 

    // 使用前面定义的Encoding,utf-8的编码把byte[]转成字符串

    plainTextString = sEncoding.GetString(finalPlainTextArray);

    六、非对称加密之RSA加密和解密的讲解 

          RSA公钥加密算法是1977年由Ron Rivest、Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的。RSA取名来自开发他们三者的名字。RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准。RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。

      RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价。即RSA的重大缺陷是无法从理论上把握它的保密性能如何,而且密码学界多数人士倾向于因子分解不是NPC问题。

      RSA的缺点主要有:

    A)产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密。

    B)分组长度太大,为保证安全性,n 至少也要 600bits以上,使运算代价很高,尤其是速度较慢,较对称密码算法慢几个数量级;且随着大数分解技术的发展,这个

    长度还在增加,不利于数据格式的标准化。目前,SET(Secure Electronic Transaction)协议中要求CA采用2048bits长的密钥,其他实体使用1024比特的密钥。C)RSA密钥长度随着保密级别提高,增加很快。下表列出了对同一安全级别所对应的密钥长度。

     

    保密级别

    对称密钥长度(bit)

    RSA密钥长度(bit)

    ECC密钥长度(bit)

    保密年限

    80

    80

    1024

    160

    2010

    112

    112

    2048

    224

    2030

    128

    128

    3072

    256

    2040

    192

    192

    7680

    384

    2080

    256

    256

    15360

    512

    2120

     这种算法1978年就出现了,它是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作,也很流行。算法的名字以发明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman。早在1973年,英国国家通信总局的数学家Clifford Cocks就发现了类似的算法。但是他的发现被列为绝密,直到1998年才公诸于世。

      RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。

      RSA的算法涉及三个参数,n、e1、e2。

      其中,n是两个大质数p、q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度。

      e1和e2是一对相关的值,e1可以任意取,但要求e1与(p-1)*(q-1)互质;再选择e2,要求(e2*e1)mod((p-1)*(q-1))=1。

      (n及e1),(n及e2)就是密钥对。

      RSA加解密的算法完全相同,设A为明文,B为密文,则:A=B^e1 mod n;B=A^e2 mod n;

      e1和e2可以互换使用,即:

      A=B^e2 mod n;B=A^e1 mod n;

     

    C#代码实现

    需引用using System.Security.Cryptography;

    复制代码

    /// <summary>
            /// RSA加密
            /// </summary>
            /// <param name="publickey"></param>
            /// <param name="content"></param>
            /// <returns></returns>
            public static string RSAEncrypt(string publickey, string content)
            {
                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);
            }
    
            /// <summary>
            /// RSA解密
            /// </summary>
            /// <param name="privatekey"></param>
            /// <param name="content"></param>
            /// <returns></returns>
            public static string RSADecrypt(string privatekey, string content)
            {
                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);
            }
    

    复制代码

    七、ASP.NET(C#)常用加密类调用的讲解

    1C#常用加密解密类库代码如下: 

    复制代码

    /// <summary>
          /// MD5 加密静态方法
          /// </summary>
          /// <param name="EncryptString">待加密的密文</param>
          /// <returns>returns</returns>
          public static string MD5Encrypt(string EncryptString)
          {
              if (string.IsNullOrEmpty(EncryptString)) { throw (new Exception("密文不得为空")); }
              MD5 m_ClassMD5 = new MD5CryptoServiceProvider();
              string m_strEncrypt = "";
              try
              {
                  m_strEncrypt = BitConverter.ToString(m_ClassMD5.ComputeHash(Encoding.Default.GetBytes(EncryptString))).Replace("-", "");
              }
             catch (ArgumentException ex) { throw ex; }
             catch (CryptographicException ex) { throw ex; }
             catch (Exception ex) { throw ex; }
              finally { m_ClassMD5.Clear(); }
              return m_strEncrypt;
          }
    
          /// <summary>
          /// DES 加密(数据加密标准,速度较快,适用于加密大量数据的场合)
          /// </summary>
          /// <param name="EncryptString">待加密的密文</param>
          /// <param name="EncryptKey">加密的密钥</param>
          /// <returns>returns</returns>
          public static string DESEncrypt(string EncryptString, string EncryptKey)
          {
              if (string.IsNullOrEmpty(EncryptString)) { throw (new Exception("密文不得为空")); }
              if (string.IsNullOrEmpty(EncryptKey)) { throw (new Exception("密钥不得为空")); }
              if (EncryptKey.Length != 8) { throw (new Exception("密钥必须为8位")); }
              byte[] m_btIV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
              string m_strEncrypt = "";
             DESCryptoServiceProvider m_DESProvider = new DESCryptoServiceProvider();
              try
              {
                  byte[] m_btEncryptString = Encoding.Default.GetBytes(EncryptString);
                  MemoryStream m_stream = new MemoryStream();
                  CryptoStream m_cstream = new CryptoStream(m_stream, m_DESProvider.CreateEncryptor(Encoding.Default.GetBytes(EncryptKey), m_btIV), CryptoStreamMode.Write);
                  m_cstream.Write(m_btEncryptString, 0, m_btEncryptString.Length);
                  m_cstream.FlushFinalBlock();
                  m_strEncrypt = Convert.ToBase64String(m_stream.ToArray());
                  m_stream.Close(); m_stream.Dispose();
                  m_cstream.Close(); m_cstream.Dispose();
              }
              catch (IOException ex) { throw ex; }
              catch (CryptographicException ex) { throw ex; }
              catch (ArgumentException ex) { throw ex; }
              catch (Exception ex) { throw ex; }
              finally { m_DESProvider.Clear(); }
              return m_strEncrypt;
          }
    
          /// <summary>
          /// DES 解密(数据加密标准,速度较快,适用于加密大量数据的场合)
          /// </summary>
          /// <param name="DecryptString">待解密的密文</param>
          /// <param name="DecryptKey">解密的密钥</param>
          /// <returns>returns</returns>
          public static string DESDecrypt(string DecryptString, string DecryptKey)
          {
             if (string.IsNullOrEmpty(DecryptString)) { throw (new Exception("密文不得为空")); }
              if (string.IsNullOrEmpty(DecryptKey)) { throw (new Exception("密钥不得为空")); }
              if (DecryptKey.Length != 8) { throw (new Exception("密钥必须为8位")); }
              byte[] m_btIV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
             string m_strDecrypt = "";
             DESCryptoServiceProvider m_DESProvider = new DESCryptoServiceProvider();
             try
            {
                 byte[] m_btDecryptString = Convert.FromBase64String(DecryptString);
                 MemoryStream m_stream = new MemoryStream();
                 CryptoStream m_cstream = new CryptoStream(m_stream, m_DESProvider.CreateDecryptor(Encoding.Default.GetBytes(DecryptKey), m_btIV), CryptoStreamMode.Write);
                 m_cstream.Write(m_btDecryptString, 0, m_btDecryptString.Length);
                 m_cstream.FlushFinalBlock();
                 m_strDecrypt = Encoding.Default.GetString(m_stream.ToArray());
                 m_stream.Close(); m_stream.Dispose();
                 m_cstream.Close(); m_cstream.Dispose();
             }
             catch (IOException ex) { throw ex; }
             catch (CryptographicException ex) { throw ex; }
             catch (ArgumentException ex) { throw ex; }
             catch (Exception ex) { throw ex; }
             finally { m_DESProvider.Clear(); }
             return m_strDecrypt;
         }
         /// <summary>
         /// RC2 加密(用变长密钥对大量数据进行加密)
         /// </summary>
         /// <param name="EncryptString">待加密密文</param>
         /// <param name="EncryptKey">加密密钥</param>
         /// <returns>returns</returns>
         public static string RC2Encrypt(string EncryptString, string EncryptKey)
         {
             if (string.IsNullOrEmpty(EncryptString)) { throw (new Exception("密文不得为空")); }
             if (string.IsNullOrEmpty(EncryptKey)) { throw (new Exception("密钥不得为空")); }
             if (EncryptKey.Length < 5 || EncryptKey.Length > 16) { throw (new Exception("密钥必须为5-16位")); }
             string m_strEncrypt = "";
             byte[] m_btIV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
             RC2CryptoServiceProvider m_RC2Provider = new RC2CryptoServiceProvider();
             try
            {
                 byte[] m_btEncryptString = Encoding.Default.GetBytes(EncryptString);
                 MemoryStream m_stream = new MemoryStream();
                 CryptoStream m_cstream = new CryptoStream(m_stream, m_RC2Provider.CreateEncryptor(Encoding.Default.GetBytes(EncryptKey), m_btIV), CryptoStreamMode.Write);
                 m_cstream.Write(m_btEncryptString, 0, m_btEncryptString.Length);
                 m_cstream.FlushFinalBlock();
                 m_strEncrypt = Convert.ToBase64String(m_stream.ToArray());
                 m_stream.Close(); m_stream.Dispose();
                m_cstream.Close(); m_cstream.Dispose();
             }
             catch (IOException ex) { throw ex; }
             catch (CryptographicException ex) { throw ex; }
             catch (ArgumentException ex) { throw ex; }
             catch (Exception ex) { throw ex; }
             finally { m_RC2Provider.Clear(); }
             return m_strEncrypt;
         }
    
         /// <summary>
         /// RC2 解密(用变长密钥对大量数据进行加密)
         /// </summary>
         /// <param name="DecryptString">待解密密文</param>
         /// <param name="DecryptKey">解密密钥</param>
         /// <returns>returns</returns>
         public static string RC2Decrypt(string DecryptString, string DecryptKey)
         {
             if (string.IsNullOrEmpty(DecryptString)) { throw (new Exception("密文不得为空")); }
             if (string.IsNullOrEmpty(DecryptKey)) { throw (new Exception("密钥不得为空")); }
            if (DecryptKey.Length < 5 || DecryptKey.Length > 16) { throw (new Exception("密钥必须为5-16位")); }
             byte[] m_btIV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
             string m_strDecrypt = "";
             RC2CryptoServiceProvider m_RC2Provider = new RC2CryptoServiceProvider();
            try
            {
                byte[] m_btDecryptString = Convert.FromBase64String(DecryptString);
                 MemoryStream m_stream = new MemoryStream();
                 CryptoStream m_cstream = new CryptoStream(m_stream, m_RC2Provider.CreateDecryptor(Encoding.Default.GetBytes(DecryptKey), m_btIV), CryptoStreamMode.Write);
                 m_cstream.Write(m_btDecryptString, 0, m_btDecryptString.Length);
                 m_cstream.FlushFinalBlock();
                 m_strDecrypt = Encoding.Default.GetString(m_stream.ToArray());
                 m_stream.Close(); m_stream.Dispose();
                 m_cstream.Close(); m_cstream.Dispose();
             }
             catch (IOException ex) { throw ex; }
            catch (CryptographicException ex) { throw ex; }
             catch (ArgumentException ex) { throw ex; }
             catch (Exception ex) { throw ex; }
            finally { m_RC2Provider.Clear(); }
             return m_strDecrypt;
         }
    
         /// <summary>
         /// 3DES 加密(基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高)
         /// </summary>
         /// <param name="EncryptString">待加密密文</param>
         /// <param name="EncryptKey1">密钥一</param>
         /// <param name="EncryptKey2">密钥二</param>
        /// <param name="EncryptKey3">密钥三</param>
         /// <returns>returns</returns>
         public static string DES3Encrypt(string EncryptString, string EncryptKey1, string EncryptKey2, string EncryptKey3)
         {
             string m_strEncrypt = "";
             try
             {
                 m_strEncrypt = DESEncrypt(EncryptString, EncryptKey3);
                 m_strEncrypt = DESEncrypt(m_strEncrypt, EncryptKey2);
                m_strEncrypt = DESEncrypt(m_strEncrypt, EncryptKey1);
             }
             catch (Exception ex) { throw ex; }
             return m_strEncrypt;
         }
    
         /// <summary>
         /// 3DES 解密(基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高)
         /// </summary>
         /// <param name="DecryptString">待解密密文</param>
         /// <param name="DecryptKey1">密钥一</param>
         /// <param name="DecryptKey2">密钥二</param>
         /// <param name="DecryptKey3">密钥三</param>
         /// <returns>returns</returns>
         public static string DES3Decrypt(string DecryptString, string DecryptKey1, string DecryptKey2, string DecryptKey3)
         {
             string m_strDecrypt = "";
             try
             {
                m_strDecrypt = DESDecrypt(DecryptString, DecryptKey1);
                 m_strDecrypt = DESDecrypt(m_strDecrypt, DecryptKey2);
                 m_strDecrypt = DESDecrypt(m_strDecrypt, DecryptKey3);
             }
             catch (Exception ex) { throw ex; }
             return m_strDecrypt;
         }
    
         /// <summary>
         /// AES 加密(高级加密标准,是下一代的加密算法标准,速度快,安全级别高,目前 AES 标准的一个实现是 Rijndael 算法)
         /// </summary>
         /// <param name="EncryptString">待加密密文</param>
         /// <param name="EncryptKey">加密密钥</param>
        /// <returns></returns>
        public static string AESEncrypt(string EncryptString, string EncryptKey)
         {
            if (string.IsNullOrEmpty(EncryptString)) { throw (new Exception("密文不得为空")); }
             if (string.IsNullOrEmpty(EncryptKey)) { throw (new Exception("密钥不得为空")); }
             string m_strEncrypt = "";
             byte[] m_btIV = Convert.FromBase64String("Rkb4jvUy/ye7Cd7k89QQgQ==");
             Rijndael m_AESProvider = Rijndael.Create();
             try
             {
                 byte[] m_btEncryptString = Encoding.Default.GetBytes(EncryptString);
                 MemoryStream m_stream = new MemoryStream();
                 CryptoStream m_csstream = new CryptoStream(m_stream, m_AESProvider.CreateEncryptor(Encoding.Default.GetBytes(EncryptKey), m_btIV), CryptoStreamMode.Write);
                 m_csstream.Write(m_btEncryptString, 0, m_btEncryptString.Length); m_csstream.FlushFinalBlock();
                 m_strEncrypt = Convert.ToBase64String(m_stream.ToArray());
                 m_stream.Close(); m_stream.Dispose();
                 m_csstream.Close(); m_csstream.Dispose();
             }
             catch (IOException ex) { throw ex; }
             catch (CryptographicException ex) { throw ex; }
             catch (ArgumentException ex) { throw ex; }
             catch (Exception ex) { throw ex; }
             finally { m_AESProvider.Clear(); }
             return m_strEncrypt;
         }
    
         /// <summary>
         /// AES 解密(高级加密标准,是下一代的加密算法标准,速度快,安全级别高,目前 AES 标准的一个实现是 Rijndael 算法)
         /// </summary>
         /// <param name="DecryptString">待解密密文</param>
         /// <param name="DecryptKey">解密密钥</param>
         /// <returns></returns>
         public static string AESDecrypt(string DecryptString, string DecryptKey)
         {
             if (string.IsNullOrEmpty(DecryptString)) { throw (new Exception("密文不得为空")); }
             if (string.IsNullOrEmpty(DecryptKey)) { throw (new Exception("密钥不得为空")); }
             string m_strDecrypt = "";
             byte[] m_btIV = Convert.FromBase64String("Rkb4jvUy/ye7Cd7k89QQgQ==");
             Rijndael m_AESProvider = Rijndael.Create();
             try
             {
                 byte[] m_btDecryptString = Convert.FromBase64String(DecryptString);
                 MemoryStream m_stream = new MemoryStream();
                 CryptoStream m_csstream = new CryptoStream(m_stream, m_AESProvider.CreateDecryptor(Encoding.Default.GetBytes(DecryptKey), m_btIV), CryptoStreamMode.Write);
                 m_csstream.Write(m_btDecryptString, 0, m_btDecryptString.Length); m_csstream.FlushFinalBlock();
                 m_strDecrypt = Encoding.Default.GetString(m_stream.ToArray());
                 m_stream.Close(); m_stream.Dispose();
                 m_csstream.Close(); m_csstream.Dispose();
             }
             catch (IOException ex) { throw ex; }
             catch (CryptographicException ex) { throw ex; }
             catch (ArgumentException ex) { throw ex; }
             catch (Exception ex) { throw ex; }
             finally { m_AESProvider.Clear(); }
             return m_strDecrypt;
         }

    复制代码

    2、数据加密和解密简单代码调用如下: 

    Response.Write("<br>-----------MD5加密---------------<br>");        

    Response.Write(SDKSecurity.MD5Encrypt("仰天一笑"));
    Response.Write("<br>-----------DES加密---------------<br>");        

    Response.Write(SDKSecurity.DESEncrypt("仰天一笑", "anson-xu"));        

    Response.Write("<br>-----------DES解密---------------<br>");        

    Response.Write(SDKSecurity.DESDecrypt("l06JvJ45r/lb9iKzSXl47Q==", "anson-xu"));
    Response.Write("<br>-----------AES加密---------------<br>");    

    Response.Write(SDKSecurity.AESEncrypt("仰天一笑", "ansonxuyu"));        

    Response.Write("<br>-----------AES解密---------------<br>");        

    Response.Write(SDKSecurity.AESDecrypt("avwKL+MO8+zoLHvzk0+TBA==", "ansonxuyu"));

    3、数据加密和解密调用后运行效果图如下: 

    为系统而生,为框架而死,为debug奋斗一辈子; 吃符号的亏,上大小写的当,最后死在需求上。

    展开全文
  • 常用数据加密方式

    万次阅读 2016-09-17 10:52:13
    常用加密方式   Base64 Sha1(Secure Hash Algorithm) (非对称加密) Sha256(非对称加密) Sha512(非对称加密) MD5(Message Digest Algorithm 5)(非对称加密) RSA(非对称加密) DES(Data Encryption ...

    常用加密方式

     

    Base64

    Sha1(Secure Hash Algorithm) (非对称加密

    Sha256非对称加密

    Sha512非对称加密

    MD5(Message Digest Algorithm 5)非对称加密

    RSA非对称加密

    DES(Data Encryption Standard)(对称加密

    3DES(Triple DES)对称加密

    AES(Advanced Encryption Standard)对称加密

     

    .net 数据加密算法

    目前企业面临的计算环境和过去有很大的变化,许多数据资源能够依靠网络来远程存取,而且越来越多的通讯依赖于公共网络公共网络(如Internet),而这些环境并不保证实体间的安全通信,数据在传输过程可能被其它人读取或篡改。

    加密将防止数据被查看或修改,并在原本不安全的信道上提供安全的通信信道,它达到以下目的:

    ·        保密性:防止用户的标识或数据被读取。

    ·        数据完整性:防止数据被更改。

    ·        身份验证:确保数据发自特定的一方。

    一、数据加密/编码算法列表

    常见用于保证安全的加密或编码算法如下:

    1、常用密钥算法

    密钥算法用来对敏感数据、摘要、签名等信息进行加密,常用的密钥算法包括:

    ·        DES(DataEncryption Standard):数据加密标准,速度较快,适用于加密大量数据的场合;

    ·        3DES(TripleDES):是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高;

    ·        RC2和 RC4:用变长密钥对大量数据进行加密,比DES 快;

    ·        IDEA(InternationalData Encryption Algorithm)国际数据加密算法,使用128 位密钥提供非常强的安全性;

    ·        RSA:由RSA 公司发明,是一个支持变长密钥的公共密钥算法,需要加密的文件快的长度也是可变的;

    ·        DSA(DigitalSignature Algorithm):数字签名算法,是一种标准的DSS(数字签名标准);

    ·        AES(AdvancedEncryption Standard):高级加密标准,是下一代的加密算法标准,速度快,安全级别高,目前AES 标准的一个实现是Rijndael 算法;

    ·        BLOWFISH,它使用变长的密钥,长度可达448位,运行速度很快;

    ·        其它算法,如ElGamal、Deffie-Hellman、新型椭圆曲线算法ECC等。

    2、单向散列算法

    单向散列函数一般用于产生消息摘要,密钥加密等,常见的有:

    ·        MD5(MessageDigest Algorithm 5):是RSA数据安全公司开发的一种单向散列算法,MD5被广泛使用,可以用来把不同长度的数据块进行暗码运算成一个128位的数值;

    ·        SHA(SecureHash Algorithm)这是一种较新的散列算法,可以对任意长度的数据运算生成一个160位的数值;

    ·        MAC(MessageAuthentication Code):消息认证代码,是一种使用密钥的单向函数,可以用它们在系统上或用户之间认证文件或消息。HMAC(用于消息认证的密钥散列法)就是这种函数的一个例子。

    ·        CRC(CyclicRedundancy Check):循环冗余校验码,CRC校验由于实现简单,检错能力强,被广泛使用在各种数据校验应用中。占用系统资源少,用软硬件均能实现,是进行数据传 输差错检测地一种很好的手段(CRC并不是严格意义上的散列算法,但它的作用与散列算法大致相同,所以归于此类)。

    3、其它数据算法

    其它数据算法包括一些常用编码算法及其与明文(ASCII、Unicode等)转换等,如 Base 64Quoted PrintableEBCDIC等。

    二、算法的.NET 实现

    常见的加密和编码算法都已经在.NET Framework中得到了实现,为编码人员提供了极大的便利性,实现这些算法的名称空间是:System.Security.Cryptography。

    System.Security.Cryptography命名空间提供加密服务,包括安全的数据编码和解码,以及许多其他操作,例如散列法、随机数字生成和消息身份验证。

    System.Security.Cryptography是按如下方式组织的:

    1、私钥加密

    私钥加密又称为对称加密,因为同一密钥既用于加密又用于解密。私钥加密算法非常快(与公钥算法相比),特别适用于对较大的数据流执行加密转换。

    .NETFramework 提供以下实现私钥加密算法的类:

    ·        DES:DESCryptoServiceProvider

    ·        RC2:RC2CryptoServiceProvider

    ·        Rijndael(AES):RijndaelManaged

    ·        3DES:TripleDESCryptoServiceProvider

    2、公钥加密和数字签名

    公钥加密使用一个必须对未经授权的用户保密的私钥和一个可以对任何人公开的公钥。用公钥加密的数据只能用私钥解密,而用私钥签名的数据只能用公钥验证。公钥可以被任何人使用;该密钥用于加密要发送到私钥持有者的数据。两个密钥对于通信会话都是唯一的。公钥加密算法也称为不对称算法,原因是需要用一个密钥加密数据而需要用另一个密钥来解密数据。

    .NETFramework 提供以下实现公钥加密算法的类:

    ·        DSA:DSACryptoServiceProvider

    ·        RSA:RSACryptoServiceProvider

    3、哈希(Hash)值

    哈希算法将任意长度的二进制值映射为固定长度的较小二进制值,这个小的二进制值称为哈希值。哈希值是一 段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该段落的一个字母,随后的哈希都将产生不同的值。要找到散列为同一个值的两个不同的 输入,在计算上是不可能的,所以数据的哈希值可以检验数据的完整性。

    .NETFramework 提供以下实现数字签名算法的类:

    ·        HMAC:HMACSHA1(HMAC 为一种使用密钥的Hash 算法)

    ·        MAC:MACTripleDES

    ·        MD5:MD5CryptoServiceProvider

    ·        SHA1:SHA1Managed、SHA256Managed、SHA384Managed、SHA512Managed

    4、随机数生成

    加密密钥需要尽可能地随机,以便使生成的密钥很难再现,所以随机数生成是许多加密操作不可分割的组成部分。

    在.NET Framework 中,RNGCryptoServiceProvider是随机数生成器算法的实现,对于数据算法,.NETFramework 则在其它命名空间中实现,如Convert 类实现Base 64 编码,System.Text来实现编码方式的转换等。

           从以上来看,.NET Framework 对于数据加密/编码还是支持比较好,大大地方便了开发人员,但美中不足的是,.NET Framework 中的数据加密算法仍然不够完全,如 IDEABLOWFISH、其它算法,如ElGamalDeffie-HellmanECC 等,对于一些其它的数据校验算法支持也不够,如 CRCSFV 等,开发人员只能去从早期代码做移植或者寻找第三方厂商的实现。

     

    展开全文
  • 加密算法有哪些

    千次阅读 2021-04-20 12:10:25
    一、对称加密算法 1、DES 已破解,不再安全,基本没有企业在用了。...最常用的对称加密算法。 密钥建立时间短、灵敏性好、内存需求低(不管怎样,反正就是好)。 实际使用中,使用工作模式为 CTR(最好用 BC 去
  • PostgreSQL 数据安全之数据加密

    千次阅读 2021-09-01 10:23:17
    PostgreSQL 支持多个不同级别的灵活加密技术,包括密码加密、字段加密、存储加密、传输加密、认证加密以及应用加密,可以保护数据不因数据库服务器被盗、内部管理员或者不安全的网络传输而导致泄露。
  • DES:数据加密标准,速度较快,适用于加密大量数据的场合。 3DES:是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高。 AES:高级加密标准,是下一代的加密算法标准,速度快,安全级别高。 常见的非...
  • 常用js数据加密

    万次阅读 2019-11-21 11:20:27
    常用js数据加密 原生js已经支持base64加密及解密 //加密 window.btoa(this.shop) //解密 window.atob(this.shop)
  • 数据加密方法及原理介绍

    千次阅读 2020-02-04 19:14:31
    一、加密术语 1、加密 透过数学公式运算,使文件或数据模糊化,将容易识别的明文变成不可识 别的密文 ...二、加密方法 1、对称式加密 使用同一把密钥对数据进行加密和解密 ,又称对称密钥 (Symmetric Ke...
  • 数据加密技术是网络中最基本的安全技术,主要是通过对网络中传输的信息进行数据加密来保障其安全性,这是一种主动安全防御策略,用很小的代价即可为信息提供相当大的安全保护。 一、加密的基本概念  "加密",是...
  • 数据加密简介

    千次阅读 2022-03-19 21:49:05
    2022年3月开始接触加密接口测试,记录下常用数据加密方式 一、数据加密方式主要两种“对称加密”和“非对称加密” 1、对称式加密 对称式加密就是加密和解密使用同一个秘钥,通常称之为“Session Key”,这种加密...
  • PostgreSQL 数据加密之 pgcrypto

    千次阅读 热门讨论 2020-10-16 16:22:50
    PostgreSQL 扩展模块 pgcrypto 提供了单向加密算法 MD5、SHA、HMAC ,PGP 双向加密算法 Blowfish、AES、DES 等,可以用于实现数据加密和解密。本文介绍了这个模块的安装、函数的使用以及实际案例,包括用户密码...
  • 数据加密 加密原理: 把一帧需要发送的数据按位加上密码的每个字节,并且对密码字节做循环,然后保存回这一帧的数据包里面 示意图 代码实现 /****************************************************** * Function ...
  • 常见的加密算法有哪些

    千次阅读 2017-01-06 17:24:10
    1.MD5加密算法    MD5的全称是Message-Digest Algorithm 5,MD5可以将任意长度的“字节串”变换成一个128bit的大整数,并且它是一个不可逆的字符串变换算法,换句话说是,即使你看到源程序和算法描述,也无法将...
  • cocos2d-x 实现3种数据加密方法的源码

    热门讨论 2013-06-24 14:51:27
    cocos2d-x 实现3种数据加密MD5/SHA1/BASE64源码
  • 常用数据加密和解密方法汇总

    万次阅读 2015-06-18 15:35:48
    ASP.NET(C#)常用数据加密和解密方法汇总  一、 数据加密的概念 1、 基本概念 2、 基本功能 3、 加密形式  二、 数据加密的项目应用和学习 1、 媒体加密:DRM 2、 文件加密:文本加密、pdf、word 3、 数据...
  • 了解哪些常用加密算法?能简单介绍一种吗? 内推军P186 P192 1.分类 加密算法首先分为两种:单向加密、双向加密。 单向加密是不可逆的,也就是只能加密,不能解密。通常用来传输类似用户名和密码,直接将加密...
  • DES是一种分组数据加密技术(先将数据分成固定长度的小数据块,之后进行加密),速度较快,适用于大量数据加密,而3DES是一种基于DES的加密算法,使用3个不同密匙对同一个分组数据块进行3次加密,如此以使得密文强度...
  • Web常见数据加密方式

    千次阅读 2022-02-08 21:11:28
    MD5加密 ...这个摘要相当于四个长度为32个字节的数组,通常一个长度为64的十六进制字符串来表示,其中1个字节=8位,一个十六进制的字符的长度为4位。 进制加密   一般将字符串的ASCII码值转为十六
  • 简单实用的数据加密方法

    千次阅读 2018-03-15 18:42:35
    利用异或的这个特性可简单实现数据加密和解密算法。 构建加密加密 加密机实际上便是异或中的其中一个数,可以根据自己的需要随意构建。例如我可以构建如下加密机: const int EncodeMachine[10] = {0x01,0x...
  • Android中常用加密方式

    千次阅读 2021-12-08 15:32:16
    Android中常用加密方式 HmacSHA1 public static String getSignUtil(String key ,String base) { Log.i(TAG, "getSignUtil: GET SIGN"); String type = "HmacSHA1"; SecretKeySpec secret = new SecretKeySpec...
  • 数据常用加密方式

    千次阅读 2021-07-02 16:46:54
    数据常用加密方式 在日常设计及开发中,为确保数据传输和数据存储的安全,可通过特定的算法,将数据明文加密成复杂的密文。目前主流加密手段大致可分为单向加密和双向加密。 单向加密:通过对数据进行摘要计算生成...
  • 前端常用的几种加密方法

    千次阅读 2021-09-24 11:06:04
    MD5 加密后的位数两种:16 位与 32 位。默认使用32位。 (16 位实际上是从 32 位字符串中取中间的第 9 位到第 24 位的部分)为提高安全性。根据业务需求,可以对md5 添加偏移量。如对原有字符拼接指定位数的字符串...
  • 常用算法:MD5,SHA1 流程: 1:前端生成数据后按照约定方式生成一个sign 校验字段(一般通过MD5或者SHA1 方式),一并提交给后端; 2:后端获得参数后通过同样的方式生成sign 然后跟接口携带的sign对比是否一致,以此判断数据...
  • 常见加密算法有哪些?是否对称?

    千次阅读 2020-01-06 09:28:04
    常用的对称加密算法:DES、AES、3DES、RC2、RC4 常用的非对称加密算法:RSA、DSA、ECC 单向散列函数的加密算法:MD5、SHA 【Java面试题与答案】整理推荐 基础与语法 集合 网络编程 并发编程 Web 安全 ...
  • Java中常用加密方式(|)

    千次阅读 2020-07-30 17:18:06
    一、Java常用加密方式 Base64加密算法(编码方式) MD5加密(消息摘要算法,验证信息完整性) 对称加密算法 非对称加密算法 数字签名算法 数字证书 二、分类 按加密算法是否需要key被分为两类: 不基于key的: ...
  • Java中常用加密方式

    万次阅读 2017-12-28 14:27:22
    一、Java常用加密方式 Base64加密算法(编码方式) MD5加密(消息摘要算法,验证信息完整性) 对称加密算法 非对称加密算法 数字签名算法 数字证书 二、分类 按加密算法是否需要key被分为两类: 不基于key的: Base64...
  • 常用的对称加密算法

    千次阅读 2019-10-26 17:20:38
    文章目录`1、DES(Data Encryption ...由于其速度快,对称性加密通常在消息发送方需要加密大量数据时使用。对称性加密也称为密钥加密。 所谓对称,就是采用这种加密方法的双方使用方式用同样的密钥进行加密和解密...
  • 区块链常用加密算法

    千次阅读 2021-11-24 16:21:44
    这个公钥和私钥必须是一对的,如果用公钥对数据进行加密,那么只有使用对应的私钥才能解密,所以只要私钥不泄露,那么我们的数据就是安全的。 常用加密算法: 对称加密:DES、3DES、TDEA、Blo...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 747,930
精华内容 299,172
关键字:

常用的数据加密方法有哪些